如何在无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
相关产品推荐
相关产品推荐

