I érdekel a görbe alatti terület (AUC) vagy a c-statisztika kézi kiszámítása bináris logisztikai regressziós modell esetén.

Például az érvényesítési adatkészlet, megvan a függő változó valódi értéke, a retenció (1 = megtartva; 0 = nem megmaradt), valamint a regressziós elemzésem által generált minden megfigyeléshez egy előre jelzett megtartási állapot, egy olyan modell segítségével, amely a képzés segítségével készült set (ez 0-tól 1-ig terjedhet).

A kezdeti gondolataim a modellosztályozások „helyes” számának azonosítása voltak, és egyszerűen elosztottam a „helyes” megfigyelések számát a kiszámításához szükséges összes megfigyelés számával a c-statisztika. “Helyes” értékkel, ha egy megfigyelés valódi retenciós állapota = 1, és az előrejelzett retenciós állapot> 0,5, akkor ez “helyes” osztályozás. Ezenkívül, ha egy megfigyelés valódi retenciós állapota = 0, és az előrejelzett retenciós állapot < 0,5, akkor az is “helyes” osztályozás. Feltételezem, hogy “döntetlen” akkor következne be, amikor a megjósolt érték = 0,5, de ez a jelenség nem fordul elő az érvényesítési adatkészletemben. Másrészt a “helytelen” besorolás az lenne, ha egy megfigyelés valódi retenciós állapota = 1 és az előrejelzett retenciós állapot < 0,5, vagy ha az eredmény valódi retenciós állapota = 0 és az előrejelzett retenciós állapot> 0,5. Tisztában vagyok a TP-vel, az FP-vel, az FN-vel, a TN-vel, de nincs tisztában azzal, hogy hogyan lehet kiszámítani a c-statisztikát, ha ezt az információt megadjuk.

Válasz

Ajánlom Hanley & McNeil 1982-es cikkét A vevő működési jellemzője alatti terület jelentését és használatát (ROC ) görbe .

Példa

Az alábbi táblázat tartalmazza a betegség állapotát és a teszt eredményét (amely megfelel például a logisztikai modell becsült kockázatának). Az első szám a jobb oldalon az igaz betegségben „normális” állapotú betegek száma, a második pedig az „igaz betegségben„ rendellenes ”állapotú betegek száma:

(1) Határozottan normális: 33/3
(2) Valószínűleg normális: 6/2
(3) Kérdéses: 6/2
(4) Valószínűleg abnormális: 11/11
(5) Határozottan kóros: 2/33

Tehát összesen 58 „normális” és „51” kóros beteg van. Azt látjuk, hogy amikor a prediktor értéke 1, „Határozottan normális”, akkor a beteg általában normális (a 36 betegből 33-ra igaz), és ha 5, akkor a „Határozottan kóros” általában rendellenes (igaz a 35 beteg), tehát a prediktornak van értelme. De hogyan ítéljünk meg egy beteget 2, 3 vagy 4 pontszámmal? Amit beállítottunk ahhoz, hogy a betegeket kórosnak vagy normálisnak ítéljük, meghatározzuk a kapott vizsgálat érzékenységét és specifitását.

Érzékenység és specifitás

Kiszámíthatjuk a becsült érzékenység és specifitás a különböző határértékeknél. (Innentől kezdve csak az „érzékenységet” és a „specifikumot” írom, hagyva, hogy az értékek becsült jellege implicit legyen.)

Ha úgy választjuk meg a határértéket, hogy mindet a betegek kórosnak számítanak, függetlenül attól, hogy a teszt eredményeik mit mondanak (azaz az 1+ értéket választjuk), 51/51 = 1 érzékenységet kapunk. A specifitás 0/58 = 0. Nem olyan jól hangzik.

OK, ezért válasszunk kevésbé szigorú határértéket. Csak akkor minősítjük kórosnak a betegeket, ha a teszt eredménye 2 vagy annál magasabb. Ezután hiányzik 3 rendellenes beteg, és érzékenységünk 48/51 = 0,94. De sokkal megnövekedett specifitással rendelkezünk, 33/58 = 0,57.

Ezt most folytathatjuk, különféle cutoffok választásával (3, 4, 5,> 5). (Az utolsó esetben nem sorolunk egyetlen beteget sem kóros állapotba, még akkor sem, ha a lehető legmagasabb 5-ös teszt pontszámmal rendelkeznek.)

A ROC görbe

Ha ezt megtesszük az összes lehetséges levágásnál, és az 1-es érzékenységet ábrázoljuk, mínusz a specifitás, akkor megkapjuk a ROC görbét. Használhatjuk a következő R kódot:

 # 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)) )  

A kimenet:

  testres truestat 1 2 3 4 5 0 33 6 6 11 2 1 3 2 2 11 33  

Különböző statisztikákat számolhatunk:

 ( 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  

És ennek segítségével megrajzolhatjuk a (becsült) ROC görbét:

 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)  

AUC görbe

A AUC

Nagyon egyszerűen kiszámíthatjuk a ROC görbe alatti területet, a trapéz területének képletével:

 height = (sens[-1]+sens[-length(sens)])/2 width = -diff(omspec) # = diff(rev(omspec)) sum(height*width)  

Az eredmény: 0.8931711.

Konkordanciamérték

Az AUC szintén konkordancia mértéknek tekinthető.Ha az összes lehetséges pár t megkapjuk, ahol az egyik normális, a másik rendellenes, kiszámolhatjuk, hogy a kórosnak milyen gyakran van a legmagasabb (leginkább „abnormális megjelenésű”) teszt eredménye (ha értékük megegyezik, ezt „fél győzelemnek” tekintjük):

 o = outer(abnorm, norm, "-") mean((o>0) + .5*(o==0))  

A válasz ismét 0.8931711, a ROC görbe alatti terület. Ez mindig így lesz.

A konkordancia grafikus nézete

Amint Harrell válaszában rámutatott, ennek grafikus értelmezése is van. Vázoljuk fel a teszt pontszámot (kockázatbecslést) az y tengelyről és az igaz betegség állapotáról az x tengelyen (itt némi izgalommal, átfedő pontok megjelenítéséhez):

 plot(jitter(truestat,.2), jitter(testres,.8), las=1, xlab="True disease status", ylab="Test score")  

A valódi betegség kockázati pontszámának szétszórása státusz.

Húzzunk most egy vonalat a bal oldali pontok („normális” beteg) és a jobb oldali pontok („rendellenes” betegek) közé. A pozitív meredekségű vonalak aránya (vagyis a konkordáns párok aránya) a konkordancia index (a lapos vonalak ’50% egyezésnek számítanak).

Kicsit nehéz elképzelni a példa tényleges sorait, a kapcsolatok száma miatt (egyenlő kockázati pontszám), de némi izgalom és átláthatóság mellett ésszerű cselekményt kaphatunk:

 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))  

A kockázati pontszám ábrázolása a betegség tényleges státusával szemben, vonalak az összes lehetséges megfigyelési pár között.

Látjuk, hogy a vonalak többsége felfelé hajlik, így a konkordancia index magas lesz. Azt is látjuk, hogy az egyes megfigyelési párok milyen mértékben járulnak hozzá az indexhez. Leginkább normál betegekből származik, akiknek az 1-es kockázati pontszáma párosul abnormális betegekkel, 5-ös kockázati pontszámmal (1–5 pár), de elég sok 1–4 párból és 4–5 párból is származik. És nagyon egyszerű kiszámítani a tényleges konkordancia indexet a lejtés definíciója alapján:

 d = transform(d, slope=(y_norm-y_abnorm)/(x_norm-x_abnorm)) mean((d$slope > 0) + .5*(d$slope==0))  

A válasz ismét 0.8931711, azaz az AUC.

A Wilcoxon – Mann – Whitney teszt

Szoros összefüggés van a konkordancia mértéke és a Wilcoxon – Mann – Whitney között teszt. Valójában ez utóbbi azt vizsgálja, hogy a konkordancia valószínűsége (vagyis hogy egy véletlen normális – kóros párban a kóros betegnek lesz-e a legtöbb „kóros kinézetű” teszt eredménye) pontosan 0,5. Tesztstatisztikája pedig csak a becsült egyeztetési valószínűség egyszerű átalakítása:

 > ( 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  

A tesztstatisztika (W = 2642) megszámolja az egyező párok számát. Ha elosztjuk a lehetséges párok számával, akkor egy ismert számot kapunk:

 w = wi$statistic w/(length(abnorm)*length(norm))  

Igen, ez 0.8931711, a ROC görbe alatti terület.

Könnyebb módszerek az AUC kiszámítására (R-ben)

De könnyítsük meg az életünket. Különböző csomagok számítják ki automatikusan az AUC-t számunkra.

Az Epi csomag

A Epi csomag szép ROC görbét hoz létre statisztikák (beleértve az AUC-t is):

 library(Epi) ROC(testres, truestat) # also try adding plot="sp"  

ROC görbe az Epi csomagból

A pROC csomag

Szeretem a pROC csomagot is, mivel képes simítsa meg a ROC becslést (és számoljon ki egy AUC becslést a simított ROC alapján):

ROC görbe (simítatlan és simított) a pROC csomagból

(A piros vonal az eredeti ROC, a fekete vonal pedig a simított ROC. Vegye figyelembe az alapértelmezett 1: 1 képarányt is. Ezt érdemes használni, mivel az érzékenység és a specificitás egyaránt 0–1 tartomány.)

A simított ROC becsült AUC értéke 0,9107, hasonló, de valamivel nagyobb, mint a sima ROC (ha egy t az ábrán, könnyen beláthatja, miért nagyobb). (Noha valóban túl kevés különálló vizsgálati eredményértékünk van a sima AUC kiszámításához).

Az effektív csomag

Harrell rms csomagja a rcorr.cens() függvény segítségével számíthat különböző kapcsolódó konkordancia statisztikákra. A kimenetében szereplő C Index az AUC:

 > library(rms) > rcorr.cens(testres,truestat)[1] C Index 0.8931711  

A caTools csomag

Végül megvan a caTools csomag és annak colAUC() függvénye. Van néhány előnye más csomagokkal szemben (elsősorban a sebesség és a többdimenziós adatokkal való munka képessége – lásd ?colAUC), amelyek néha hasznosak lehetnek.De természetesen ugyanazt a választ adja, amit újra és újra kiszámítottunk:

 library(caTools) colAUC(testres, truestat, plotROC=TRUE) [,1] 0 vs. 1 0.8931711  

ROC görbe a caTools csomagból

Végső szavak

Úgy tűnik, sokan azt gondolják, hogy az AUC megmondja, mennyire jó egy teszt az. Néhány ember úgy gondolja, hogy az AUC annak valószínűsége, hogy a teszt helyesen osztályozza a beteget. Ez nem . Amint a fenti példából és számításokból kiderül, az AUC elmond valamit a tesztcsalád ról, egy tesztet minden lehetséges elhatároláshoz.

És az AUC-t a a gyakorlatban soha nem használt korlátokat. Miért kell törődnünk az „értelmetlen” határértékek érzékenységével és specifikumával? Mégis, ezen alapul az AUC (részben). (Természetesen, ha az AUC nagyon közel 1, akkor szinte minden lehetséges tesztnek nagy megkülönböztető ereje lesz, és mindannyian nagyon boldogok lennénk.)

A véletlenszerű normális – az AUC rendellenes párértelmezése jó (és kiterjeszthető például a túlélési modellekre is, ahol azt látjuk, hogy a legmagasabb (relatív) veszélyt jelentő személy hal-e meg leghamarabb). De az ember soha nem használja a gyakorlatban. Ritka eset, amikor tudja van egy egészséges és egy beteg ember, nem tudja, melyik a beteg, és meg kell döntse el, melyiket kezeli. (Mindenesetre a döntés könnyű; kezelje a legmagasabb becsült kockázatot.)

Tehát úgy gondolom, hogy a tényleges ROC görbe tanulmányozása hasznosabb lesz, mint pusztán az AUC összefoglaló mértéke. És ha a ROC-t a (hamis) pozitív és hamis negatívumok költségeivel (a becslésekkel) együtt használja, és a tanulmányok alapkamatával együtt, akkor eljuthat valahova.

Vegye figyelembe azt is, hogy az AUC csak a diszkriminációt méri, a kalibrálást nem. Vagyis azt méri, hogy tud-e különbséget tenni két személy (egy beteg és egy egészséges) között a kockázati pontszám alapján. Ehhez csak a relatív kockázati értékeket vizsgálja (vagy rangsorolja, ha akarja, vö. A Wilcoxon – Mann – Whitney tesztértelmezést), és nem az abszolút értékeket, amelyeket kell érdekel. Például, ha logisztikai modelljének minden kockázatbecslését elosztja 2-vel, akkor pontosan ugyanazt az AUC-t (és ROC-t) kapja.

A kockázati modell értékelésekor a kalibrálás is nagyon fontos. Ennek vizsgálatához meg kell vizsgálni az összes olyan beteget, amelynek kockázati pontszáma körülbelül 0,7, és meglátja, hogy ezeknek körülbelül 70% -a valóban beteg volt-e. Tegye ezt minden lehetséges kockázati ponthoz (esetleg valamilyen simítás / helyi regresszió alkalmazásával). Ábrázolja az eredményeket, és megkapja a kalibrálás grafikus mértékét.

Ha van olyan modellje, amely mind jó kalibrációval és jó diszkriminációval rendelkezik, akkor elkezd jó modell lenni. 🙂

Hozzászólások

  • Köszönöm, @Karl Ove Hufthammer, ez a legalaposabb válasz, amit valaha kaptam. Különösen nagyra értékelem a ” Végső szavak ” részt. Kiváló munka! Még egyszer köszönöm!
  • Nagyon köszönöm ezt a részletgazdag választ. Olyan adatkészlettel dolgozom, ahol az Epi :: ROC () v2.2.6 meggyőződése, hogy az AUC 1,62 (nem, ez nem mentalista tanulmány), de a ROC szerint sokkal többet hiszek abban a 0,56-ban, amelyet a fenti kód eredményez
  • Azt hiszem, van egy kis hiba a sens=c(sens,0); omspec=c(omspec,0) fájlban, nem kellene ‘ t lennie ennek sens=c(0, sens); omspec=c(0, omspec)? Helyesen ábrázolja a vezető 0 szöveget, de nem úgy, ahogy jelenleg a válaszban szerepel.
  • Nem, a jelenlegi meghatározás az AFAICS, helyes, @steveb, és helyes cselekményt eredményez. Azt hiszem, ami talán zavaró, az az, hogy a ROC görbét jobbról balra (azaz a jobb felső saroktól a bal alsó sarokig) húzzák, nem pedig a balról a balra igaz , mint a legtöbb cselekmény. Ez csak annak az eredménye, hogy hogyan definiáltam a változókat; éppúgy meg lehetett volna rajzolni balról jobbra (a sens és omspec megfordításával a rajzolás előtt).

Válasz

Nézze meg ezt a kérdést: A ROC görbe megértése

ROC-görbe felépítése (ebből a kérdésből):

ROC-görbe rajzolása

az Ön által feldolgozott adatkészlet rangsorolási osztályozó

  • rangsor tesztpéldák csökkenő pontszámra
  • kezdődik $ (0, 0) $ értékben
  • minden egyes $ x $ példánál (a csökkenő sorrend)
    • ha $ x $ pozitív, mozgassa a $ 1 / \ text {pos} $ felfelé
    • ha $ x $ negatív, mozgassa $ 1 / \ text {neg} $ jobbra

ahol a $ \ text {pos} $ és $ \ text {neg} $ a pozitív, illetve a negatív példák töredéke.

Ezt az ötletet felhasználhatja az AUC ROC manuális kiszámításához a következő algoritmus használatával:

auc = 0.0 height = 0.0 for each training example x_i, y_i if y_i = 1.0: height = height + tpr else auc = auc + height * fpr return auc 

Ennek a szép gif-animált képnek ezt szemléltetnie kell. folyamat tisztább

a görbe kiépítése

Megjegyzések

  • Köszönöm @Alexey Grigorev, ez egy remek látvány, és valószínűleg hasznos lesz a jövőben! +1
  • Tudna magyarázni egy kicsit a pozitív és negatív példák ” frakcióiról “, a következőre gondol: két tengely legkisebb egységértéke?
  • @Allan Ruin: pos itt a pozitív adatok számát jelenti. Mondjuk, hogy van 20 adatpontja, amelyekben 11 pont 1. Tehát a diagram megrajzolásakor van egy téglalapunk 11×9 (magasság x szélesség). Alexey Grigorev skálázott, de ha úgy tetszik, hagyta, ahogy ‘ s. Most csak lépjen egyet a diagramon minden lépésnél.

Válasz

Karl bejegyzésének sok van De az elmúlt 20 évben még nem láttam példát egy ROC-görbére, amely bárki jó irányba változtatta volna meg a gondolatait. Szerény véleményem szerint az ROC-görbe egyetlen értéke, hogy a területe nagyon hasznos konkordancia valószínűséggel esik meg. Maga a ROC görbe az olvasókat a határértékek használatára csábítja, ami rossz statisztikai gyakorlat.

A $ c $ -index manuális kiszámításához készítsen egy diagramot, amelynek $ Y = 0,1 $ a $ -on. x $ -tengely és az a folyamatos prediktor vagy előrejelzett valószínűség, hogy $ Y = 1 $ a $ y $ -tengelyen. Ha minden pontot összekapcsolunk $ Y = 0 $ -val minden egyes ponttal, amelynek $ Y = 1 $, akkor a pozitív meredekségű vonalak aránya a konkordancia valószínűsége.

Minden olyan intézkedés, amelynek nevezője: A $ n $ ebben a beállításban helytelen pontossági pontozási szabályok, ezért kerülni kell őket. Ez magában foglalja a helyes osztályozást, az érzékenységet és a specifikusságot.

Az R Hmisc csomag rcorr.cens funkcióhoz nyomtassa ki a a teljes eredmény, hogy további információkat, különösen egy szabványos hibát láthasson.

Megjegyzések

  • Köszönöm, @Frank Harell, nagyra értékelem a perspektíváját. Egyszerűen a c-statisztikát használom konkordancia valószínűségként, mivel nem szeretem ‘ -t. Még egyszer köszönöm!

Válasz

Itt található egy alternatíva az AUC kiszámításának természetes módjára a trapéz egyszerű használatával. szabály, hogy megkapja a ROC görbe alatti területet.

Az AUC megegyezik annak valószínűségével, hogy egy véletlenszerűen mintavételezett pozitív megfigyelés előrejelzett valószínűsége (pozitív lesz) nagyobb, mint egy véletlenszerűen kiválasztott negatív megfigyelés. Ezzel egyszerűen kiszámíthatja az AUC-t bármilyen programozási nyelven, a pozitív és negatív megfigyelések összes páros kombinációjának végigvitelével. Ha véletlenszerűen túl nagy a minta, akkor véletlenszerűen is megvizsgálhatja a megfigyeléseket. Ha toll és papír segítségével szeretné kiszámítani az AUC értéket, akkor ez nem biztos, hogy a legjobb módszer, hacsak nincs nagyon kis mintája / sok ideje. Például az R-ben:

n <- 100L x1 <- rnorm(n, 2.0, 0.5) x2 <- rnorm(n, -1.0, 2) y <- rbinom(n, 1L, plogis(-0.4 + 0.5 * x1 + 0.1 * x2)) mod <- glm(y ~ x1 + x2, "binomial") probs <- predict(mod, type = "response") combinations <- expand.grid(positiveProbs = probs[y == 1L], negativeProbs = probs[y == 0L]) mean(combinations$positiveProbs > combinations$negativeProbs) [1] 0.628723 

A pROC csomag segítségével ellenőrizhetjük:

library(pROC) auc(y, probs) Area under the curve: 0.6287 

Véletlenszerű mintavétel:

mean(sample(probs[y == 1L], 100000L, TRUE) > sample(probs[y == 0L], 100000L, TRUE)) [1] 0.62896 

Válasz

  1. Igazi értéke van a megfigyeléseknek.
  2. Számítsa ki a hátsó valószínűséget, majd rangsorolja a megfigyeléseket e valószínűség szerint.
  3. $ P $ és a megfigyelések száma $ N $ feltételezési valószínűségét feltételezve:
    $$ \ frac {\ text {Az igaz rangok összege} -0,5PN (PN + 1)} { PN (N-PN)} $$

megjegyzések

  • @ user73455 … 1) Igen, megvan az igazi érték megfigyelésekhez. 2) A hátsó valószínűség szinonimája az egyes megfigyelések előrejelzett valószínűségeinek? 3) Megértett; mi azonban az ” az igazi rangok összege ” és hogyan lehet ezt az értéket kiszámítani? Talán egy példa segíthet elmagyarázni ezt a választ alaposabban? Köszönöm!

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük