为什么R和statsmodels给出的ANOVA结果略有不同?

5
使用小型的R样本数据集和statsmodels中的ANOVA示例,其中一个变量的自由度报告方式不同,并且F值结果也略有不同。也许它们有稍微不同的默认方法?我能否设置statsmodels以使用R的默认设置?
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 + Diet', data=cw).fit()   

print(sm.stats.anova_lm(cw_lm, typ=2))
#                  sum_sq   df            F         PR(>F)
#Time      2024187.608511    1  1523.368567  9.008821e-164
#Diet       108176.538530    1    81.411791   2.730843e-18
#Residual   764035.638024  575          NaN            NaN

数据集的开头和结尾相同,还需计算重量和时间的均值、最小值、最大值和中位数。*(原文未明确此处的“the same”指什么)

这个例子使用了哪些版本的statsmodels和pandas?我在pandas 0.18.0,statsmodels 0.6.1中使用anova_lm函数时出现了错误。 - Alex Hasha
刚刚检查了我的当前系统,发现pandas版本为0.17.1,statsmodels版本为0.6.1,不过需要重新安装patsy,但之后就没问题了。 - cphlewis
谢谢您的查看。我意识到我遇到了这个问题,因为我的设计矩阵中有缺失值。 - Alex Hasha
1个回答

10

看起来在statsmodels的调用中,“Diet”只有一个自由度,这意味着它可能被视为连续变量,而在R中,它具有3个自由度,因此它可能是一个因子/离散随机变量。

要让ols()将“Diet”视为分类随机变量,请使用

cw_lm=ols('weight ~ C(Diet) + Time', data=cw).fit()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接