这取决于您所说的“手动”是什么意思。
有不止一种方法可以做到这一点。您可以使用残差:
> etasq(xyaov)
Partial eta^2
x 0.4854899
Residuals NA
> 1 - var(xyaov$residuals)/var(y)
[1] 0.4854899
(你没有设置种子,所以我们没有完全相同的结果)。
几乎等效地,您可以使用预测值:
> var(predict(xyaov)) / var(y)
[1] 0.4854899
您可以使用 ANOVA 模型中的平方和(由相当不直观的模型给出):
> summary(xyaov)[[1]][[2]][[1]] / (summary(xyaov)[[1]][[2]][[2]] + summary(xyaov)[[1]][[2]][[1]] )
[1] 0.4854899
您可以使用 summary.lm 并获得 R^2(因为 R-squared 是 eta squared):
> summary.lm(xyaov)$r.squared
[1] 0.4854899
您可以在不参考 aov() 函数的情况下执行此操作,方法是计算每个组的平均值,然后计算残差,然后基于此计算 eta 平方:
xy <- as.data.frame(cbind(x, y))
xy$y <- as.numeric(as.character(xy$y)) #I don't understand why this line is needed
x.means <- as.data.frame(tapply(y, x, mean))
x.means$x <- row.names(x.means)
xy <- merge(x.means, xy, by="x")
xy$resid <- xy[, 2] - xy$y
1 - var(xy$resid) / var(xy$y)
[1] 0.4854899