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

如何在无TP/TN/FP/FN值时用R语言pROC包获取precision

如何用pROC包计算Precision(无需额外ROC包)

当然可以!你完全不需要依赖其他ROC相关包,利用pROC生成的roc对象里已有的信息,就能手动推导出Precision值。下面一步步来解释怎么做:

核心原理:从敏感性/特异性推导Precision

先回忆几个关键指标的定义:

  • Precision(精确率):$Precision = \frac{TP}{TP + FP}$,也就是被预测为阳性的样本中,真正属于阳性类的比例。
  • Sensitivity(敏感性):$Sensitivity = \frac{TP}{P}$,其中$P$是真实阳性样本的总数(即你数据里标记为"Good"或"Poor"中的阳性类别数量)。
  • Specificity(特异性):$Specificity = \frac{TN}{N}$,其中$N$是真实阴性样本的总数。

从这几个公式可以推导得出:

  • $TP = Sensitivity \times P$
  • $FP = N - TN = N - (Specificity \times N) = N \times (1 - Specificity)$

把这两个结果代入Precision的公式,就得到了可以用现有指标计算的表达式:
$Precision = \frac{Sensitivity \times P}{(Sensitivity \times P) + (N \times (1 - Specificity))}$

用R代码实现

假设你已经生成了roc1_t5这个roc对象,直接用下面的代码计算每个阈值对应的Precision:

# 从roc对象中提取真实阳性(cases)和真实阴性(controls)的总数量
true_pos_total <- roc1_t5$cases
true_neg_total <- roc1_t5$controls

# 获取所有阈值对应的敏感性和特异性数值
sens_vals <- roc1_t5$sensitivities
spec_vals <- roc1_t5$specificities

# 计算每个阈值对应的Precision
precision_vals <- (sens_vals * true_pos_total) / 
  (sens_vals * true_pos_total + (1 - spec_vals) * true_neg_total)

注意事项

  • 阳性类确认:要确保roc1_t5$cases对应的是你定义的阳性类别(比如你把"Good"设为阳性,那cases应该是"Good"样本的数量)。你可以通过roc1_t5$levels查看当前roc对象的阳性/阴性类别定义,避免搞反。
  • 边界情况处理:当$TP + FP = 0$(即没有样本被预测为阳性)时,Precision是无定义的,此时代码会返回NA。你可以根据需求用ifelse把这些值替换为0或其他合理值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:05:50