(Câu trả lời của @Sjoerd C. de Vries và @Hrishekesh Ganu là chính xác. Tôi nghĩ dù sao tôi cũng có thể trình bày ý tưởng theo cách khác, có thể giúp một số người.)
Bạn có thể nhận được một ROC như thế nếu mô hình của bạn bị sai. Hãy xem xét ví dụ dưới đây (được mã hóa R
), được điều chỉnh từ câu trả lời của tôi ở đây: Làm thế nào để sử dụng các ô vuông để tìm điểm mà các giá trị có nhiều khả năng đến từ các điều kiện khác nhau?
## data
Cond.1 = c(2.9, 3.0, 3.1, 3.1, 3.1, 3.3, 3.3, 3.4, 3.4, 3.4, 3.5, 3.5, 3.6, 3.7, 3.7,
3.8, 3.8, 3.8, 3.8, 3.9, 4.0, 4.0, 4.1, 4.1, 4.2, 4.4, 4.5, 4.5, 4.5, 4.6,
4.6, 4.6, 4.7, 4.8, 4.9, 4.9, 5.5, 5.5, 5.7)
Cond.2 = c(2.3, 2.4, 2.6, 3.1, 3.7, 3.7, 3.8, 4.0, 4.2, 4.8, 4.9, 5.5, 5.5, 5.5, 5.7,
5.8, 5.9, 5.9, 6.0, 6.0, 6.1, 6.1, 6.3, 6.5, 6.7, 6.8, 6.9, 7.1, 7.1, 7.1,
7.2, 7.2, 7.4, 7.5, 7.6, 7.6, 10, 10.1, 12.5)
dat = stack(list(cond1=Cond.1, cond2=Cond.2))
ord = order(dat$values)
dat = dat[ord,] # now the data are sorted
## logistic regression models
lr.model1 = glm(ind~values, dat, family="binomial") # w/o a squared term
lr.model2 = glm(ind~values+I(values^2), dat, family="binomial") # w/ a squared term
lr.preds1 = predict(lr.model1, data.frame(values=seq(2.3,12.5,by=.1)), type="response")
lr.preds2 = predict(lr.model2, data.frame(values=seq(2.3,12.5,by=.1)), type="response")
## here I plot the data & the 2 models
windows()
with(dat, plot(values, ifelse(ind=="cond2",1,0),
ylab="predicted probability of condition2"))
lines(seq(2.3,12.5,by=.1), lr.preds1, lwd=2, col="red")
lines(seq(2.3,12.5,by=.1), lr.preds2, lwd=2, col="blue")
legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))
Thật dễ dàng để thấy rằng mô hình màu đỏ đang thiếu cấu trúc của dữ liệu. Chúng ta có thể thấy các đường cong ROC trông như thế nào khi được vẽ dưới đây:
library(ROCR) # we'll use this package to make the ROC curve
## these are necessary to make the ROC curves
pred1 = with(dat, prediction(fitted(lr.model1), ind))
pred2 = with(dat, prediction(fitted(lr.model2), ind))
perf1 = performance(pred1, "tpr", "fpr")
perf2 = performance(pred2, "tpr", "fpr")
## here I plot the ROC curves
windows()
plot(perf1, col="red", lwd=2)
plot(perf2, col="blue", lwd=2, add=T)
abline(0,1, col="gray")
legend("bottomright", legend=c("model 1", "model 2"), lwd=2, col=c("red", "blue"))
Bây giờ chúng ta có thể thấy rằng, đối với mô hình sai (màu đỏ), khi tỷ lệ dương tính giả trở nên lớn hơn 80 %, tỷ lệ dương tính giả tăng nhanh hơn tỷ lệ dương thực sự. Nhìn vào các mô hình trên, chúng ta thấy rằng điểm đó là nơi các đường màu đỏ và màu xanh giao nhau ở phía dưới bên trái.