使用 STATSMODELS 的一种方法 Anova

Posted

技术标签:

【中文标题】使用 STATSMODELS 的一种方法 Anova【英文标题】:One way Anova using STATSMODELS 【发布时间】:2020-12-19 01:35:04 【问题描述】:

我正在尝试在三组之间执行单向方差分析。我已经能够使用 SCIPY.STATS 获得 F 统计量和 F 分布的 p 值。但是,我的偏好是将 ANOVA 表作为具有平方和的 R 类输出。下面给出了我的 SCIPY.STATS 单向方差分析代码。 STATSMODELS ANOVA 的所有文档都使用 pandas 数据框。任何有关如何调整我现有的 STATSMODELS 代码的帮助将不胜感激。

import numpy as np
import pandas as pd
import scipy.stats as stats
from scipy.stats import f_oneway
data1= pd.read_table('/Users/Hrihaan/Desktop/Sample_A.txt', dtype=float, header=None, sep='\s+').values
data2= pd.read_table('/Users/Hrihaan/Desktop/Sample_B.txt', dtype=float, header=None, sep='\s+').values
data3= pd.read_table('/Users/Hrihaan/Desktop/Sample_C.txt', dtype=float, header=None, sep='\s+').values
Param_1=data1[:,0]
Param_2=data2[:,0]
Param_3=data3[:,0]
f_oneway(Param_1, Param_2, Param_3) 

【问题讨论】:

【参考方案1】:

你的数据可以是长格式的,首先我生成一些看起来像你的数据的东西:

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

np.random.seed(111)

Param_1=np.random.normal(0,1,50)
Param_2=np.random.normal(0,1,40)
Param_3=np.random.normal(0,1,30)

f_oneway(Param_1, Param_2, Param_3) 

F_onewayResult(statistic=0.43761348608371037, pvalue=0.6466275522246159)

您可以像下面那样制作长 data.frame,或者基本上在读入文件后制作它,然后执行 pd.concat:

df = pd.DataFrame('val':np.concatenate([Param_1,Param_2,Param_3]),
             'data':np.repeat(['A','B','C'],[len(Param_1),len(Param_2),len(Param_3)]))

df.head()

    val data
0   -1.133838   A
1   0.384319    A
2   1.496554    A
3   -0.355382   A
4   -0.787534   A

现在我们拟合一个线性模型,并对其进行方差分析:

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

mod = ols('val ~ data',data=df).fit()

sm.stats.anova_lm(mod, typ=1) 

          df    sum_sq  mean_sq F   PR(>F)
data    2.0 0.794858    0.397429    0.437613    0.646628
Residual    117.0   106.256352  0.908174    NaN NaN

【讨论】:

以上是关于使用 STATSMODELS 的一种方法 Anova的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Statsmodels 中获得稳健回归 (RLM) 的 R 平方?

动手实战 | Statsmodels 中经典的11种时间序列预测方法

忽略 Python 的 statsmodels 中的 NaN

logit 和 sklearn 管道的一种热编码

python statsmodels - 回归中的二次项

无法使用 statsmodels 库实现 Holt-Winters 方法