【问题标题】:One-way Anova loop through pandas dataframe - results in a single table通过 pandas 数据帧的单向 Anova 循环 - 生成一个表
【发布时间】:2020-01-06 21:11:25
【问题描述】:

我有一个包含 16 列的 pandas 数据框,其中 14 列代表我使用 statsmodels 执行循环 Anova 测试的变量。我的数据框看起来像这样(简化):

ID    Cycle_duration    Average_support_phase    Average_swing_phase    Label
1               23.1                     34.3                   47.2        1
2               27.3                     38.4                   49.5        1
3               25.8                     31.1                   45.7        1
4               24.5                     35.6                   41.9        1
...

到目前为止,这就是我正在做的事情:

import pandas as pd
import statsmodels.api as sm
from statsmodels.formula.api import ols

df = pd.read_csv('features_total.csv')

for variable in df.columns:
    model = ols('{} ~ Label'.format(variable), data=df).fit()
    anova_table = sm.stats.anova_lm(model, typ=2)
    print(anova_table)

产量:

    sum_sq    df         F    PR(>F)
Label     0.124927   2.0  2.561424  0.084312
Residual  1.731424  71.0       NaN       NaN
              sum_sq    df         F    PR(>F)
Label      62.626057   2.0  4.969491  0.009552
Residual  447.374788  71.0       NaN       NaN
              sum_sq    df         F    PR(>F)
Label      62.626057   2.0  4.969491  0.009552
Residual  447.374788  71.0       NaN       NaN

我正在为执行 Anova 的每个变量获取单独的表格打印。基本上我想要的是打印一个带有汇总结果的表格,或者像这样:

                             sum_sq     df         F    PR(>F)
          Cycle_duration   0.1249270   2.0  2.561424  0.084312
                Residual   1.7314240  71.0       NaN       NaN
   Average_support_phase   62.626057   2.0  4.969491  0.009552
                Residual  447.374788  71.0       NaN       NaN
     Average_swing_phase   62.626057   2.0  4.969491  0.009552
                Residual  447.374788  71.0       NaN       NaN

我已经看到了一个问题,因为这个方法总是在实际值之前输出“标签”命名法,而不是有问题的变量名(就像我上面显示的那样,我希望每个变量名都在上面剩余的')。 statsmodels 方法甚至可以做到这一点吗?

我对 python 还很陌生,如果这与 statsmodels 无关,请原谅 - 在这种情况下,请说明我应该尝试什么。

【问题讨论】:

    标签: python pandas statsmodels anova


    【解决方案1】:

    您可以收集表格并在循环结束时将它们连接起来。这种方法将创建一个分层索引,但我认为这样会更清楚一点。像这样的:

    keys = []
    tables = []
    for variable in df.columns:
        model = ols('{} ~ Label'.format(variable), data=df).fit()
        anova_table = sm.stats.anova_lm(model, typ=2)
    
        keys.append(variable)
        tables.append(anova_table)
    
    df_anova = pd.concat(tables, keys=keys, axis=0)
    

    有点相关,我还建议纠正多重比较。这更像是一个统计建议而不是编码建议,但考虑到您正在执行大量统计测试,考虑其中一项测试导致误报的概率是有意义的。

    【讨论】:

    • 非常感谢,这正是我想要的!至于您的建议,您是指事后测试吗?我现在也在尝试从 statsmodels 运行 Tukey HSD,就像我为 Anova 所做的那样,并试图以某种方式创建一个循环来自动化分析。最后,我想将 Tukey HSD 结果添加到您刚刚帮助我的表格中。
    • 不完全是。 TukeyHSD 将考虑每个单独 ANOVA 中每个组(标签)之间的比较。我指的是您正在执行的多个 ANOVA 测试。不过,这在很大程度上可能取决于您的设置和实际的实验问题。您可以在Cross Validated 网站上找到更多信息。我确信有很多帖子与此相关。
    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2022-01-04
    相关资源
    最近更新 更多