如何手动计算 ANOVA 中的η2η2

机器算法验证 r 方差分析 r平方 规模效应
2022-03-30 17:54:43

此 R 代码从 ANOVA 输出 eta 平方:

y     <- c(rnorm(30, 3), rnorm(30, 4), rnorm(30, 5))
x     <- sort(rep(paste("treatment", 1:3), 30))
xy    <- data.frame(x,y)
xyaov <- aov(y ~ x, xy)

library(heplots)
etasq(xyaov)

          Partial eta^2
x             0.4807356
Residuals            NA

如何编写代码来“手动”计算 eta 平方,即不使用预先准备好的etasq函数?

2个回答

这取决于您所说的“手动”是什么意思。

有不止一种方法可以做到这一点。您可以使用残差:

> 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

eta-squared ( ),是对类似于的 ANOVA 模型的效应大小的度量。也就是说,它给出了的知识来解释有一个“常规”和一个部分只有当您拥有具有多个因素的 ANOVA 时,这种区别才会发挥作用。以下是公式:η2R2YXη2 η2

η(regular)2=SSbetweenSStotalηpartial2=SSfactorSSfactor+SSerror
对于后者,只隐含了一个特定的因素,模型中与其他因素相关的平方和不会进入计算。

对于您的示例,将使用顶部公式:

set.seed(55)
y     <- c(rnorm(30, 3), rnorm(30, 4), rnorm(30, 5))
x     <- sort(rep(paste("treatment", 1:3), 30))
xy    <- data.frame(x,y)
xyaov <- aov(y ~ x, xy)

anova(xyaov)
# Analysis of Variance Table
# 
# Response: y
#           Df Sum Sq Mean Sq F value   Pr(>F)    
# x          2 62.808  31.404  33.622 1.52e-11 ***
# Residuals 87 81.260   0.934                     
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

anova(xyaov)[1,2]/sum(anova(xyaov)[,2])
[1] 0.435961