使用 R 中的多个输入变量计算灵敏度、特异性等

问题描述 投票:0回答:1

序言:我要问的问题可以被认为是这个讨论的后续,为此提供了一个很好的答案。另外,我在here得到了非常有用的建议,我现在正在处理的想法也朝着类似的方向发展。

我正在创建一个很大程度上自动化的仪表板,因此,尽可能寻找通用的方法。在这里,我有一个数据框(长格式,主要使用 tidyverse 中的包完成工作)与

  • 不同的方法(A、B、C、D、...)称为 METHODEKURZ

  • 与 METHODEKURZ 相关的两个不同结果值 (0, 1),我将它们称为 CLASS_INT

  • 一组合并症(COM1、COM2、COM3、COM4、COM5),有时较多,有时较少,称为 COMORB

  • 与 COMORB 相关的两个不同的结果值 (0, 1),我称之为 VALUES

根据这些信息,我想获得如下所示的输出:

方法库兹 COMORB 灵敏度 特异性 PPV 净现值
A COM1 0.49 0.22 0.31 0.11
B COM1 0.31 0.22 0.22 0.49
C COM1 0.22 0.49 0.31 0.22
D COM1 0.49 0.22 0.31 0.11
A COM2 0.22 0.22 0.49 0.11
B COM2 0.49 0.22 0.31 0.22
C COM2 0.31 0.22 0.31 0.22
D COM2 0.31 0.22 0.31 0.49

如果问题只是为了提供带有变量 METHODEKURZ 的输出,则此处所示的方法以及下面呈现的方法就足够了,并且已证明效果良好:

library(tidyverse)

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]))
}))

但是,我有 COMORB 作为附加变量,我希望将其考虑在内。有人可以帮助我修改代码以将 COMORB 作为变量包含在内吗?我将使用输出作为表格,但也可能会投入一些时间来寻找一种可视化它的好方法。非常感谢您提前提供的所有帮助。

r automation statistics tidyverse data-analysis
1个回答
0
投票

使用

expand.grid
将每个变量组合存储到数据框中,并使用与每个单独变量集相对应的值计算统计数据。

library(caret)

# Generate all the combinations of variables using expand.grid
var_combinations <- expand.grid("METHODEKURZ" = unique(my_df$METHODEKURZ), 
                                "COMORB" = unique(my_df$COMORB))

cbind(var_combinations, t(apply(var_combinations, 1, function(i) {
  set_of_rows <- my_df$METHODEKURZ == i[1] & my_df$COMORB == i[2]
  q <- confusionMatrix(data      = my_df$CLASS_INT[set_of_rows],
                       reference = my_df$VALUES[set_of_rows])$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 sensitivity specificity       ppv       npv
#1            A   COM1   1.0000000   0.6666667 0.6666667 1.0000000
#2            B   COM1   1.0000000   0.2500000 0.2500000 1.0000000
#3            C   COM1   0.3333333   0.5000000 0.5000000 0.3333333
#4            D   COM1   0.0000000   0.3333333 0.0000000 0.3333333
#5            A   COM2   1.0000000   0.0000000 0.6000000       NaN
#6            B   COM2   0.0000000   0.5000000 0.0000000 0.6666667
#7            C   COM2   1.0000000   0.5000000 0.3333333 1.0000000
#8            D   COM2   0.2500000   0.0000000 0.5000000 0.0000000
#9            A   COM3   0.5000000   0.0000000 0.2500000 0.0000000
#10           B   COM3   1.0000000   0.2500000 0.2500000 1.0000000
#11           C   COM3   0.3333333   0.5000000 0.5000000 0.3333333
#12           D   COM3   0.5000000   0.0000000 0.6666667 0.0000000
#13           A   COM4   0.6666667   0.0000000 0.5000000 0.0000000
#14           B   COM4   1.0000000   0.5000000 0.3333333 1.0000000
#15           C   COM4   1.0000000   1.0000000 1.0000000 1.0000000
#16           D   COM4   0.5000000   0.3333333 0.3333333 0.5000000
#17           A   COM5   0.5000000   1.0000000 1.0000000 0.3333333
#18           B   COM5   0.0000000   0.7500000 0.0000000 0.7500000
#19           C   COM5   1.0000000   0.6666667 0.6666667 1.0000000
#20           D   COM5   0.5000000   0.0000000 0.6666667 0.0000000

原始数据

我生成了更多值,以获得每个变量组合的多个观察结果。

library(dplyr)

#For reproducibility
set.seed(123)

my_df <- structure(
  list(
    a = rep(c('A','B','C','D'),length.out = 100), 
    b = sample(c(0,1),100, replace = TRUE), 
    c = c(rep('COM1',20),rep('COM2',20),rep('COM3',20),rep('COM4',20), rep('COM5',20)),
    d = sample(c(0,1),100, replace = TRUE)
  ), 
  .Names = c("METHODEKURZ", "CLASS_INT", "COMORB", "VALUES"), 
  row.names = c(NA, 100L), 
  class = "data.frame") %>%
  mutate(across(c(contains('VALUES')), 
                ~as.factor(.))) %>%
  mutate(across(c(contains('CLASS_INT')), 
                ~as.factor(.))) 
© www.soinside.com 2019 - 2024. All rights reserved.