gpt4 book ai didi

r - 在不使用任何包的情况下在 R 中绘制 ROC 曲线

转载 作者:行者123 更新时间:2023-12-04 01:49:04 26 4
gpt4 key购买 nike

您好,我是 R 编程的新手,我在不使用任何包的情况下绘制 ROC 曲线时遇到了麻烦。

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

d=rpearsonIII(100,0.5,360,20)
nd=rnorm(100,450,25)

我需要一个 d 值 <400 和 nd 值 >400 的向量,所以我做到了:

spec = (cumsum(nd[nd>400])/sum(nd))*100
sens = (cumsum(d[d<400])/sum(nd))*100

我是这样绘制的:

plot(1-spec,sens)

但是剧情和我想象的完全不一样

编辑:感谢给出的建议,我的代码现在看起来像这样:

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))

绘制的 roc 曲线如下所示: roc curve

我现在的问题是,如果改变生成数据的顺序(rnorm 和 rpearsonIII),曲线就会反转。

最佳答案

我不知道 rpearsonIII 是什么,所以我将制作一个样本随机数据,其中包含实际类别 actuals 以及预测分数 分数

set.seed(100)
actuals <- sample(c(TRUE,FALSE), 100, replace = TRUE)
scores <- runif(100,-1,1)

带解释的长版

如果您的数据中的实际值是字符串或因子而不是逻辑值,您需要使用以下方法将它们转换为逻辑值:

actuals <- actuals == "postiveClass"

接下来我们要根据分数对实例进行排序。我们可以使用:

actuals <- actuals[order(scores)]

如果您想跟踪灵敏度和特异性的阈值,可以使用以下方法使它们保持一致:

thresholds <- sort(scores)

现在我们需要了解我们的敏感性和特异性。灵敏度为 TP/P,特异性为 TN/N。获取正数 P 的总数很容易,因为我们的实际值是合乎逻辑的,我们可以只使用 sum(actuals)。相似性,我们可以使用 sum(!actuals) 得到负数 N

pos <- sum(actuals)
neg <- sum(!actuals)

首先让我们在每个阈值处得到我们的真底片。这很简单,它只是等于或低于每个阈值的 FALSE 值的数量。由于我们的数据按阈值排序,我们可以使用以下方法计算(和特异性):

tn <- cumsum(!actuals)
spec <- tn/neg

真正的阳性数量稍微难一些,因为我们正在寻找大于阈值的阳性数量,所以单独使用 cumsum 是行不通的。然而,由于高于阈值的数量等于低于或等于阈值的总负数,我们可以使用以下方法获得真阳性:

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))

ROC Plot

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

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))))

关于r - 在不使用任何包的情况下在 R 中绘制 ROC 曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41754220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com