计算特定特异性值的截止值和灵敏度?
Calculate cutoff and sensitivity for specific values of specificity?
计算几个回归模型后,我想计算灵敏度值和预先指定的特异性值(即 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)
非常感谢!
这与 ROC 曲线的计算方式密切相关:如果以细粒度计算这些曲线,您基本上可以获得 "every" 阈值的灵敏度和特异性。所以,你可以做的就是简单地计算灵敏度、特异性和相应的阈值,就像你想要获得一条 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
计算几个回归模型后,我想计算灵敏度值和预先指定的特异性值(即 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)
非常感谢!
这与 ROC 曲线的计算方式密切相关:如果以细粒度计算这些曲线,您基本上可以获得 "every" 阈值的灵敏度和特异性。所以,你可以做的就是简单地计算灵敏度、特异性和相应的阈值,就像你想要获得一条 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