通过熊猫数据框的单向Anova循环-生成单个表

时间:2019-09-04 01:50:08

标签: python pandas statsmodels anova

我有一个熊猫数据框,其中包含16列,其中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没有关系,请原谅我-在这种情况下,请向我说明我应该尝试的方法。

1 个答案:

答案 0 :(得分: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)

有些相关,我也建议更正多个比较。与编码建议相比,这更是一种统计建议,但是考虑到您正在执行大量统计测试,因此考虑到其中一项测试会导致假阳性的可能性就很有意义。