我是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读入数据帧。我在这里缺少什么?
答案 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