r - 如何在 R 中创建没有包的 roc 曲线?
问题描述
我想了解 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 )
推荐阅读
- java - FirebaseRecyclerAdapter 总是显示空白屏幕
- javascript - 以下代码片段中的最小更改是什么,以使输出为“ABC”?
- c - 如果在函数内部调用 free(),它是否只在本地释放?
- javascript - 尝试使用 moment.js 进行日期验证。错误信息不会显示
- arcore - ARCORE 在 96 吻痕板上
- python - randomSplit 返回 pyspark 中所有零值的数据帧
- typescript - 将枚举打印为字符串打字稿
- python - 图像未出现在 tkinter 窗口和按钮中
- scala - 执行 N 次 Scala Future
- php - 上次登录时间在线的用户条件()