【问题标题】:GLM R vs. PythonGLM R 与 Python
【发布时间】: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


【解决方案1】:

猜测他们在数值稳定性方面有不同的权衡。

v2 估计值的差异很大,这可能导致他们俩都在挣扎……我想说他们基本上给出了相同的答案,至少在双精度算术可用的限制范围内。

R 实现允许您传递control 参数:

> options(digits=12)
> model <- glm(v1 ~ v2, data=d, family="binomial", control=list(trace=T))
Deviance = 4.67724333758 Iterations - 1
Deviance = 4.5570420311 Iterations - 2
Deviance = 4.51971688994 Iterations - 3
Deviance = 4.50636401333 Iterations - 4
Deviance = 4.50150009179 Iterations - 5
Deviance = 4.49971718523 Iterations - 6
Deviance = 4.49906215541 Iterations - 7
Deviance = 4.49882130019 Iterations - 8
Deviance = 4.4987327103 Iterations - 9
Deviance = 4.49870012203 Iterations - 10
Deviance = 4.49868813377 Iterations - 11
Deviance = 4.49868372357 Iterations - 12
Deviance = 4.49868210116 Iterations - 13
Deviance = 4.4986815043 Iterations - 14
Deviance = 4.49868128473 Iterations - 15
Deviance = 4.49868120396 Iterations - 16
Deviance = 4.49868117424 Iterations - 17

这显示了它的收敛性,但我在 Python 代码中找不到类似的东西。

看到上面的输出表明他们也可以使用不同的截止值来确定收敛; R 使用epsilon = 1e-8

【讨论】:

  • 谢谢。这很有帮助。我应该澄清一下,我只是编造了数据。由于对 R 的无知,我一直在努力在 python 和 R 中制作相同的大型数据集,但在我使用的真实数据上看到了类似的结果。
  • 不同的实现将(几乎)总是给出不同的结果,上述v2 估计的差异小于(估计的)标准偏差的0.1%。 “真实数据上的相似结果”是什么意思
  • 看起来很合理。我有大约 80K 行,并且看到了 50%+ 不同的截距。我很愿意接受我错误地解释它们的可能性。我将尝试使用代表我自己的更大数据来重现我的示例。
  • 您想要比较系数估计值及其标准误。我只希望这种影响对于 z 分数接近 0 / p 值接近 1 的系数会很明显
猜你喜欢
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多