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

在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)

代码说明

  1. 先生成METHODEKURZ和COMORB的所有唯一分组组合,确保覆盖所有需要计算的子组;
  2. 使用map_dfr遍历每个分组,筛选对应子集后计算混淆矩阵;
  3. 根据混淆矩阵推导敏感性、特异性、PPV、NPV四个指标;
  4. 将所有分组的结果整合成结构化的DataFrame,直接输出符合需求的表格。

内容的提问来源于stack exchange,提问作者emmarajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:01:11