2016-08-03 104 views
1

在計算了幾個迴歸模型之後,我想計算靈敏度值和預先確定的特異性值(即0​​.99,0.90,0.85等)的截止值以找到最佳模型。我已經創建了代碼來計算截止值的給定值(從0.1到0.9)的靈敏度和特異性,但是現在我想要使用特異性的特定值(即計算相應的截止值和靈敏度值),在這裏我卡住了。計算特定值的截止值和靈敏度?

假設我有以下回歸模型(使用例如數據集「mtcars」):

data(mtcars) 
    model <- glm(formula= vs ~ wt + disp, data=mtcars, family=binomial) 

這裏是我已經用於SENS的計算和規格爲cut-的給定值的代碼關:

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

嗯好吧,對不起! @geekoverdose解決了我的問題,所以我認爲不再需要編輯我的問題... – Hed

回答

0

這與ROC曲線的計算方式密切相關:如果以精細粒度計算這些曲線,您基本上可以獲得「每個」閾值的靈敏度和特異性。所以,你可以做的是簡單地計算敏感性,特異性和相應的閾值,如果你想獲得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

謝謝,@geekoverdose!思考ROC曲線的好主意。它的工作原理,這就是我一直在尋找的! – Hed