如何在R中计算不完全设计下多评分者的Weighted Kappa?
在R中计算不完全设计下的多评分者加权Kappa
当然可以实现,虽然没有直接处理这种不完全设计的现成函数,但只要先把数据整理成配对评分的格式,就能用现有工具计算加权Kappa。
步骤1:数据预处理
你的数据是宽格式,每个受试者对应2个非NA的评分,我们需要把这些评分提取成两两配对的格式:
# 加载所需包 library(dplyr) library(tidyr) library(irr) # 导入你的数据(直接使用你提供的结构) df <- structure(list(subject_id = 1001:1010, `1` = c(4L, 5L, 2L, 3L, NA, NA, NA, NA, NA, NA), `2` = c(5L, NA, NA, NA, 1L, 8L, 10L, NA, NA, NA), `3` = c(NA, 4L, NA, NA, 10L, NA, NA, 4L, 6L, NA), `4` = c(NA, NA, 8L, NA, NA, 6L, NA, 4L, NA, 5L), `5` = c(NA, NA, NA, 10L, NA, NA, 8L, NA, 2L, 4L)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L)) # 转换为配对评分格式 paired_ratings <- df %>% # 转长格式,每个评分者的评分单独一行 pivot_longer(cols = -subject_id, names_to = "rater", values_to = "score") %>% # 去掉缺失值 filter(!is.na(score)) %>% # 按受试者分组,给每个评分标记顺序 group_by(subject_id) %>% mutate(pair_idx = row_number()) %>% # 转回宽格式,每个受试者的两个评分放在同一行 pivot_wider(names_from = pair_idx, values_from = score, names_prefix = "score_") %>% ungroup() %>% # 只保留两个评分列 select(score_1, score_2)
步骤2:计算加权Kappa
用irr包的kappa2()函数处理配对数据,支持线性或二次权重(根据需求选择):
# 计算线性加权Kappa linear_kappa <- kappa2(paired_ratings, weight = "linear") print(linear_kappa) # 如果需要二次加权Kappa,替换参数即可 quadratic_kappa <- kappa2(paired_ratings, weight = "quadratic") print(quadratic_kappa)
逻辑说明
这种方法的合理性在于:你的设计中每个受试者仅由2名评分者评估,我们把所有这些评分对汇总后,本质上就是一组配对的评分数据——而加权Kappa原本就是用来衡量配对评分者的一致性。汇总所有配对后计算的Kappa,能反映所有评分者之间的整体一致性水平。
如果实际数据中存在非2个评分的受试者,记得先过滤掉这些样本(比如在分组后用filter(n() == 2)处理)。
内容的提问来源于stack exchange,提问作者Honestiore
相关产品推荐
相关产品推荐

