计算 python 中的比值比

calculating odds ratio in python

and 中在线查看,我看到 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_)

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

简答:

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

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

所以改为

clf = LogisticRegression(penalty='none')

并计算odds_ratio

长答案:

在第一种情况下,Odd's ratio 是先验比值比,由 contingency/crosstabulation table 计算得出,如下所示

df 的意外事件 table 为

    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',你将得到 odds ratio = 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]]

要了解为什么这两种方法相同,请参阅 here