在不使用任何软件包的情况下,在R中绘制ROC曲线

在不使用任何软件包的情况下,在R中绘制ROC曲线,r,roc,R,Roc,您好,我是一个非常新的编程在R和我有troble绘制ROC曲线没有使用任何软件包 我使用以下方法生成数据: d=rpearsonIII(100,0.5,360,20) nd=rnorm(100,450,25) 我需要一个nd值为400的向量,所以我做了: spec = (cumsum(nd[nd>400])/sum(nd))*100 sens = (cumsum(d[d<400])/sum(nd))*100 但情节和我想象的完全不同 编辑: 感谢给出的建议,我的代码现在看起来如下

您好,我是一个非常新的编程在R和我有troble绘制ROC曲线没有使用任何软件包

我使用以下方法生成数据:

d=rpearsonIII(100,0.5,360,20)
nd=rnorm(100,450,25)
我需要一个nd值为400的向量,所以我做了:

spec = (cumsum(nd[nd>400])/sum(nd))*100
sens = (cumsum(d[d<400])/sum(nd))*100
但情节和我想象的完全不同

编辑: 感谢给出的建议,我的代码现在看起来如下:

sc2 = c(rnorm(50,450,25),rpearsonIII(50,0.5,360,20))
scF = sc2 < 395

thresholds <- sort(sc2)

pos <- sum(scF);pos
neg <- sum(!scF);neg

tn <- cumsum(!scF);tn
spec <- tn/neg;spec

tp <- pos - cumsum(scF);tp
sens <- tp/pos;sens

plot(1 - spec, sens, type = "l", col = "red", 
     ylab = "Sensitivity", xlab = "1 - Specificity")
abline(c(0,0),c(1,1))
sc2=c(rnorm(50450,25),rpearsonIII(50,0.5360,20))
scF=sc2<395

阈值我不知道什么是
rpearsonIII
,所以我只想用实际类
实际值
以及预测的分数
做一个样本随机数据

set.seed(100)
actuals <- sample(c(TRUE,FALSE), 100, replace = TRUE)
scores <- runif(100,-1,1)
首先,让我们得到每个阈值的真实负片。这很简单,它只是在每个阈值处或以下的
FALSE
值的数量。由于我们的数据是按阈值排序的,因此我们可以使用以下公式计算(以及特异性):

现在我们需要做的就是画出这两个

plot(1 - spec, sens, type = "l", col = "red", 
     ylab = "Sensitivity", xlab = "1 - Specificity")
abline(c(0,0),c(1,1))

为了得到曲线的AUC,我们只需要计算曲线高度(灵敏度)乘以每个实际值的宽度(1-特异性差异)。我们已经有了敏感性,我们只需要特异性。
diff
函数将为我们提供相邻特异性值的差异,但是,我们需要在开始处输入一个
0
值,以获得第一列的宽度

width <- diff(c(0, 1 - sens))
auc <- sum(spec*width)

width规格和传感器的长度不同。他们必须和你一样使用plot()。你的数据的分数是多少?要绘制和ROC曲线,您需要实际的类别(这似乎是您的
scF
值)以及您为每个元素提供的预测类别的分数。我的数据的分数是我的
sc2
值。也许我误解了分数是什么……你可能想访问了解更多的解释,但对于ROC曲线,你需要两样东西,“真值”(
实际值)
)和你用来预测真值(
分数
)的某种数值预测器,通常是分类器的输出。ROC是预测值与事实相符程度的可视化。例如,您可以使用身高作为“未成年人”(年龄>=18岁)的预测值。在您的代码中,由于
scF
是直接从
sc2
派生出来的,因此使用年龄来预测“是次要的”。您的ROC将是完美的。非常感谢您的建议@Barker!最后一个问题,在使用此处描述的方法获得ROC曲线后,您能否给出如何计算曲线下面积(AUC)的建议?我使用PearsonDS软件包获得Rpearsonii,因为我需要生成具有伽马分布和位置参数的数据。所以我使用的变量“d”有伽马分布的数据,“nd”有正态分布。我的目标是使用这些分布生成的数据绘制roc曲线
actuals <- actuals[order(scores)]
thresholds <- sort(scores)
pos <- sum(actuals)
neg <- sum(!actuals)
tn <- cumsum(!actuals)
spec <- tn/neg
tp <- pos - cumsum(actuals)
sens <- tp/pos
plot(1 - spec, sens, type = "l", col = "red", 
     ylab = "Sensitivity", xlab = "1 - Specificity")
abline(c(0,0),c(1,1))
width <- diff(c(0, 1 - sens))
auc <- sum(spec*width)
actuals <- actuals[order(scores)]

sens <- (sum(actuals) - cumsum(actuals))/sum(actuals)
spec <- cumsum(!actuals)/sum(!actuals)

plot(1 - spec, sens, type = "l", col = "red", 
     ylab = "Sensitivity", xlab = "1 - Specificity")
abline(c(0,0),c(1,1))

(auc <- sum(spec*diff(c(0, 1 - sens))))