如何在R中提取ICC公式的方差分量以计算SEM?
嗨,这个问题其实很好解决——要拿到计算SEM所需的ICC公式分量,咱们不用局限于psych或irr包的表面输出,有几种灵活的方式可以获取这些值,下面结合你的测试数据一步步来:
方法1:通过ANOVA手动拆解方差组分
ICC的本质就是基于重复测量方差分析的方差分解,咱们先把数据转成长格式,做ANOVA就能直接拿到需要的均方值:
# 加载tidyr来转换数据格式 library(tidyr) df_long <- df %>% mutate(subject = 1:n()) %>% # 给每个被试加编号 pivot_longer(cols = starts_with("J"), names_to = "rater", values_to = "score") # 拟合重复测量ANOVA(这里对应常用的ICC(2,1)随机评分者模型) anova_result <- aov(score ~ factor(subject) + Error(factor(subject)/factor(rater)), data = df_long) summary(anova_result)
从ANOVA的输出里,你能直接拿到:
MS(subject):被试间均方MS(subject:rater):残差(误差)均方
拿这些值就能算SEM了——比如ICC(2,1)模型下,SEM就是sqrt(MS_error);如果是其他ICC模型(比如ICC(3,1)),只需要对应调整公式就行,核心都是从ANOVA里取对应均方。
方法2:用lme4拟合混合模型提取方差组分
混合效应模型能更直观地拆分各个随机效应的方差,非常适合精准获取ICC的各个分量:
library(lme4) # 拟合随机截距模型:被试和评分者都设为随机效应(对应ICC(2,1)) model <- lmer(score ~ 1 + (1|subject) + (1|rater), data = df_long) summary(model)
看模型输出的Random effects部分,你能得到:
subject对应的方差(也就是被试间方差σ²_p)rater对应的方差(评分者间方差σ²_r)Residual对应的方差(残差方差σ²_e)
之后就可以根据你用的ICC模型计算SEM,比如ICC(2,1)的SEM是sqrt(σ²_e),ICC(3,1)的SEM则是sqrt((σ²_e + σ²_r)/k)(k是你的评分者数量,这里是4)。
方法3:直接提取psych/irr包的隐藏输出
其实psych和irr包的ICC结果里已经藏了你要的信息,只是没直接显示在表面输出里:
用psych包提取:
library(psych) icc_result <- ICC(df) # 查看内置的ANOVA结果 icc_result$anova
这里的icc_result$anova里包含了所有均方值,你可以直接提取误差均方来算SEM——比如对应ICC(2,1)的误差均方就是icc_result$anova$Error: subject:rater$Mean Sq[2](具体索引可以根据你的输出微调)。
用irr包提取:
library(irr) # 指定模型类型(这里选twoway对应ICC(2,1)) irr_icc <- icc(df, model = "twoway", type = "agreement", unit = "single") # 查看内置ANOVA irr_icc$anova
同样,从这个ANOVA输出里就能拿到你需要的所有分量值。
总的来说,这三种方法都能帮你拿到计算SEM的核心数据,其中混合模型的方式最灵活,能适配不同的ICC模型;而直接挖包的隐藏输出则最省事,不用额外转换数据。
内容的提问来源于stack exchange,提问作者JKFY13

