序言:我要问的问题可以被认为是这个讨论的后续,为此提供了一个很好的答案。另外,我在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 作为变量包含在内吗?我将使用输出作为表格,但也可能会投入一些时间来寻找一种可视化它的好方法。非常感谢您提前提供的所有帮助。
使用
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(.)))