python vs R中的glm

use*_*473 4 python statistics regression r statsmodels

我有一些数据集:titanic

在R中这样做

glm(Survived ~ Sex, titanic, family = "binomial")

我懂了

(Intercept)     SexMale 
1.124321   -2.477825
Run Code Online (Sandbox Code Playgroud)

R以幸存为阳性。

但是当我在Python中做同样的事情时

sm.formula.glm("Survived ~ Sex", family=sm.families.Binomial(), data=titanic).fit()

我得到负面结果:即Python 不能幸免为正面结果。

如何调整Python的glm函数行为,使其返回与R相同的结果?

Sim*_*mon 7

您只需要将参考人群设置为男性或女性即可(取决于您感兴趣的内容):

在R中有一个小的测试数据集,代码和模型摘要如下所示:

df <- data.frame(c(0,0,1,1,0), c("Male", "Female", "Female", "Male", "Male"))
colnames(df) <- c("Survived", "Sex")

model <- glm(Survived ~ Sex, data=df, family="binomial")
summary(model)
Run Code Online (Sandbox Code Playgroud)

输出:

Coefficients:
              Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.084e-16  1.414e+00   0.000    1.000
SexMale     -6.931e-01  1.871e+00  -0.371    0.711
Run Code Online (Sandbox Code Playgroud)

要在Python / statsmodels中获得类似的结果:

import pandas as pd
import statsmodels.api as sm

df = pd.DataFrame({"Survived": [0,0,1,1,0],
                   "Sex": ["Male", "Female", "Female", "Male", "Male"]})

model = sm.formula.glm("Survived ~ C(Sex, Treatment(reference='Female'))",
                       family=sm.families.Binomial(), data=df).fit()
print(model.summary())
Run Code Online (Sandbox Code Playgroud)

这将给:

                                                    coef    std err          z      P>|z|      [0.025      0.975]
-----------------------------------------------------------------------------------------------------------------
Intercept                                      5.551e-16      1.414   3.93e-16      1.000      -2.772       2.772
C(Sex, Treatment(reference='Female'))[T.Male]    -0.6931      1.871     -0.371      0.711      -4.360       2.974
Run Code Online (Sandbox Code Playgroud)

请注意使用Treatment()来设置参考组。Female在这种情况下,我将其设置为与R输出匹配,但是对于您的数据集,使用可能更有意义Male。无论哪种方式,这只是明确指出哪个组用作参考的问题。