通过 pandas 数据帧的单向方差分析循环 - 产生单个 table
One-way Anova loop through pandas dataframe - results in a single table
我有一个包含 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 的每个变量获取单独的 table 打印。基本上我想要的是打印一张带有汇总结果的 table,或者像这样的东西:
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
我已经可以看出一个问题,因为此方法总是在实际值之前输出 'Label' 命名法,而不是相关变量名(就像我在上面显示的那样,我想要变量每个名字上面 'residual')。 statsmodels
方法甚至可以做到这一点吗?
我是 python 的新手,如果这与 statsmodels 无关,请原谅 - 在这种情况下,请向我说明我应该尝试什么。
您可以收集表格并在循环结束时将它们连接起来。此方法将创建一个分层索引,但我认为这使它更清晰一些。像这样:
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)
有点相关,我还建议更正多重比较。这与其说是编码建议,不如说是统计建议,但考虑到您正在执行大量统计测试,考虑其中一项测试导致误报的可能性是有意义的。
我有一个包含 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 的每个变量获取单独的 table 打印。基本上我想要的是打印一张带有汇总结果的 table,或者像这样的东西:
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
我已经可以看出一个问题,因为此方法总是在实际值之前输出 'Label' 命名法,而不是相关变量名(就像我在上面显示的那样,我想要变量每个名字上面 'residual')。 statsmodels
方法甚至可以做到这一点吗?
我是 python 的新手,如果这与 statsmodels 无关,请原谅 - 在这种情况下,请向我说明我应该尝试什么。
您可以收集表格并在循环结束时将它们连接起来。此方法将创建一个分层索引,但我认为这使它更清晰一些。像这样:
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)
有点相关,我还建议更正多重比较。这与其说是编码建议,不如说是统计建议,但考虑到您正在执行大量统计测试,考虑其中一项测试导致误报的可能性是有意义的。