对R中的ANOVA感到困惑

时间:2015-05-06 06:02:26

标签: r csv lm anova

我是R和统计学的新手,我正在尝试对csv文件中的数据集进行双因素ANOVA,其中每个因子的值都在其自己的列中。我正在使用

> mydata <- read.csv("myfile.csv")
> model = lm(result ~ factor1 * factor2, data=mydata)

作为检查,我尝试了R样本数据集中的ChickWeight数据。

> 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)
> data = read.csv("ChickWeight.csv", header=T)
> anova(lm(weight ~ Time + Diet, data=data))
Analysis of Variance Table

Response: weight
            Df  Sum Sq Mean Sq  F value    Pr(>F)    
Time        1 2042344 2042344 1537.033 < 2.2e-16 ***
Diet        1  108177  108177   81.412 < 2.2e-16 ***
Residuals 575  764036    1329                       

值得注意的是,Diet列中丢失了自由度,数据从csv读入数据帧。我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

从这篇文章中得到线索:Why do R and statsmodels give slightly different ANOVA results?

当从CSV文件中读取数据时,Diet列正在成为一个普通的数字列,但对于ANOVA,它必须是一个因子变量(我仍然不清楚为什么它是R中的一个单独的类/种类为什么它不能自动处理它:浮点数的不精确二进制表示?)。 所以解决方案是:

 > data$Diet = factor(data$Diet)
 > anova(lm("weight ~ Time + Diet", data=data))
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