对 R 中的方差分析感到困惑

Confused about ANOVA in R

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

> 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 读取到数据框中。我在这里错过了什么?

从这个 post 得到线索:

当从CSV文件中读取数据时,Diet列变成了一个普通的数字列,但是对于ANOVA它必须是一个因子变量(我仍然不清楚为什么它是一个单独的class/kind 在 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