I have a dataframe counts1 which looks like:
Factor w-statin wo-statin
AgeGroups Cancer
0-5 No 108 6575
Yes 0 223
11-15 No 5 3669
Yes 1 143
16-20 No 28 6174
Yes 1 395
21-25 No 80 8173
Yes 2 624
26-30 No 110 9143
Yes 2 968
30-35 No 171 9046
Yes 5 1225
35-40 No 338 8883
Yes 21 1475
I wanted to calculate the oddsratio (w-statin/wo-statin). I did it old style like I would do it in paper:
counts1['sumwwoStatin']= counts1['w-statin']+counts1['wo-statin']
counts1['oddRatio']=((counts1['w-statin']/counts1['sumwwoStatin'])/(counts1['wo-statin']/counts1['sumwwoStatin']))
Is there a better way to calculate Odds-ratio, Relative risk, Contigency Table, & Chi-Square Tests in Pandas, just like in R? Any suggestions are appreciated. Oh by the way, I forgot to mention how my csv looks like:
Frequency Cancer Factor AgeGroups
0 223 Yes wo-statin 0-5
1 112 Yes wo-statin 6-10
2 143 Yes wo-statin 11-15
3 395 Yes wo-statin 16-20
4 624 Yes wo-statin 21-25
5 968 Yes wo-statin 26-30
6 1225 Yes wo-statin 30-35
7 1475 Yes wo-statin 35-40
8 2533 Yes wo-statin 41-45
9 4268 Yes wo-statin 46-50
10 5631 Yes wo-statin 52-55
11 6656 Yes wo-statin 56-60
12 7166 Yes wo-statin 61-65
13 8573 Yes wo-statin 66-70
14 8218 Yes wo-statin 71-75
15 4614 Yes wo-statin 76-80
16 1869 Yes wo-statin 81-85
17 699 Yes wo-statin 86-90
18 157 Yes wo-statin 91-95
19 31 Yes wo-statin 96-100
20 5 Yes wo-statin >100
21 108 No w-statin 0-5
22 6 No w-statin 6-10
23 5 No w-statin 11-15
24 28 No w-statin 16-20
25 80 No w-statin 21-25
26 110 No w-statin 26-30
27 171 No w-statin 30-35
28 338 No w-statin 35-40
29 782 No w-statin 41-45
..
答案 0 :(得分:5)
AFAIK熊猫不提供统计计算和测试,除了基本时刻,如均值,方差,相关等...
但是,您可以依赖scipy
来满足此要求。你会发现你需要的大部分内容。例如,计算优势比:
import scipy.stats as stats
table = df.groupby(level="Cancer").sum().values
print(table)
>>> array([[ 840, 51663],
[ 32, 5053]])
oddsratio, pvalue = stats.fisher_exact(table)
print("OddsR: ", oddsratio, "p-Value:", pvalue)
>>> OddsR: 2.56743220487 p-Value: 2.72418938361e-09
答案 1 :(得分:2)
statsmodels
可用于估计优势比,如果两个变量都已经是同一 Pandas 数据框的一部分:
import statsmodels.api as sm
table = sm.stats.Table.from_data(df[['w-statin','wo-statin']])
rslt = table.test_nominal_association()
print(table.local_oddsratios)
print( rslt.pvalue )
答案 2 :(得分:0)
我不知道在Pandas中执行此操作的方法...但是,您可以通过首先使用scikit-learn库找到相应的beta来计算Python中逻辑回归模型的优势比值,如下所述:
How to find beta values in Logistic Regression model with sklearn
该线程描述了如何从逻辑回归模型生成和提取Beta系数。然后,您可以使用Python NumPy包中的exp()函数对Beta值取幂,从而计算出优势比。以这种方式计算出的几率将等于R通过glm()函数提供的几率,指定二项式分布。