R语言如何按分组计算r*wg(j)、ICC(1)、ICC(2)组内相关指标
R语言计算组内一致性r*wg(j)、ICC(1)、ICC(2)实现
不需要逐组手动拆分、转置数据,直接通过现有包结合分组计算函数即可快速完成所有指标计算,完整步骤如下:
前置准备
先安装并加载需要的依赖包,导入示例数据集:
# 未安装依赖时先运行下行命令 # install.packages(c("dplyr", "tidyr", "psych", "multilevel", "lme4")) library(dplyr) library(tidyr) library(psych) library(multilevel) library(lme4) # 导入示例数据 group <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4) var1 <- c(4, 5, 4, 2, 3, 4, 5, 3, 5, 8, 4, 3, 4, 4, 5) var2 <- c(2, 3, 4, 2, 4, 4, 5, 6, 6, 9, 3, 3, 2, 5, 4) var3 <- c(4, 5, 6, 2, 3, 6, 7, 6, 7, 8, 5, 6, 3, 3, 6) df <- data.frame(group, var1, var2, var3)
计算各分组r*wg(j)
直接使用multilevel包的rwg.j()函数,结合dplyr的分组计算功能批量输出每组结果,不需要手动转置数据:
rwg_res <- df %>% group_by(group) %>% group_modify(~{ # j为题项总数,ranvar为零分布方差,5点量表均匀分布对应值为2,需根据自身量表调整 calc_res <- rwg.j(.x, j = 3, ranvar = 2) data.frame(rwg_j = calc_res$rwg) })
运行后rwg_res中即为每个分组对应的r*wg(j)值。
计算ICC(1)与ICC(2)
研究中通常有两种计算需求,可根据自身需要选择:
全局ICC值(最常用)
即所有样本共用的组间方差解释率、组均值信度指标,通过多水平零模型提取方差分量计算即可,不需要调整数据格式:
# 转为题项长格式 df_long <- df %>% pivot_longer(cols = starts_with("var"), names_to = "item", values_to = "score") # 拟合无预测变量的零模型 null_mod <- lmer(score ~ 1 + (1|group) + (1|group:item), data = df_long) var_comp <- as.data.frame(VarCorr(null_mod)) # 提取各层方差 var_group <- var_comp$vcov[var_comp$grp == "group"] var_item <- var_comp$vcov[var_comp$grp == "group:item"] var_resid <- var_comp$vcov[var_comp$grp == "Residual"] # 计算指标 k <- mean(table(df$group)) # 每组平均人数 j <- 3 # 题项数 ICC1 <- var_group / (var_group + var_item + var_resid) ICC2 <- var_group / (var_group + (var_item + var_resid)/(k*j))
运行后ICC1、ICC2即为全局的两类ICC指标。
逐组ICC值
如果需要单独计算每个组内的ICC,可通过分组函数批量完成格式转换与计算,不需要手动逐组处理:
group_icc_res <- df %>% group_by(group) %>% group_modify(~{ # 自动将当前组数据转为ICC函数要求的“行是题项、列是评分者”格式 .x <- .x %>% mutate(rater_id = paste0("rater_", row_number())) %>% pivot_longer(cols = starts_with("var"), names_to = "item") %>% pivot_wider(names_from = rater_id, values_from = value) %>% select(-item) # 计算ICC,提取双向随机模型下的对应结果 icc_calc <- ICC(as.matrix(.x)) data.frame( ICC1 = icc_calc$results[3, "ICC"], ICC2 = icc_calc$results[3, "ICC3k"] ) })
运行后group_icc_res中即为每个分组单独的ICC(1)、ICC(2)值。
注意:r*wg(j)计算时的
ranvar参数必须和你使用的量表匹配:5点量表均匀分布方差为2,7点量表为4,若你使用的评分分布不是均匀分布,需要替换为对应零分布的方差值,否则结果会存在偏差。
内容的提问来源于stack exchange,提问作者Riccardo
相关产品推荐
相关产品推荐

