如何基于重复测量问卷数据按项计算ICC并生成结果数据框
按问卷题目计算重复测量的组内相关系数(ICC)
数据背景
现有一份R语言数据框,包含65名参与者的两次问卷重复测量数据:
- 20行对应20个问卷题目(行名:
item1至item20) - 130列对应每名参与者的两次测量(列名:
ID1_1、ID1_2…ID65_2) - 单元格值为0或1
数据构造代码:
df <- data.frame(matrix(NA, nrow = 20, ncol = 130)) # 添加列名 colnames(df) <- c(paste0("ID", rep(1:65, each = 2), "_", rep(1:2))) # 填充随机0/1值 df[] <- sample(0:1, size = nrow(df) * ncol(df), replace = TRUE) # 设置行名 row.names(df) <- paste0("item", 1:20)
原代码问题
原代码存在两处核心错误:
- 混淆行/列含义:用
grep("^item", names(df), value = TRUE)查找列名中的item,但实际item是行名,列名以ID开头,导致无法获取有效数据分组。 - ICC函数输入格式错误:
ICC()(来自psych包)需要结构化的重复测量数据,原代码直接传入单行数据,不符合函数要求。
正确实现代码
步骤说明
- 加载
psych包(需提前安装:install.packages("psych")) - 遍历每个题目(行),提取该题目下所有参与者的两次测量数据,整理为每行对应一个参与者的宽格式(2列:第一次、第二次测量)
- 对每个题目的结构化数据计算ICC,提取关键结果
- 合并所有题目的结果为一个数据框
完整代码
# 加载所需包 library(psych) # 定义计算单个题目ICC的函数 calc_item_icc <- function(item_row, df) { # 提取当前题目的所有测量数据,转置后按参与者分组(每2列对应一个参与者的两次测量) item_data <- t(df[item_row, ]) item_data_split <- split(item_data, factor(gsub("_\\d$", "", rownames(item_data)))) # 整理为宽格式:每行一个参与者,两列是两次测量 item_df <- do.call(rbind, item_data_split) colnames(item_df) <- c("time1", "time2") # 计算ICC(采用双因素随机效应模型,一致性类型) icc_result <- ICC(item_df, model = "twoway", type = "agreement") # 提取所需结果,返回数据框 data.frame( item = row.names(df)[item_row], model = icc_result$Model, type = icc_result$Type, icc = icc_result$ICC, lower_bound = icc_result$`lower bound`, upper_bound = icc_result$`upper bound`, f_value = icc_result$F.value, p_value = icc_result$p.value, stringsAsFactors = FALSE ) } # 遍历所有题目,计算ICC icc_results_list <- lapply(1:nrow(df), calc_item_icc, df = df) # 合并为最终结果数据框 final_icc_df <- do.call(rbind, icc_results_list) # 查看结果 print(final_icc_df)
结果说明
最终的final_icc_df包含每个题目的ICC值、置信区间、F值、p值等关键统计量,每行对应一个问卷题目。
内容的提问来源于stack exchange,提问作者user21538383
相关产品推荐
相关产品推荐

