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相同的结果?
您只需要将参考人群设置为男性或女性即可(取决于您感兴趣的内容):
在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
。无论哪种方式,这只是明确指出哪个组用作参考的问题。