R中调用eta_squared计算重复测量ANOVA效应量报aovlist类错误
报错原因说明
这个报错的触发逻辑非常直接:
- 你用
aov()搭配Error()子句拟合重复测量ANOVA时,输出的结果不是普通的aov类对象,而是特殊的aovlist(嵌套列表结构的方差分析对象) - 你调用的
eta_squared(包括已弃用的eta_sq)函数,内部会先调用基础R的通用anova()函数从输入对象中提取方差分析表,但这个通用函数没有针对aovlist类的适配逻辑,找不到对应的处理方法,就会抛出“无适用方法”的错误。
额外说明:你目前写的模型公式其实不符合重复测量ANOVA的结构要求,Error(factor(id))的写法没有明确“每个被试下有3个重复测量时间点”的嵌套关系,就算效应量计算不报错,输出的F值和p值也是不准的。
可直接落地的解决方案
- 第一步:修正依赖加载和模型公式
先补充必要的包加载,调整误差项的嵌套写法,保证基础ANOVA结果正确:# 加载依赖包 library(tidyverse) # 对应你用到的read_csv、数据长表转换功能 library(effectsize) # 对应你要计算的eta平方 library(car) # 用来做aovlist类的方差表提取 filename = 'testdata.csv' testdata <- read_csv(filename) # 为每个独立观测/被试生成唯一id testdata$id <- factor(seq(nrow(testdata))) # 把宽表转成长表,适配aov的输入要求 testdata <- testdata %>% pivot_longer(cols = c(c1, c2, c3), names_to = "time", values_to = "amplitude") testdata$time <- factor(testdata$time) # 修正重复测量的误差项写法,明确被试内的嵌套误差 res.aov <- aov(amplitude ~ time + Error(id/time), data = testdata) # 先验证基础ANOVA结果可以正常输出 summary(res.aov) - 第二步:适配aovlist结构计算效应量,避免类不匹配报错
不要直接把res.aov(aovlist类)传给eta_squared,可以任选一种可行方案:- 用car包的大写
Anova()函数从aovlist中提取标准方差表,再计算效应量:# 从aovlist中提取规范的ANOVA表,自动适配重复测量的误差结构 anova_result <- Anova(res.aov) # 传入提取好的方差表计算eta平方,不会触发方法不匹配的报错 eta2 <- eta_squared(anova_result) - 换用afex包的重复测量专用拟合接口,返回的对象天生兼容效应量计算函数,不需要手动适配:
# 安装并加载afex包 # install.packages("afex") library(afex) res.rm <- aov_car(amplitude ~ time + Error(id/time), data = testdata) # 直接计算效应量即可 eta2 <- eta_squared(res.rm)
- 用car包的大写
- 零包依赖的手动计算方式
如果不想额外加载其他包,也可以直接根据summary(res.aov)输出的平方和结果手动计算eta平方:
单因素被试内的η²计算公式 = 目标因素的离均差平方和 /(目标因素的离均差平方和 + 对应嵌套层的残差平方和)
从summary输出里找到time行的SS值,以及id/time误差层下的残差SS值,代入公式即可算出效应量。
内容的提问来源于stack exchange,提问作者Ben Labosch
相关产品推荐
相关产品推荐

