【问题标题】:A Better Way to Calculate Odd Ratio in Pandas一种计算 Pandas 奇数比的更好方法
【发布时间】:2017-09-01 20:55:18
【问题描述】:

我有一个数据框 counts1,它看起来像:

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

我想计算优势比(w-statin/wo-statin)。我像在纸上那样做旧风格:

counts1['sumwwoStatin']= counts1['w-statin']+counts1['wo-statin']

counts1['oddRatio']=((counts1['w-statin']/counts1['sumwwoStatin'])/(counts1['wo-statin']/counts1['sumwwoStatin']))

有没有更好的方法来计算 Pandas 中的优势比、相对风险、列联表和卡方检验,就像在 R 中一样?任何建议表示赞赏。哦对了,我忘了说我的 csv 是什么样子的:

    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
..

【问题讨论】:

  • 一个附带问题:“就像在 R 中一样” - 这意味着如何? (那里更容易吗?)

标签: python pandas


【解决方案1】:

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】:

    我不知道如何在 Pandas 中执行此操作...但是,您可以通过首先使用 scikit-learn 库找到相应的 beta 来计算 Python 中逻辑回归模型的优势比值,此处描述:

    How to find beta values in Logistic Regression model with sklearn

    本主题介绍了如何从逻辑回归模型中生成和提取 Beta 系数。然后,您可以通过使用 Python 的 NumPy 包中的 exp() 函数对 Beta 值求幂来计算优势比。以这种方式计算的优势比将等同于 R 使用 glm() 函数提供的优势比,指定二项式分布。

    【讨论】:

      【解决方案3】:

      AFAIK pandas 不提供统计计算和测试,除了均值、方差、相关性等基本矩...

      但是,您可以依靠 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
      

      请参阅herehere 了解更多信息。

      【讨论】:

      • 太棒了!谢谢 :) .. 我只是想知道这是否可能。
      • 真正的远景,因为这是一个旧帖子,但是如果你得到一个 0.0 的 P 值会发生什么?如果我用计算器计算,我得到
      • @ScoutEU 如果我在特征选择的上下文中谈论...如果 p
      • 感谢分享这个解决方案。是否可以打印相对风险而不是优势比?谢谢
      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 2011-11-22
      • 2019-08-13
      相关资源
      最近更新 更多