单个模型评估
# install.packages("pROC")
library(pROC)
calculate_metrics <- function(label, prediction) {
# 加载所需的包
library(pROC)
# 计算ROC曲线和AUC
roc_obj <- roc(label, prediction)
auc_value <- auc(roc_obj)
# 寻找最佳cutoff
cutoff <- coords(roc_obj, "best", ret = "threshold")
# 根据cutoff计算混淆矩阵
predicted_label <- ifelse(prediction >= cutoff$threshold, 1, 0)
confusion_matrix <- table(predicted_label, label)
# 提取混淆矩阵中的TP,TN,FP和FN
TP <- confusion_matrix[2, 2]
TN <- confusion_matrix[1, 1]
FP <- confusion_matrix[2, 1]
FN <- confusion_matrix[1, 2]
# 计算敏感度和特异度
sensitivity <- TP / (TP + FN)
specificity <- TN / (TN + FP)
# 返回结果
result <- list(
AUC = auc_value,
Cutoff = cutoff$threshold,
Confusion_Matrix = confusion_matrix,
TP = TP,
TN = TN,
FP = FP,
FN = FN,
Sensitivity = sensitivity,
Specificity = specificity
)
return(result)
}
# 使用示例数据调用函数
set.seed(123)
label <- sample(0:1, 100, replace = TRUE)
pred <- runif(100)
metrics <- calculate_metrics(label, pred)
print(metrics)
多个模型对比分析及统计检验
# install.packages("pROC")
library(pROC)
compare_models <- function(label, pred1, pred2) {
# 加载所需的包
library(pROC)
# 计算ROC曲线
roc1 <- roc(label, pred1)
roc2 <- roc(label, pred2)
# Delong检验
delong_test_result <- roc.test(roc1, roc2, method = "delong")
# 寻找最佳阈值
cutoff1 <- coords(roc1, "best", ret = "threshold")
cutoff2 <- coords(roc2, "best", ret = "threshold")
# 计算敏感度和特异度
predicted_label1 <- ifelse(pred1 >= cutoff1$threshold, 1, 0)
predicted_label2 <- ifelse(pred2 >= cutoff2$threshold, 1, 0)
sensitivity1 <- sum(predicted_label1 == 1 & label == 1) / sum(label == 1)
sensitivity2 <- sum(predicted_label2 == 1 & label == 1) / sum(label == 1)
specificity1 <- sum(predicted_label1 == 0 & label == 0) / sum(label == 0)
specificity2 <- sum(predicted_label2 == 0 & label == 0) / sum(label == 0)
# 比例检验
sensitivity_test <- prop.test(
x = c(sum(predicted_label1 == 1 & label == 1), sum(predicted_label2 == 1 & label == 1)),
n = c(sum(label == 1), sum(label == 1)),
correct = FALSE
)
specificity_test <- prop.test(
x = c(sum(predicted_label1 == 0 & label == 0), sum(predicted_label2 == 0 & label == 0)),
n = c(sum(label == 0), sum(label == 0)),
correct = FALSE
)
# 返回结果
result <- list(
Delong_Test_Result = delong_test_result,
Sensitivity_Test_Result = sensitivity_test,
Specificity_Test_Result = specificity_test,
Sensitivity1 = sensitivity1,
Sensitivity2 = sensitivity2,
Specificity1 = specificity1,
Specificity2 = specificity2,
Cutoff1 = cutoff1$threshold,
Cutoff2 = cutoff2$threshold
)
return(result)
}
# 使用示例数据调用函数
set.seed(123)
label <- sample(0:1, 100, replace = TRUE)
pred1 <- runif(100)
pred2 <- runif(100)
comparison_result <- compare_models(label, pred1, pred2)
print(comparison_result)