gpt4 book ai didi

python - Statsmodels Poisson glm 与 R 不同

转载 作者:行者123 更新时间:2023-11-28 16:39:16 25 4
gpt4 key购买 nike

我正在尝试根据 R 中提供的一些代码来拟合一些模型(空间交互模型)。我已经能够使用 python 框架中的 statsmodels 使一些代码工作,但其中一些不匹配根本。我相信我为 R 和 Python 编写的代码应该会给出相同的结果。有没有人看到任何差异?或者是否存在一些可能会导致失败的根本差异? R 代码是与教程中给出的数字相匹配的原始代码(在此处找到:http://www.bartlett.ucl.ac.uk/casa/pdf/paper181)。

R示例代码:

library(mosaic)
Data = fetchData('http://dl.dropbox.com/u/8649795/AT_Austria.csv')
Model = glm(Data~Origin+Destination+Dij+offset(log(Offset)), family=poisson(link="log"), data = Data)
cor = cor(Data$Data, Model$fitted, method = "pearson", use = "complete")
rsquared = cor * cor
rsquared

R输出:

> Model = glm(Data~Origin+Destination+Dij+offset(log(Offset)), family=poisson(link="log"), data = Data)
Warning messages:
1: glm.fit: fitted rates numerically 0 occurred
2: glm.fit: fitted rates numerically 0 occurred
> cor = cor(Data$Data, Model$fitted, method = "pearson", use = "complete")
> rsquared = cor * cor
> rsquared
[1] 0.9753279

Python 代码:

import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
from scipy.stats.stats import pearsonr

Data= pd.DataFrame(pd.read_csv('http://dl.dropbox.com/u/8649795/AT_Austria.csv'))
Model = smf.glm('Data~Origin+Destination+Dij', data=Data, offset=np.log(Data['Offset']), family=sm.families.Poisson(link=sm.families.links.log)).fit()

cor = pearsonr(doubleConstrained.fittedvalues, Data["Data"])[0]

print "R-squared for doubly-constrained model is: " + str(cor*cor)

Python 输出:

R-squared for doubly-constrained model is: 0.104758481123

最佳答案

看起来 GLM 在统计模型中存在收敛问题。也许在 R 中也是如此,但 R 只给出这些警告。

Warning messages:
1: glm.fit: fitted rates numerically 0 occurred
2: glm.fit: fitted rates numerically 0 occurred

这可能意味着 Logit/Probit 上下文中的完美分离。对于泊松模型,我必须考虑它。

R 做得更好,虽然很微妙,但它会告诉您您的验配可能有问题。例如,如果您查看 statsmodels 中的拟合似然,则为 -1.12e27。这应该是有问题的线索。

直接使用泊松模型(在可能的情况下,我总是更喜欢最大似然法而不是 GLM),我可以复制 R 结果(但我收到收敛警告)。值得注意的是,默认的 newton-raphson 求解器失败了,所以我使用 bfgs。

import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm
from scipy.stats.stats import pearsonr

data= pd.DataFrame(pd.read_csv('http://dl.dropbox.com/u/8649795/AT_Austria.csv'))

mod = smf.poisson('Data~Origin+Destination+Dij', data=data, offset=np.log(data['Offset'])).fit(method='bfgs')

print mod.mle_retvals['converged']

关于python - Statsmodels Poisson glm 与 R 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21785049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com