在R中高效计算11个类别双评分者的Cohen's Kappa方法问询
高效批量计算多类别Cohen's Kappa的R实现
前提准备
首先确保安装并加载irr包(专门用于计算评分者一致性):
install.packages("irr") library(irr)
方法一:基础R批量循环实现
这种方法无需额外依赖tidyverse,直接通过循环批量处理每个类别对:
- 先模拟示例数据(可替换为你的真实数据):
set.seed(123) df <- data.frame( # 评分者1的11个类别 r1_c1 = sample(0:1, 30, replace = TRUE), r1_c2 = sample(0:1, 30, replace = TRUE), r1_c3 = sample(0:1, 30, replace = TRUE), r1_c4 = sample(0:1, 30, replace = TRUE), r1_c5 = sample(0:1, 30, replace = TRUE), r1_c6 = sample(0:1, 30, replace = TRUE), r1_c7 = sample(0:1, 30, replace = TRUE), r1_c8 = sample(0:1, 30, replace = TRUE), r1_c9 = sample(0:1, 30, replace = TRUE), r1_c10 = sample(0:1, 30, replace = TRUE), r1_c11 = sample(0:1, 30, replace = TRUE), # 评分者2对应的11个类别 r2_c1 = sample(0:1, 30, replace = TRUE), r2_c2 = sample(0:1, 30, replace = TRUE), r2_c3 = sample(0:1, 30, replace = TRUE), r2_c4 = sample(0:1, 30, replace = TRUE), r2_c5 = sample(0:1, 30, replace = TRUE), r2_c6 = sample(0:1, 30, replace = TRUE), r2_c7 = sample(0:1, 30, replace = TRUE), r2_c8 = sample(0:1, 30, replace = TRUE), r2_c9 = sample(0:1, 30, replace = TRUE), r2_c10 = sample(0:1, 30, replace = TRUE), r2_c11 = sample(0:1, 30, replace = TRUE) )
- 批量计算每个类别的Cohen's Kappa:
# 定义类别总数 n_cats <- 11 # 用lapply循环处理每个类别对 kappa_list <- lapply(1:n_cats, function(i) { # 提取当前类别对应的两位评分者数据 pair_data <- df[, c(i, i + 11)] # 计算Kappa kappa_res <- kappa2(pair_data) # 整理结果 data.frame( category = paste0("类别_", i), kappa值 = kappa_res$value, p值 = kappa_res$p.value, 一致率 = kappa_res$value ) }) # 合并为统一数据框 final_results <- do.call(rbind, kappa_list) rownames(final_results) <- NULL # 查看结果 print(final_results)
方法二:tidyverse 长格式分组实现
如果习惯用tidyverse的数据流风格,可通过数据重塑+分组计算实现,代码更易读:
- 安装并加载tidyverse:
install.packages("tidyverse") library(tidyverse)
- 数据重塑+批量计算:
df_long <- df %>% # 添加观测行号,保留原始观测对应关系 mutate(观测ID = row_number()) %>% # 宽格式转长格式,拆分评分者和类别信息 pivot_longer( cols = -观测ID, names_to = c("评分者", "类别"), names_pattern = "(r\\d)_c(\\d+)", values_to = "得分" ) %>% # 转回宽格式,让同一观测、同一类别的两位评分者得分同行 pivot_wider( names_from = 评分者, values_from = 得分 ) %>% # 按类别分组,计算每个组的Kappa group_by(类别) %>% summarise( kappa值 = kappa2(select(., r1, r2))$value, p值 = kappa2(select(., r1, r2))$p.value, 一致率 = kappa2(select(., r1, r2))$value ) %>% ungroup() # 查看结果 print(df_long)
核心优势
两种方法都无需手动逐个创建数据框,可自动适配任意数量的类别,在大型数据集(比如成百上千个类别)下效率远高于手动拆分的方式,同时结果会整理成结构化的数据框,方便后续分析或可视化。
内容的提问来源于stack exchange,提问作者keelin
相关产品推荐
相关产品推荐

