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)
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")
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))
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"
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):
(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
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
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
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
- Igazi értéke van a megfigyeléseknek.
- Számítsa ki a hátsó valószínűséget, majd rangsorolja a megfigyeléseket e valószínűség szerint.
- $ 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!
sens=c(sens,0); omspec=c(omspec,0)
fájlban, nem kellene ‘ t lennie enneksens=c(0, sens); omspec=c(0, omspec)
? Helyesen ábrázolja a vezető0
szöveget, de nem úgy, ahogy jelenleg a válaszban szerepel.sens
ésomspec
megfordításával a rajzolás előtt).