【R语言】单个分类模型性能评估、两个分类模型性能对比、统计检验

单个模型评估

R 复制代码
# 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)

多个模型对比分析及统计检验

R 复制代码
# 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)
相关推荐
IT古董25 分钟前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
学技术的大胜嗷4 小时前
离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制
人工智能·深度学习·yolo·目标检测·机器学习
还有糕手4 小时前
西南交通大学【机器学习实验10】
人工智能·机器学习
DataGear6 小时前
如何在DataGear 5.4.1 中快速制作SQL服务端分页的数据表格看板
javascript·数据库·sql·信息可视化·数据分析·echarts·数据可视化
王小王-1237 小时前
基于Hadoop的京东厨具商品数据分析及商品价格预测系统的设计与实现
hadoop·数据分析·京东厨具·厨具分析·商品分析
想知道哇8 小时前
机器学习入门:决策树的欠拟合与过拟合
人工智能·机器学习
go54631584658 小时前
修改Spatial-MLLM项目,使其专注于无人机航拍视频的空间理解
人工智能·算法·机器学习·架构·音视频·无人机
可观测性用观测云8 小时前
Cloudflare 日志采集和分析最佳实践
数据分析
还有糕手9 小时前
西南交通大学【机器学习实验2】
人工智能·机器学习
小白狮ww9 小时前
VASP 教程:VASP 机器学习力场微调
人工智能·深度学习·机器学习