【问题标题】:ANOVA in python using pandas dataframe with statsmodels or scipy?python中的ANOVA使用带有statsmodels或scipy的pandas数据框?
【发布时间】:2014-10-21 15:25:43
【问题描述】:

我想使用 Pandas 数据框来分解一个变量的方差。

例如,如果我有一个名为“Degrees”的列,并且我为不同的日期、城市和夜晚与白天编制了索引,我想找出这个系列中的变化有多少来自交叉- 部分城市变化,有多少来自时间序列变化,有多少来自夜间与白天。

在 Stata 中,我会使用固定效果并查看 R^2。希望我的问题有意义。

基本上,我想做的是通过其他三列找到“度数”的方差分析细分。

【问题讨论】:

  • 你会想要查看 scipy 或 statsmodels(我刚刚添加了这些标签,等待批准)
  • 简而言之,statsmodels 类似于stata 的统计部分(而pandas 是数据管理部分)。
  • 还有什么更具体的:) ?
  • 巧合的是,我偶然发现了使用 pandas 和 statsmodels 的 o'reilley 书“think stats”。免费在线版本:greenteapress.com/thinkstats2/html/index.html
  • 有一个完整的代码示例,在statsmodels.sourceforge.net/devel/anova.html处有一个方差分析表和残差。

标签: python pandas scipy statsmodels anova


【解决方案1】:

我设置了一个直接比较来测试它们,发现它们的假设可以differ slightly,得到了统计学家的提示,这里是一个匹配 R 的结果的 pandas 数据帧上的 ANOVA 示例:

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


# R code on R sample dataset

#> anova(with(ChickWeight, lm(weight ~ Time + Diet)))
#Analysis of Variance Table
#
#Response: weight
#           Df  Sum Sq Mean Sq  F value    Pr(>F)
#Time        1 2042344 2042344 1576.460 < 2.2e-16 ***
#Diet        3  129876   43292   33.417 < 2.2e-16 ***
#Residuals 573  742336    1296
#write.csv(file='ChickWeight.csv', x=ChickWeight, row.names=F)

cw = pd.read_csv('ChickWeight.csv')

cw_lm=ols('weight ~ Time + C(Diet)', data=cw).fit() #Specify C for Categorical
print(sm.stats.anova_lm(cw_lm, typ=2))
#                  sum_sq   df            F         PR(>F)
#C(Diet)    129876.056995    3    33.416570   6.473189e-20
#Time      2016357.148493    1  1556.400956  1.803038e-165
#Residual   742336.119560  573          NaN            NaN

【讨论】:

  • 但这不是方差分析测试。这是一个线性模型系数分析。
猜你喜欢
  • 2017-10-30
  • 2020-12-19
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多