stats.f_oneway Scipy Anova返回具有4个值的2个数组

时间:2019-07-18 02:47:47

标签: python pandas scipy statistics anova

尝试对看起来像这样的数据运行方差分析的一种方式:

Year   | Diversity  |
2010   |   6        |
2010   |   8        |
...    |   ...      |
2011   |   10       |
...    |   ...      |
2019   |   7        |

每年有1827行,各个点的多样性值。我正在逐年比较差异。当我这样做

F, p = stats.f_oneway(df.loc[df["Year"] == 2010],
               df.loc[df["Year"] == 2011],
               df.loc[df["Year"] == 2012])

(这里我省略了其余的组,因为这很丑陋,但我不知道如何通过其他组进行Anova测试)。我得到一个数组,每个数组的F和p都有2个值:

F: type float64, size (2,),
-2.588805281700000000e+11, 4.908743340532151223e+00
p: type float64, size (2,),
nan, 0.00774507

从我的阅读中,我找不到任何人得到2个数组,它应该只是一个F值和一个P值,我在做严重错误的事情吗? (df中没有零或NAN)。

当我这样做时:

mod = ols('Diversity ~ (Year)', data = df).fit()
mod.summary()

我得到一个普通的汇总表,F = 1.462,p = 0.227(与我上面的尝试不同)。

任何关于我的烂摊子的想法将不胜感激...

1 个答案:

答案 0 :(得分:1)

您的DataFrame即使在切片后也有2列,因此您将返回2个p值和2个F值,其中一个用于比较样本中的每一列。您应该更改每个选择,使其仅包括'Diversity'列,例如:

df.loc[df['Year'] == 2010, 'Diversity']

如果您只想对样本中的所有年份进行多元方差分析,则可以使用以下方法紧凑地做到这一点:

stats.f_oneway(*[s for idx, s in df.groupby('Year').Diversity])

MCVE

import pandas as pd
import numpy as np
from scipy import stats

l = [pd.DataFrame(np.random.randint(1, 10, (50, 4))) for i in range(7)]
                                              # |
                                              # 4 cols, should get 4 p-vals/F-vals

stats.f_oneway(*l)
#F_onewayResult(statistic=array([0.70527759, 0.2291319 , 0.03545031, 0.02568242]), 
#                  pvalue=array([0.49563511, 0.79550711, 0.96517894, 0.97464894]))
                               #    col1         col2        col3       col4
相关问题