无法在R

时间:2018-05-27 15:39:50

标签: r anova

我在R中有一个数据框。

这是DF负责人的一部分:

Sujet  T  E  O  P  meanTR

1      1  0  0  0  0.97
1      1  0  0  0  1.44
2      0  1  0  1  0.94  
  • Sujet:从1到12
  • T,E,O,P:1或0
  • meanTR:Numeric

我想获得anova表,所以我尝试了这个:

model_all <- aov(meanTR ~ E*O*P+ Error(Sujet/E*O*P), data = df)

之后,我想提取模型的残差来绘制它们

所以我尝试了这个:

res <- residuals(model_all)返回NULL

所以我发现人们在网上建议这个解决方案:

model_all.pr <- proj(model_all)      
res <- model_all.pr[[3]][, "Residuals"]

但这会使下标超出范围

res <- model_all.pr[[3]]["Residuals"]

但这会返回NA

我不知道自己做错了什么。我真的很困惑

任何帮助都将不胜感激。

主要目标是能够运行:

plot(res)

qqnorm(res)

1 个答案:

答案 0 :(得分:1)

使用aov(),您可以获得某些适合的顶级$residuals属性,但不会获得其他属性。

例如,使用如下的简单模型,您可以直接访问残差(使用str()查看对象的结构,包括可以访问的属性):

fit1 <- aov(Sepal.Length ~ Sepal.Width, data=iris)

str(fit1$residuals)
## Named num [1:150] -0.644 -0.956 -1.111 -1.234 -0.722 ...
## - attr(*, "names")= chr [1:150] "1" "2" "3" "4" ...

但是在您使用的更复杂的模型规范中(即使用显式/自定义错误术语),每个顶级属性中都有单独的残差值:

fit2 <- aov(Sepal.Length ~ Sepal.Width + Error(Species/Sepal.Length), data=iris)

fit2$residuals # NULL

names(fit2)
## [1] "(Intercept)"   "Species"   "Sepal.Length:Species"   "Within"

fit2$Species$residuals
## 2         3 
## -1.136219  5.179749 

str(fit2$Within$residuals)
## Named num [1:144] -1.83e-15 -2.49e-15 -1.90e-15 -2.55e-15 -2.89e-15 ...
## - attr(*, "names")= chr [1:144] "7" "8" "9" "10" ...
## ...
## ...

我没有考虑到足以说明原因的数据,但我确信这是合理的。

希望有所帮助!