如何在 R 中创建没有包的 roc 曲线?

How to create a roc curve without package in R?

我想了解ROC曲线。我需要在不使用 R 中的任何包的情况下创建 ROC 曲线 我有一个包含两组的数据集

k <- c(rep(0,23), rep(1,23))
x1 <- rnorm(46,0.963,0.26)
x2 <- rnorm(46,-0.006957,0.12)
x3 <- rnorm(46,2.033,1)
df <- data.frame(x1, x2, x3, k)

我正在使用线性判别分析进行预测

library(MASS)
md <- lda(k~., data = df)
df$pred <- predict(md, df)$class

我需要做的是生成不同的阈值来识别真阳性和假阴性如何变成ROC曲线。这就是我试图做的:

true_pos <- (sum(df$k==1 & df$pred==1)-cumsum(df$k==1 & df$pred==1))/sum(df$k==1)
ts <- df$pred == 1 & df$k==1
t_pos <- (sum(ts)-cumsum(ts))/sum(df$k==1)

fs <- df$pred == 1 & df$k == 0
f_pos <- (sum(fs)-cumsum(fs))/sum(df$k==0)

plot(f_pos, t_pos, type = 'l')

这没有给我我需要的东西。上图就是我想要的

无论如何,这里是一步一步的:


set.seed( 100 )
k <- c(rep(0,23), rep(1,23))
x1 <- rnorm(46,0.963,0.26)
x2 <- rnorm(46,-0.006957,0.12)
x3 <- rnorm(46,2.033,1)
x3[1:23] <- x3[1:23]*0.8 ## give it something to work with!!
df <- data.frame(x1, x2, x3, k)

library(MASS)
md <- lda(k~., data = df)
df$pred <- predict(md, df)$posterior[,2]

df.pos <- df %>% filter( k == 1 )
df.neg <- df %>% filter( k == 0 )

fpr <- function( threshold ) {
    sum( df.neg$pred > threshold ) / nrow(df.neg)
}

tpr <- function( threshold ) {
    sum( df.pos$pred > threshold ) / nrow(df.pos)
}

all.predictions <- c( 0, sort( df$pred ), 1 )

perf <- sapply( all.predictions, function(threshold) {
    c( fpr(threshold), tpr(threshold) )
})
perf <- t(perf)

plot( NA, type="n", xlim=c(0,1), ylim=c(0,1), xlab="Fpr", ylab="Tpr", main="Manual Labor Builds Character" )
lines( perf )