Python Statsmodels泊松glm不同于R

Python Statsmodels泊松glm不同于R,python,r,glm,statsmodels,poisson,Python,R,Glm,Statsmodels,Poisson,我正试图根据R中提供的一些代码来拟合一些模型(空间交互模型)。我已经能够在python框架中使用statsmodels来获得一些代码,但其中一些根本不匹配。我相信我为R和Python编写的代码应该给出相同的结果。有人看到什么不同吗?或者是有一些根本性的差异,可能会把事情抛在脑后?R代码是与教程中给出的数字匹配的原始代码(可在此处找到:) R示例代码: library(mosaic) Data = fetchData('http://dl.dropbox.com/u/8649795/AT_Aust

我正试图根据R中提供的一些代码来拟合一些模型(空间交互模型)。我已经能够在python框架中使用statsmodels来获得一些代码,但其中一些根本不匹配。我相信我为R和Python编写的代码应该给出相同的结果。有人看到什么不同吗?或者是有一些根本性的差异,可能会把事情抛在脑后?R代码是与教程中给出的数字匹配的原始代码(可在此处找到:)

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

在statsmodels中,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']

我不确定R^2对于非线性模型是否有意义。我想,你可以用偏离解释与零偏离的比率来计算类似的东西。或者对于GLMs,您可以研究R^2的替代品。感谢您的回复。从我所读到的,这些模型通常使用几种不同的方法来检查它们的适合性,并且不完全依赖R^2。这就是说,这两个人的关系如此严重肯定是有原因的。“Dij”变量有时可以解释为log(“Dij”),在这种情况下,我已经能够在R和python+statsmodelsWell中使用相同的代码拟合所有感兴趣的模型,您检查过拟合是否相同吗?比较两个软件中的安装值。做一些模型检查。对于困难的数据,有时算法可能无法很好地工作,可能需要一些哄骗等。您似乎已经从拟合模型转到检查一些可疑的汇总统计数据,而没有检查实际拟合是否相同。首先,只需查看系数(并确保您知道有什么尺度),Python中的拟合值是响应尺度还是链接函数尺度?R是响应的尺度。事实上,我同意,从拟合一个模型跳到一个可疑的汇总统计是没有帮助的。我知道拟合值或模型系数在R代码和Python代码之间都不匹配。当我使用完全相同的代码,但将模型公式更改为“Data~Origin+Destination+log(Dij)”时,我得到了匹配的R平方值、匹配的拟合值以及两个框架之间的匹配系数。当我使用“Dij”作为变量时,不使用log,没有匹配,尽管我一直认为R代码是正确的,因为它来自一份工作文件中的一个示例,它们应该表示零值,因此实际上几乎等于零。这解决了这个问题…python处理这些值的方式似乎与R不同,因此用稍微大一点的1.0^-25 say替换将得到预期的模型结果。我提交了一份错误报告,以了解statsmodels GLM中到底发生了什么。