首页 > 解决方案 > 在python中计算优势比

问题描述

在此处此处在线查看我看到有两种方法可以在 python 中估计优势比,但结果不同。

第一种方式:

import scipy.stats as stats
import pandas as pd
df=pd.DataFrame({'c':['m','m','m','m','f','f','f','f'],'l':[1,1,1,0,0,0,0,1]})
ct=pd.crosstab(df.c,df.l)
oddsratio, pvalue = stats.fisher_exact(ct)

第二种方式:

from sklearn.linear_model import LogisticRegression
df=pd.get_dummies(df,drop_first=True)
clf = LogisticRegression()
clf.fit(df[['c_m']],df[['l']].values)
odds_ratio=np.exp(clf.coef_)

第一种方法返回优势比=9,第二种方法返回优势比=1.9。我对优势比的概念相对较新,我不确定如何使用费希尔检验和逻辑回归来获得相同的值,有什么区别以及哪种方法是在这种情况下获得优势比的正确方法。我会很感激任何提示。谢谢。

标签: pythonlogistic-regressionscipy.stats

解决方案


简短的回答:

在这两种情况下,您都应该得到相同的优势比 9。

默认情况下,sklearn 逻辑回归模型中的惩罚是'L2',它会扭曲系数的值(正则化),所以如果你使用 penality='none,你会得到相同的匹配优势比。

所以改为

clf = LogisticRegression(penalty='none')

并计算odds_ratio

长答案:

在第一种情况下,奇数比是先验优势比,由列联/交叉表计算得出,计算如下所示

df 的列联表将是

    l   0   1
c       
f       3   1
m       1   3

优势比 = f 为 0 的几率 / m 为 0 的几率

f 为 0 的几率 = P(f=0)/P(f=1) = (3/4) / (1/4)

m 为 0 的几率 = P(m=0)/P(m=1) = (1/4) / (3/4)

优势比 = ((3/4)/(1/4)) / ((1/4)/(3/4)) = 9

在第二种情况下,您通过拟合逻辑回归模型获得优势比的估计值。如果您使用 penality = 'none',您将得到优势比 = 9。默认情况下,逻辑回归估计器中的惩罚是“L2”。

from sklearn.linear_model import LogisticRegression
df=pd.get_dummies(df,drop_first=True)
clf = LogisticRegression(penalty='none')
clf.fit(df[['c_m']],df[['l']].values)
odds_ratio=np.exp(clf.coef_)

print(odd_ratio)

array([[9.0004094]])

您也可以通过另一种方法获得优势比,这也会导致相同的优势比。看

#Method 2: 
odds_of_yis_1_for_female = np.exp(clf.intercept_+clf.coef_*1) #logit for female
odds_of_yis_1_for_male = np.exp(clf.intercept_+clf.coef_*0) # logit for male
odds_ratio_2 = odds_of_yis_1_for_female/odds_of_yis_1_for_male
print(odds_ratio_2)

[[9.0004094]]

要了解为什么这两种方法相同,请参见此处


推荐阅读