मैं हैनली और मैकनील के 1982 के पेपर की सिफारिश करूंगा ' रिसीवर ऑपरेटिंग विशेषता (आरओसी) वक्र ' के तहत क्षेत्र का अर्थ और उपयोग ।
उदाहरण
उनके पास बीमारी की स्थिति और परीक्षा परिणाम की निम्न तालिका है (उदाहरण के लिए, एक लॉजिस्टिक मॉडल से अनुमानित जोखिम)। दाईं ओर की पहली संख्या असली रोग की स्थिति वाले रोगियों की संख्या 'सामान्य' है और दूसरी संख्या सही रोग की स्थिति वाले रोगियों की संख्या 'असामान्य' है:
(1) निश्चित रूप से सामान्य: 33/3
(2) संभवतः सामान्य: 6/2
(3) प्रश्न: 6/2
(4) संभवतः असामान्य: 11/11
(5) निश्चित रूप से असामान्य: 2/33
तो कुल 58 'सामान्य' रोगी और '51' असामान्य व्यक्ति हैं। हम देखते हैं कि जब पूर्वसूचक 1, 'निश्चित रूप से सामान्य' है, तो रोगी आमतौर पर सामान्य होता है (36 में से 33 रोगियों के लिए सच है), और जब यह 5 होता है, तो 'निश्चित रूप से असामान्य' रोगी आमतौर पर असामान्य (33 में से 33 के लिए सच है) 35 रोगियों), तो भविष्यवक्ता समझ में आता है। लेकिन हमें एक मरीज को 2, 3 या 4 के अंक के साथ कैसे आंकना चाहिए? परिणामी परीक्षण की संवेदनशीलता और विशिष्टता को निर्धारित करने के लिए हम असामान्य या सामान्य के रूप में रोगियों को पहचानने के लिए अपना कटऑफ निर्धारित करते हैं।
संवेदनशीलता और विशिष्टता
हम अलग-अलग कटऑफ के लिए अनुमानित संवेदनशीलता और विशिष्टता की गणना कर सकते हैं। (मैं अभी से 'संवेदनशीलता' और 'विशिष्टता' लिखूंगा, जिससे मानों की अनुमानित प्रकृति निहित होगी।)
यदि हम अपना कटऑफ चुनते हैं ताकि हम सभी रोगियों को असामान्य के रूप में वर्गीकृत करें , तो कोई बात नहीं कि उनका परीक्षा परिणाम क्या कहता है (यानी, हम कटऑफ 1+ चुनते हैं), हमें 51/51 = 1 की संवेदनशीलता मिलेगी। विशिष्टता 0 होगी / 58 = 0. इतनी अच्छी आवाज नहीं है।
ठीक है, तो चलो एक कम सख्त कटऑफ चुनें। हम केवल रोगियों को असामान्य के रूप में वर्गीकृत करते हैं यदि उनके पास 2 या अधिक का परीक्षा परिणाम है। हम तब 3 असामान्य रोगियों को याद करते हैं, और 48/51 = 0.94 की संवेदनशीलता है। लेकिन हमारे पास 33/58 = 0.57 की बहुत अधिक विशिष्टता है।
अब हम इसे जारी रख सकते हैं, विभिन्न कटऑफ (3, 4, 5,> 5) का चयन करते हुए। (अंतिम स्थिति में, हम किसी भी मरीज को असामान्य रूप से वर्गीकृत नहीं करेंगे, भले ही उनका उच्चतम परीक्षण स्कोर 5 हो।)
ROC वक्र
यदि हम सभी संभावित कटऑफ के लिए ऐसा करते हैं, और 1 न्यूनतम विशिष्टता के खिलाफ संवेदनशीलता की साजिश करते हैं, तो हमें आरओसी वक्र प्राप्त होता है। हम निम्नलिखित आर कोड का उपयोग कर सकते हैं:
# Data
norm = rep(1:5, times=c(33,6,6,11,2))
abnorm = rep(1:5, times=c(3,2,2,11,33))
testres = c(abnorm,norm)
truestat = c(rep(1,length(abnorm)), rep(0,length(norm)))
# Summary table (Table I in the paper)
( tab=as.matrix(table(truestat, testres)) )
आउटपुट है:
testres
truestat 1 2 3 4 5
0 33 6 6 11 2
1 3 2 2 11 33
हम विभिन्न आँकड़ों की गणना कर सकते हैं:
( tot=colSums(tab) ) # Number of patients w/ each test result
( truepos=unname(rev(cumsum(rev(tab[2,])))) ) # Number of true positives
( falsepos=unname(rev(cumsum(rev(tab[1,])))) ) # Number of false positives
( totpos=sum(tab[2,]) ) # The total number of positives (one number)
( totneg=sum(tab[1,]) ) # The total number of negatives (one number)
(sens=truepos/totpos) # Sensitivity (fraction true positives)
(omspec=falsepos/totneg) # 1 − specificity (false positives)
sens=c(sens,0); omspec=c(omspec,0) # Numbers when we classify all as normal
और इसका उपयोग करके, हम अनुमानित (अनुमानित) आरओसी वक्र की साजिश कर सकते हैं:
plot(omspec, sens, type="b", xlim=c(0,1), ylim=c(0,1), lwd=2,
xlab="1 − specificity", ylab="Sensitivity") # perhaps with xaxs="i"
grid()
abline(0,1, col="red", lty=2)
मैन्युअल रूप से एयूसी की गणना
हम बहुत आसानी से आरओसी वक्र के तहत क्षेत्र की गणना कर सकते हैं, एक ट्रेपोजॉइड के क्षेत्र के लिए सूत्र का उपयोग कर:
height = (sens[-1]+sens[-length(sens)])/2
width = -diff(omspec) # = diff(rev(omspec))
sum(height*width)
परिणाम 0.8931711 है।
एक समास उपाय
एयूसी को एक सहमति उपाय के रूप में भी देखा जा सकता है। यदि हम उन सभी संभावित जोड़ों को लेते हैं जहां एक सामान्य है और दूसरा असामान्य है, तो हम गणना कर सकते हैं कि यह कितनी बार असामान्य है जिसका उच्चतम (सबसे 'असामान्य-दिखने वाला') परीक्षण परिणाम है (यदि उनका समान मूल्य है, तो हम गिनें कि यह 'आधी जीत' के रूप में है:)
o = outer(abnorm, norm, "-")
mean((o>0) + .5*(o==0))
जवाब फिर से 0.8931711, आरओसी वक्र के तहत क्षेत्र है। हमेशा ऐसा ही रहेगा।
सहमति का एक चित्रमय दृश्य
जैसा कि हार्ले ने अपने उत्तर में बताया है, इसकी एक चित्रमय व्याख्या भी है। चलो पर साजिश परीक्षण स्कोर (जोखिम अनुमान) y अक्ष और पर सच रोग की स्थिति एक्स अक्ष (यहाँ कुछ jittering के साथ हैं, तो ओवरलैप अंक दिखाने के लिए):
plot(jitter(truestat,.2), jitter(testres,.8), las=1,
xlab="True disease status", ylab="Test score")
आइए अब बाईं ओर प्रत्येक बिंदु (एक 'सामान्य' रोगी) और दाईं ओर प्रत्येक बिंदु ('असामान्य' रोगी) के बीच एक रेखा बनाएं। एक सकारात्मक ढलान के साथ लाइनों का अनुपात (यानी, समवर्ती जोड़े का अनुपात ) समरूपता सूचकांक (सपाट रेखाएं '50% समाकलन 'के रूप में गिना जाता है)।
संबंधों की संख्या (समान जोखिम स्कोर) के कारण, इस उदाहरण के लिए वास्तविक लाइनों की कल्पना करना थोड़ा मुश्किल है, लेकिन कुछ घबराहट और पारदर्शिता के साथ हम एक उचित साजिश प्राप्त कर सकते हैं:
d = cbind(x_norm=0, x_abnorm=1, expand.grid(y_norm=norm, y_abnorm=abnorm))
library(ggplot2)
ggplot(d, aes(x=x_norm, xend=x_abnorm, y=y_norm, yend=y_abnorm)) +
geom_segment(colour="#ff000006",
position=position_jitter(width=0, height=.1)) +
xlab("True disease status") + ylab("Test\nscore") +
theme_light() + theme(axis.title.y=element_text(angle=0))
हम देखते हैं कि अधिकांश रेखाएँ ऊपर की ओर ढलान देती हैं, इसलिए समवर्ती सूचकांक अधिक होगा। हम प्रत्येक प्रकार के अवलोकन जोड़े से सूचकांक में योगदान भी देखते हैं। इसका अधिकांश हिस्सा सामान्य रोगियों से आता है, जिसमें 5 के जोखिम वाले अंक वाले असामान्य रोगियों के साथ 1 (5-5 जोड़े) का जोखिम होता है, लेकिन काफी कुछ 1-4 जोड़े और 4-5 जोड़े से भी आता है। और ढलान की परिभाषा के आधार पर वास्तविक समापक सूचकांक की गणना करना बहुत आसान है:
d = transform(d, slope=(y_norm-y_abnorm)/(x_norm-x_abnorm))
mean((d$slope > 0) + .5*(d$slope==0))
उत्तर फिर से 0.8931711 है, अर्थात, एयूसी।
विलकॉक्सन-मान-व्हिटनी परीक्षण
कॉनकॉर्ड उपाय और विलकॉक्सन-मान-व्हिटनी परीक्षण के बीच घनिष्ठ संबंध है। वास्तव में, बाद के परीक्षण यदि समवर्ती की संभावना (यानी, यह एक यादृच्छिक सामान्य-असामान्य जोड़ी में असामान्य रोगी है जिसमें सबसे 'असामान्य-दिखने वाला' परीक्षा परिणाम होगा) ठीक 0.5 है। और इसका परीक्षण आँकड़ा अनुमानित समवर्ती संभाव्यता का सिर्फ एक साधारण परिवर्तन है:
> ( wi = wilcox.test(abnorm,norm) )
Wilcoxon rank sum test with continuity correction
data: abnorm and norm
W = 2642, p-value = 1.944e-13
alternative hypothesis: true location shift is not equal to 0
टेस्ट स्टेटिस्टिक ( W = 2642
) समवर्ती जोड़े की संख्या को गिनाता है। यदि हम इसे संभावित युग्मों की संख्या से विभाजित करते हैं, तो हमें एक पारिवारिक संख्या मिलती है:
w = wi$statistic
w/(length(abnorm)*length(norm))
हां, यह 0.8931711 है, आरओसी वक्र के तहत क्षेत्र।
एयूसी (आर में) की गणना करने के आसान तरीके
लेकिन चलिए जीवन को अपने लिए आसान बनाते हैं। विभिन्न पैकेज हैं जो हमारे लिए एयूसी की गणना स्वचालित रूप से करते हैं।
एपि पैकेज
Epi
पैकेज (एयूसी सहित) एम्बेडेड विभिन्न आँकड़ों के साथ एक अच्छा ROC वक्र बनाता है:
library(Epi)
ROC(testres, truestat) # also try adding plot="sp"
PROC पैकेज
मुझे pROC
पैकेज भी पसंद है , क्योंकि यह आरओसी अनुमान को सुचारू कर सकता है (और स्मूथ आरओसी के आधार पर एयूसी अनुमान की गणना कर सकता है):
(लाल रेखा मूल आरओसी है, और काली रेखा चिकनी आरओसी है। डिफ़ॉल्ट 1: 1 पहलू अनुपात पर भी ध्यान दें। इसका उपयोग करने के लिए समझ में आता है, क्योंकि संवेदनशीलता और विशिष्टता दोनों में 0-1 की सीमा होती है।)
सुचारू आरओसी से अनुमानित एयूसी 0.9107 है, इसी तरह से, लेकिन इससे भी थोड़ा बड़ा है, बिना आरओसी के एयूसी (यदि आप आकृति को देखते हैं, तो आप आसानी से देख सकते हैं कि यह बड़ा क्यों है)। (हालांकि, हमारे पास एक सुगम AUC की गणना करने के लिए वास्तव में बहुत कम संभव अलग-अलग परीक्षा परिणाम मूल्य हैं)।
आरएमएस पैकेज
हरेल के rms
पैकेज rcorr.cens()
फ़ंक्शन का उपयोग करके विभिन्न संबंधित संगोष्ठी आँकड़ों की गणना कर सकते हैं । C Index
इसके उत्पादन में एयूसी है:
> library(rms)
> rcorr.cens(testres,truestat)[1]
C Index
0.8931711
CaTools पैकेज
अंत में, हमारे पास caTools
पैकेज और उसका colAUC()
कार्य है। अन्य पैकेजों पर इसके कुछ फायदे हैं (मुख्य रूप से गति और बहु-आयामी डेटा के साथ काम करने की क्षमता - देखें ?colAUC
) जो कभी-कभी सहायक हो सकते हैं । लेकिन निश्चित रूप से यह एक ही जवाब देता है जैसा कि हमने बार-बार गणना की है:
library(caTools)
colAUC(testres, truestat, plotROC=TRUE)
[,1]
0 vs. 1 0.8931711
अंतिम शब्द
कई लोगों को लगता है कि एयूसी हमें बताता है कि एक परीक्षण कितना अच्छा है। और कुछ लोग सोचते हैं कि एयूसी संभावना है कि परीक्षण एक रोगी को सही ढंग से वर्गीकृत करेगा। यह नहीं है । जैसा कि आप उपरोक्त उदाहरण और गणना से देख सकते हैं, एयूसी हमें परीक्षणों के परिवार के बारे में कुछ बताता है , प्रत्येक संभावित कटऑफ के लिए एक परीक्षण।
और एयूसी की गणना कटऑफ के आधार पर की जाती है जो कभी भी व्यवहार में उपयोग नहीं किया जाएगा। हमें 'निरर्थक' कटऑफ मूल्यों की संवेदनशीलता और विशिष्टता की परवाह क्यों करनी चाहिए? फिर भी, यह AUC (आंशिक रूप से) पर आधारित है। (बेशक, अगर एयूसी 1 के बहुत करीब है, तो लगभग हर संभव परीक्षण में बड़ी भेदभावपूर्ण शक्ति होगी, और हम सभी बहुत खुश होंगे।)
एयूसी की 'यादृच्छिक सामान्य-असामान्य' जोड़ी व्याख्या अच्छी है (और इसे विस्तारित किया जा सकता है, उदाहरण के लिए उत्तरजीविता मॉडल, जहां हम देखते हैं कि इसका व्यक्ति सबसे अधिक (रिश्तेदार) खतरा है जो जल्द से जल्द मर जाता है)। लेकिन व्यवहार में कोई भी इसका उपयोग कभी नहीं करेगा। यह एक दुर्लभ मामला है, जहां कोई जानता है कि एक स्वस्थ और एक बीमार व्यक्ति है, वह नहीं जानता कि कौन सा व्यक्ति बीमार है, और यह तय करना चाहिए कि उनमें से कौन सा इलाज करना है। (किसी भी मामले में, निर्णय आसान है; उच्चतम अनुमानित जोखिम वाले व्यक्ति के साथ व्यवहार करें।)
इसलिए मुझे लगता है कि वास्तविक आरओसी वक्र का अध्ययन केवल एयूसी सारांश माप को देखने से अधिक उपयोगी होगा। और यदि आप ROC का उपयोग झूठी सकारात्मक और झूठी नकारात्मक लागतों के अनुमानों के साथ करते हैं, तो आप जो अध्ययन कर रहे हैं, उसके आधार दर के साथ।
यह भी ध्यान दें कि एयूसी केवल भेदभाव को मापता है , अंशांकन नहीं। यही है, यह मापता है कि आप जोखिम अंक के आधार पर दो व्यक्तियों (एक बीमार और एक स्वस्थ) के बीच भेदभाव कर सकते हैं या नहीं। इसके लिए, यह केवल सापेक्ष जोखिम मूल्यों को देखता है (या रैंक, यदि आप करेंगे, cf. विलकॉक्सन-मान-व्हिटनी परीक्षण व्याख्या), न कि निरपेक्ष, जिन्हें आप में रुचि होनी चाहिए । उदाहरण के लिए, यदि आप प्रत्येक जोखिम को विभाजित करते हैं। 2 से अपने लॉजिस्टिक मॉडल का अनुमान, आपको ठीक वैसा ही एयूसी (और आरओसी) मिलेगा।
एक जोखिम मॉडल का मूल्यांकन करते समय, अंशांकन भी बहुत महत्वपूर्ण है। इसकी जांच करने के लिए, आप सभी रोगियों को जोखिम के स्कोर के साथ देखेंगे, जैसे, 0.7, और देखें कि क्या इनमें से लगभग 70% वास्तव में बीमार थे। प्रत्येक संभावित जोखिम स्कोर के लिए ऐसा करें (संभवतः किसी प्रकार के चौरसाई / स्थानीय प्रतिगमन का उपयोग करके)। परिणामों को प्लॉट करें, और आपको अंशांकन का एक ग्राफिकल माप मिलेगा ।
यदि आपके पास अच्छा अंशांकन और अच्छा भेदभाव दोनों के साथ एक मॉडल है , तो आपके पास अच्छा मॉडल होना शुरू होता है। :)