【发布时间】:2019-04-11 09:19:36
【问题描述】:
我正在尝试在 Python 中生成一个逻辑回归,它产生与 R 相同的结果。它看起来很接近,但并不相同。我编写了以下示例来说明存在差异。数据不真实。
R
# RStudio 1.1.453
d <- data.frame(c(0, 0, 1, 1, 1),
c(1, 0, 0, 0, 0),
c(0, 1, 0, 0, 0))
colnames(d) <- c("v1", "v2", "v3")
model <- glm(v1 ~ v2,
data = d,
family = "binomial")
summary(model)
R 输出
Call:
glm(formula = v1 ~ v2, family = "binomial", data = d)
Deviance Residuals:
1 2 3 4 5
-1.66511 -0.00013 0.75853 0.75853 0.75853
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.099 1.155 0.951 0.341
v2 -19.665 6522.639 -0.003 0.998
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 6.7301 on 4 degrees of freedom
Residual deviance: 4.4987 on 3 degrees of freedom
AIC: 8.4987
Number of Fisher Scoring iterations: 17
Python
# Python 3.7.1
import pandas as pd # 0.23.4
import statsmodels.api as sm # 0.9.0
import statsmodels.formula.api as smf # 0.9.0
d = pd.DataFrame({"v1" : [0, 0, 1, 1, 1],
"v2" : [1, 0, 0, 0, 0],
"v3" : [0, 1, 0, 0, 0]})
model = smf.glm(formula = "v1 ~ v2",
family=sm.families.Binomial(link = sm.genmod.families.links.logit),
data=d
).fit()
model.summary()
Python 输出
Generalized Linear Model Regression Results
==============================================================================
Dep. Variable: v1 No. Observations: 5
Model: GLM Df Residuals: 3
Model Family: Binomial Df Model: 1
Link Function: logit Scale: 1.0000
Method: IRLS Log-Likelihood: -2.2493
Date: Wed, 07 Nov 2018 Deviance: 4.4987
Time: 15:17:52 Pearson chi2: 4.00
No. Iterations: 19 Covariance Type: nonrobust
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 1.0986 1.155 0.951 0.341 -1.165 3.362
v2 -21.6647 1.77e+04 -0.001 0.999 -3.48e+04 3.47e+04
==============================================================================
迭代次数存在差异。据我所知,两者之间可能存在一些收敛方法,但我不明白。是否还有其他一些我可能遗漏的设置?
【问题讨论】:
-
鉴于您在 v2 中只有五个数据点和一个非零值,我很惊讶这两个系统都没有发出某种错误。那里没有很多信息。如果你使用更大的数据集和更多的数据来做这件事,你会发现即使不完美,也很接近。
-
您有足够小的数据,您可以手动计算对数似然并自己查看。这是一个图表desmos.com/calculator/2vnvch2akx。估计该函数的最大值不会收敛,因为当你向左走时,图表很快就会变平,但会不断增加。他们对何时停止有不同的想法。 SE 如此之大的事实意味着该区域的对数似然几乎完全平坦,这暗示了收敛问题。
-
我是在我自己的一个更大的数据集上做的,但为了使其可验证而编造了这个。结果仍然相去甚远,尤其是在与多个变量进行比较时。
-
同样的想法,对数似然的曲率和标准误差是负相关的,所以如果你看到一个具有高标准误差的估计值,这意味着该区域周围的似然函数非常平坦,这意味着即使收敛截止点的微小差异也会产生非常不同的估计。在任何情况下,估算值都不可靠,因此您不应该使用它们。
-
这是少数几个 SAS 优于 R 和 Python 的地方之一。刚刚尝试在 SAS 中使用 PROC LOGISTIC 运行它并得到正确的警告:“模型收敛状态:检测到数据点的准完全分离。最大似然估计可能不存在。”(如图所示,有函数确实没有最大值)。对于“什么是准完全分离?”见stats.idre.ucla.edu/other/mult-pkg/faq/general/…
标签: python r regression logistic-regression