如何用for循环计算多题Cohen's Kappa?R语言技术求助
问题描述
给定R语言数据集,转换为宽格式后,尝试用for循环计算评分者A与其他所有评分者配对的Cohen's Kappa值,遇到两个问题:
数据集与宽格式转换代码
dog <- c("Dog1","Dog1","Dog2","Dog2","Dog3","Dog3", "Dog4","Dog4") rater <- c("A", "K", "A", "K","A", "T","A","M") q1 <- c(0,0,0,0,0,0,1,0) q2 <- c(0,1,1,0,0,0,0,0) q3 <- c(0,0,1,1,1,1,0,0) data <- data.frame(dog,rater, q1,q2,q3) library(tidyverse) data_wide<- data %>% pivot_longer(cols = 3:5, names_to = "question", values_to = "response") %>% pivot_wider(names_from = "rater", values_from = "response")
循环计算Kappa的代码
#define the raters and questions raters <- c("A", "K", "T", "M") questions <- c("q1", "q2", "q3") # create an empty list to store the kappa values-- kappa_list <- list() # loop through each question and pair of raters to calculate kappa for (q in questions) { for (i in 1:length(raters)) { for (j in (i+1):length(raters)) { r1 <- raters[i] r2 <- raters[j] data_subset <- subset(data_wide, question == q) data_subset <- data_subset[, c("dog", r1, r2)] kappa_val <- kappa2(data_subset[,2:3]) kappa_list[[paste0(q, "_", r1, "_", r2)]] <- kappa_val } } }
遇到的问题
- 打印
kappa_list时仅显示q1的配对结果,代码存在什么问题? - 出现报错信息
Error in rep(0, nc - 1) : invalid 'times' argument,但kappa_list中仍存储了部分Kappa值,原因是什么?
当前kappa_list仅包含q1相关的Kappa结果。
问题分析与解决方案
问题1:仅显示q1结果的原因
循环逻辑遍历了所有评分者配对(包括K&T、K&M等非A的组合),但这些非A配对的子集中会出现全NA的列,导致kappa2函数报错,循环直接中断,q2、q3的后续计算完全没执行,最终只有q1的部分结果被存储。
解决方案
既然目标是仅计算A与其他评分者的配对,直接遍历除A之外的评分者即可,简化循环结构:
raters <- c("K", "T", "M") # 只保留A的配对对象 questions <- c("q1", "q2", "q3") kappa_list <- list() for (q in questions) { for (r in raters) { # 筛选当前问题的行,保留A和当前评分者的列,并移除含NA的行 data_subset <- data_wide %>% filter(question == q) %>% select(dog, A, all_of(r)) %>% drop_na() # 有效配对数≥2时才计算Kappa,避免无效计算或报错 if(nrow(data_subset) >= 2) { kappa_val <- kappa2(data_subset[,2:3]) kappa_list[[paste0(q, "_A_", r)]] <- kappa_val } else { kappa_list[[paste0(q, "_A_", r)]] <- "有效配对数不足,无法计算Kappa" } } }
问题2:报错Error in rep(0, nc - 1)的原因
该报错来自kappa2函数内部:当传入的数据框存在全NA列,或经过筛选后只剩1行/0行时,函数计算会出现nc=1的情况,导致nc-1=0,后续逻辑触发报错。
你能看到部分结果,是因为报错发生在循环中间步骤(比如q1的K&T配对之后),之前的计算已完成并写入列表,循环中断后后续步骤不再执行。
解决方案
- 提前过滤NA行:用
drop_na()移除无配对数据的行,确保传入kappa2的是完整评分对。 - 添加样本量判断:仅当有效配对数≥2时调用
kappa2,否则记录无效信息,避免函数报错中断循环。 - 简化循环逻辑:只处理A与其他评分者的配对,减少无效计算。
内容的提问来源于stack exchange,提问作者Rabin KC
相关产品推荐
相关产品推荐

