You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中高效计算11个类别双评分者的Cohen's Kappa方法问询

高效批量计算多类别Cohen's Kappa的R实现

前提准备

首先确保安装并加载irr包(专门用于计算评分者一致性):

install.packages("irr")
library(irr)

方法一:基础R批量循环实现

这种方法无需额外依赖tidyverse,直接通过循环批量处理每个类别对:

  1. 先模拟示例数据(可替换为你的真实数据):
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)
)
  1. 批量计算每个类别的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的数据流风格,可通过数据重塑+分组计算实现,代码更易读:

  1. 安装并加载tidyverse:
install.packages("tidyverse")
library(tidyverse)
  1. 数据重塑+批量计算:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:13:13