python - 在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。我对优势比的概念相对较新,我不确定如何使用费希尔检验和逻辑回归来获得相同的值,有什么区别以及哪种方法是在这种情况下获得优势比的正确方法。我会很感激任何提示。谢谢。
解决方案
简短的回答:
在这两种情况下,您都应该得到相同的优势比 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]]
要了解为什么这两种方法相同,请参见此处
推荐阅读
- android - apk 创建文件 MainActivity
- apostrophe-cms - ApostropheCMS - 为什么在管理栏中提交更改时收到错误消息?
- r - 在 purrr::map_dfr() 中使用 data.table 函数时,“eval 中的错误(bysub,x,parent.frame()):找不到对象 '.x'”
- mysql - 存储在 Mysql 中的 Node.js App Datetime 早于 UTC 时间
- algorithm - 项目在网格上的可重复随机放置
- javascript - EJS 模板不呈现任何数据
- c# - 如何基于涉及第一个元素的谓词转换可观察对象
- python - GluonCV - 量化姿态估计/目标检测模型
- ios - 拉动刷新顶部的白色间隙
- arrays - 交换数组的部分