在R中结合METHODEKURZ与COMORB计算敏感性等诊断指标
背景说明
这是Stack Overflow相关讨论的后续需求,目标是开发通用化的自动化仪表盘。现有基于tidyverse工具处理的长格式DataFrame包含以下字段:
- 方法标识:
METHODEKURZ(取值为A、B、C、D等) - 方法对应的二分类结果:
CLASS_INT(取值为0、1) - 合并症类型:
COMORB(取值为COM1、COM2等,数量不固定) - 合并症对应的二分类结果:
VALUES(取值为0、1)
需求
需要生成包含METHODEKURZ、COMORB、敏感性(Sensitivity)、特异性(Specificity)、阳性预测值(PPV)、阴性预测值(NPV)的表格输出。
现有实现
当前代码仅支持按METHODEKURZ分组计算指标,代码如下:
library(tidyverse) library(caret) # 注意:原代码用到confusionMatrix,需加载caret包 my_df <- structure( list( a = c('A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D'), b = c(0,0,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0), c = c('COM1','COM1','COM1','COM1','COM2','COM2','COM2','COM2','COM3','COM3','COM3','COM3', 'COM4','COM4','COM4','COM4','COM5','COM5','COM5','COM5'), d = c(1,1,0,0,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1) ), .Names = c("METHODEKURZ", "CLASS_INT", "COMORB", "VALUES"), row.names = c(NA, 20L), class = "data.frame") %>% mutate(across(c(contains('VALUES')), ~as.factor(.))) %>% mutate(across(c(contains('CLASS_INT')), ~as.factor(.))) t(sapply(sort(unique(my_df$METHODEKURZ)), function(i) { q <- confusionMatrix(data = my_df$CLASS_INT[my_df$METHODEKURZ == i], reference = my_df$VALUES[my_df$METHODEKURZ == i])$table c(sensitivity = q[1, 1] / (q[1, 1] + q[2, 1]), specificity = q[2, 2] / (q[2, 2] + q[1, 2]), ppv = q[1, 1] / (q[1, 1] + q[1, 2]), npv = q[2, 2] / (q[2, 2] + q[2, 1])) }))
解决方案
修改代码,通过按METHODEKURZ和COMORB双重分组,实现每个分组下的指标计算,最终输出符合要求的结构化表格:
library(tidyverse) library(caret) my_df <- structure( list( a = c('A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D','A','B','C','D'), b = c(0,0,1,1,0,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0), c = c('COM1','COM1','COM1','COM1','COM2','COM2','COM2','COM2','COM3','COM3','COM3','COM3', 'COM4','COM4','COM4','COM4','COM5','COM5','COM5','COM5'), d = c(1,1,0,0,0,1,0,0,1,0,1,0,0,0,1,1,1,0,1,1) ), .Names = c("METHODEKURZ", "CLASS_INT", "COMORB", "VALUES"), row.names = c(NA, 20L), class = "data.frame") %>% mutate(across(c(CLASS_INT, VALUES), as.factor)) # 简化类型转换代码 # 生成所有分组组合 group_combinations <- my_df %>% select(METHODEKURZ, COMORB) %>% distinct() %>% arrange(METHODEKURZ, COMORB) # 遍历每个分组计算指标 result_df <- map_dfr(1:nrow(group_combinations), function(idx) { current_group <- group_combinations[idx, ] subset_df <- my_df %>% filter(METHODEKURZ == current_group$METHODEKURZ, COMORB == current_group$COMORB) # 计算混淆矩阵 cm <- confusionMatrix(data = subset_df$CLASS_INT, reference = subset_df$VALUES)$table # 计算各项指标 sensitivity <- cm[1, 1] / sum(cm[, 1]) specificity <- cm[2, 2] / sum(cm[, 2]) ppv <- cm[1, 1] / sum(cm[1, ]) npv <- cm[2, 2] / sum(cm[2, ]) # 返回当前分组的结果行 tibble( METHODEKURZ = current_group$METHODEKURZ, COMORB = current_group$COMORB, Sensitivity = sensitivity, Specificity = specificity, PPV = ppv, NPV = npv ) }) # 查看结果 print(result_df)
代码说明
- 先生成
METHODEKURZ和COMORB的所有唯一分组组合,确保覆盖所有需要计算的子组; - 使用
map_dfr遍历每个分组,筛选对应子集后计算混淆矩阵; - 根据混淆矩阵推导敏感性、特异性、PPV、NPV四个指标;
- 将所有分组的结果整合成结构化的DataFrame,直接输出符合需求的表格。
内容的提问来源于stack exchange,提问作者emmarajan
相关产品推荐
相关产品推荐

