在计算了几个回归模型后,我想计算灵敏度值和预先指定的特异性值(即0.99,0.90,0.85等)的截止值,以找到最佳模型。我已经创建了代码来计算给定截止值的灵敏度和特异性(从0.1到0.9),但现在我想使用特定的特异性值(即计算相应的截止值和灵敏度值),在这里,我被卡住了。
假设我有以下回归模型(使用示例数据集' mtcars'):
data(mtcars)
model <- glm(formula= vs ~ wt + disp, data=mtcars, family=binomial)
以下是我用于计算截止值给定值的sens和spec的代码:
predvalues <- model$fitted.values
getMisclass <- function(cutoff, p, labels){
d <- cut(predvalues, breaks=c(-Inf, cutoff, Inf), labels=c("0", "1"))
print(confusionMatrix(d, mtcars$vs, positive="1"))
cat("cutoff", cutoff, ":\n")
t <- table(d, mtcars$vs)
print(round(sum(t[c(1,4)])/sum(t), 2))
}
cutoffs <- seq(.1,.9,by=.1)
sapply(cutoffs, getMisclass, p=predval, labels=mtcars$vs)
在给定一系列特异性值的情况下,有人可以帮助我如何重写此代码以计算灵敏度和截止分数吗?可能吗? 截止值应为
cutoffs <- c(0.99, 0.90, 0.85, 0.80, 0.75)
非常感谢!
答案 0 :(得分:1)
这与如何计算ROC曲线密切相关:如果以精细粒度计算这些曲线,则基本上可以获得对每个&#34;门槛值。所以,你可以做的只是计算灵敏度,特异性和相应的阈值,就像你想要获得ROC曲线一样......
library(pROC)
myRoc <- roc(predictor = predvalues, response = mtcars$vs)
plot(myRoc)
myRoc$specificities
print(with(myRoc, data.frame(specificities, sensitivities, thresholds)))
# specificities sensitivities thresholds
# 1 0.00000000 1.00000000 -Inf
# 2 0.05555556 1.00000000 0.002462809
# 3 0.11111111 1.00000000 0.003577104
# 4 0.16666667 1.00000000 0.004656164
# 5 0.22222222 1.00000000 0.005191974
# 6 0.27777778 1.00000000 0.006171197
# [...]
...然后查找您感兴趣的具体情况的相应灵敏度和阈值,例如为:
cutoffs <- c(0.99, 0.90, 0.85, 0.80, 0.75)
myData <- with(myRoc, data.frame(specificities, sensitivities, thresholds))
library(plyr)
print(laply(cutoffs, function(cutoff) myData$sensitivities[which.min(abs(myData$specificities-cutoff))]))
# [1] 0.7857143 0.8571429 0.8571429 0.9285714 0.9285714