Come devo affrontare questo problema di previsione binaria?


9

Ho un set di dati con il seguente formato.

Previsioni del cancro senza cancro

C'è un esito binario cancro / nessun cancro. Ogni medico nel set di dati ha visto ogni paziente e ha dato un giudizio indipendente sul fatto che il paziente abbia il cancro o meno. I medici danno quindi un livello di confidenza su 5 che la loro diagnosi è corretta e il livello di confidenza è visualizzato tra parentesi.

Ho provato vari modi per ottenere buone previsioni da questo set di dati.

Funziona abbastanza bene per me solo nella media tra i dottori, ignorando i loro livelli di confidenza. Nella tabella sopra ciò avrebbe prodotto diagnosi corrette per il Paziente 1 e il Paziente 2, sebbene avrebbe erroneamente affermato che il Paziente 3 ha il cancro, poiché a maggioranza del 2-1 i medici pensano che il Paziente 3 abbia il cancro.

Ho anche provato un metodo in cui campioniamo casualmente due medici e, se non sono d'accordo tra loro, il voto decisivo va a qualunque medico sia più sicuro. Questo metodo è economico in quanto non è necessario consultare molti medici, ma aumenta anche un po 'il tasso di errore.

Ho provato un metodo correlato in cui selezioniamo a caso due medici e se non sono d'accordo tra di loro ne selezioniamo a caso altri due. Se una diagnosi è in anticipo di almeno due "voti", risolviamo le cose a favore di tale diagnosi. In caso contrario, continuiamo a campionare più medici. Questo metodo è piuttosto economico e non fa troppi errori.

Non posso fare a meno di sentire che mi manca un modo più sofisticato di fare le cose. Ad esempio, mi chiedo se esiste un modo per dividere il set di dati in training e set di test, e trovare un modo ottimale per combinare le diagnosi e quindi vedere come si comportano quei pesi sul set di test. Una possibilità è una sorta di metodo che mi consente di medici in sovrappeso che hanno continuato a commettere errori sul set di prova e forse diagnosi di sovrappeso eseguite con elevata sicurezza (la fiducia non è correlata all'accuratezza in questo set di dati).

Ho diversi set di dati che corrispondono a questa descrizione generale, quindi le dimensioni del campione variano e non tutti i set di dati si riferiscono a medici / pazienti. Tuttavia, in questo particolare set di dati ci sono 40 medici, ognuno dei quali ha visto 108 pazienti.

EDIT: Ecco un link ad alcuni dei coefficienti correttori che derivano dalla mia lettura della risposta di @ jeremy-miles.

  1. I risultati non ponderati si trovano nella prima colonna. In realtà in questo set di dati il ​​valore di confidenza massimo era 4, non 5, come ho detto per errore in precedenza. Quindi, seguendo l'approccio di @ jeremy-miles, il punteggio più alto non ponderato che un paziente potrebbe ottenere sarebbe 7. Ciò significherebbe che letteralmente ogni medico ha affermato con un livello di confidenza di 4 che quel paziente aveva il cancro. Il punteggio non ponderato più basso che un paziente possa ottenere è 0, il che significherebbe che ogni medico ha affermato con un livello di confidenza di 4 che quel paziente non aveva il cancro.

  2. Ponderazione di Alpha di Cronbach. Ho scoperto in SPSS che c'era un Alpha di Cronbach complessivo di 0.9807. Ho provato a verificare che questo valore fosse corretto calcolando l'Alfa di Cronbach in un modo più manuale. Ho creato una matrice di covarianza di tutti e 40 i medici, che ho incollato qui . Quindi in base alla mia comprensione della formula Alpha di Cronbach dove è il numero di elementi (qui i dottori sono gli "elementi") che ho calcolato sommando tutti gli elementi diagonali nella matrice di covarianza e sommando tutti gli elementi in la matrice di covarianza. Poi ho ottenutoα=KK1(1σxi2σT2)Kσxi2σT2α=40401(18.7915200.7112)=0.9807 Ho quindi calcolato i 40 diversi risultati di Cronbach Alpha che si sarebbero verificati quando ogni medico fosse stato rimosso dal set di dati. Ho ponderato qualsiasi medico che abbia contribuito negativamente all'Alfa di Cronbach a zero. Mi sono inventato pesi per i rimanenti medici proporzionali al loro contributo positivo all'Alfa di Cronbach.

  3. Ponderazione per correlazioni totali degli articoli. Calcolo tutte le correlazioni totali degli articoli, quindi peso ciascun medico in proporzione alla dimensione della sua correlazione.

  4. Ponderazione per coefficienti di regressione.

Una cosa di cui non sono ancora sicuro è come dire quale metodo funziona "meglio" dell'altro. In precedenza avevo calcolato cose come Peirce Skill Score, che è appropriato per i casi in cui esiste una previsione binaria e un risultato binario. Tuttavia, ora ho previsioni che vanno da 0 a 7 anziché da 0 a 1. Devo convertire tutti i punteggi ponderati> 3,50 a 1 e tutti i punteggi ponderati <3,50 a 0?


Possiamo dire che lo No Cancer (3)è Cancer (2)? Ciò semplificherebbe un po 'il tuo problema.
Wayne,

1
Ri: la tua struttura di dati, è quasi sempre meglio avere diverse variabili (se il paziente ha il cancro; quanto è sicura la valutazione) in colonne diverse. Combinarli come in "no cancer (3)" limita fortemente le opzioni.
rolando2,

@Wayne I dati vanno dalla previsione del cancro con la massima fiducia Cancer (4)alla previsione di nessun cancro con la massima fiducia No Cancer (4). Non possiamo dirlo No Cancer (3)e Cancer (2)sono gli stessi, ma potremmo dire che c'è un continuum, e i punti centrali di questo continuum sono Cancer (1)e No Cancer (1).
user1205901 - Ripristina Monica il

@ rolando2 Grazie per il consiglio. Ho riorganizzato le cose nel mio file di dati in modo che ora siano separate.
user1205901 - Ripristina Monica

1
Si noti che la soglia è un parametro sintonizzabile , quindi l'interruzione appropriata dipenderà dal criterio di valutazione. Dato che non avevo familiarità con la tua metrica, l'ho cercato su Google, e in realtà il primo colpo potrebbe essere rilevante per te: una nota sul punteggio massimo di abilità Peirce (2007) .
GeoMatt22,

Risposte:


7

In primo luogo, vorrei vedere se i medici sono d'accordo l'uno con l'altro. Non puoi analizzare 50 dottori separatamente, perché indosserai troppo il modello: un dottore sembrerà fantastico, per caso.

Potresti provare a combinare sicurezza e diagnosi in una scala da 10 punti. Se un medico dice che il paziente non ha il cancro e che sono molto fiduciosi, questo è un 0. Se il dottore dice che hanno il cancro e sono molto fiduciosi, questo è un 9. Se il loro dottore dice di no, e non sono fiducioso, questo è un 5, ecc.

Quando stai cercando di prevedere, fai una sorta di analisi di regressione, ma pensando all'ordinamento causale di queste variabili, è il contrario. Se il paziente ha il cancro è la causa della diagnosi, il risultato è la diagnosi.

Le tue righe dovrebbero essere pazienti e le tue colonne dovrebbero essere dottori. Ora hai una situazione comune in psicometria (motivo per cui ho aggiunto il tag).

Quindi guarda le relazioni tra i punteggi. Ogni paziente ha un punteggio medio e un punteggio per ciascun medico. Il punteggio medio è correlato positivamente con il punteggio di ogni medico? In caso contrario, quel medico probabilmente non è degno di fiducia (questa è chiamata correlazione totale-articolo). A volte rimuovi un medico dal punteggio totale (o dal punteggio medio) e vedi se quel medico è correlato alla media di tutti gli altri medici: questa è la correlazione totale dell'elemento corretto.

È possibile calcolare l'alfa di Cronbach (che è una forma di correlazione intra-classe) e l'alfa senza ciascun medico. Alpha dovrebbe sempre aumentare quando si aggiunge un medico, quindi se aumenta quando si rimuove un medico, la valutazione di quel medico è sospetta (ciò spesso non indica nulla di diverso dalla correlazione totale oggetto corretta).

Se usi R, questo genere di cose è disponibile nel pacchetto psichico, usando la funzione alfa. Se usi Stata, il comando è alpha, in SAS è proc corr e in SPSS è sotto scala, affidabilità.

Quindi puoi calcolare un punteggio, come il punteggio medio di ciascun medico, o la media ponderata (ponderata dalla correlazione) e vedere se quel punteggio è predittivo della vera diagnosi.

Oppure potresti saltare quella fase e regredire il punteggio di ciascun medico sulla diagnosi separatamente e trattare i parametri di regressione come pesi.

Sentiti libero di chiedere chiarimenti e, se vuoi un libro, mi piacciono le scale di misurazione della salute di Streiner e Norman.

-Modifica: basato su ulteriori informazioni sui PO.

Wow, è un diavolo dell'alfa di Cronbach. L'unica volta che l'ho visto così in alto è quando è stato fatto un errore.

Vorrei ora fare la regressione logistica e guardare le curve ROC.

La differenza tra ponderazione per regressione e correlazione dipende da come credi che i medici stiano rispondendo. Alcuni documenti potrebbero essere generalmente più sicuri (senza essere più abili), e quindi potrebbero usare di più le gamme estreme. Se vuoi correggerlo, usa la correlazione piuttosto che la regressione. Probabilmente soppeserei per regressione, poiché ciò mantiene i dati originali (e non elimina alcuna informazione).

Modifica (2): ho eseguito i modelli di regressione logistica in R per vedere quanto ciascuno ha previsto l'output. tl / dr: non c'è niente tra di loro.

Ecco il mio codice:

d <- read.csv("Copy of Cancer data - Weightings.csv")

mrc <- glm(cancer ~ weightrc, data = d, family = "binomial")
mun <- glm(cancer ~ unweight, data = d, family = "binomial")
mca <- glm(cancer ~ weightca, data = d, family = "binomial")
mic <- glm(cancer ~ weightic, data = d, family = "binomial")

d$prc <- predict(mrc, type = "response")
d$pun <- predict(mun, type = "response")
d$pca <- predict(mca, type = "response")
d$pic <- predict(mic, type = "response")

par(mfrow = c(2, 2))
roc(d$cancer, d$prc, ci = TRUE, plot = TRUE)
roc(d$cancer, d$pun, ci = TRUE, plot = TRUE)
roc(d$cancer, d$pca, ci = TRUE, plot = TRUE)
roc(d$cancer, d$pic, ci = TRUE, plot = TRUE)

4 curve ROC

E l'output:

> par(mfrow = c(2, 2))
> roc(d$cancer, d$prc, ci = TRUE, plot = TRUE)

Call:
roc.default(response = d$cancer, predictor = d$prc, ci = TRUE,     plot = TRUE)

Data: d$prc in 81 controls (d$cancer 0) < 27 cases (d$cancer 1).
Area under the curve: 0.9831
95% CI: 0.9637-1 (DeLong)
> roc(d$cancer, d$pun, ci = TRUE, plot = TRUE)

Call:
roc.default(response = d$cancer, predictor = d$pun, ci = TRUE,     plot = TRUE)

Data: d$pun in 81 controls (d$cancer 0) < 27 cases (d$cancer 1).
Area under the curve: 0.9808
95% CI: 0.9602-1 (DeLong)
> roc(d$cancer, d$pca, ci = TRUE, plot = TRUE)

Call:
roc.default(response = d$cancer, predictor = d$pca, ci = TRUE,     plot = TRUE)

Data: d$pca in 81 controls (d$cancer 0) < 27 cases (d$cancer 1).
Area under the curve: 0.9854
95% CI: 0.9688-1 (DeLong)
> roc(d$cancer, d$pic, ci = TRUE, plot = TRUE)

Call:
roc.default(response = d$cancer, predictor = d$pic, ci = TRUE,     plot = TRUE)

Data: d$pic in 81 controls (d$cancer 0) < 27 cases (d$cancer 1).
Area under the curve: 0.9822
95% CI: 0.9623-1 (DeLong)

1
Molto bene. E, poiché il tuo ragionamento lo consente, è possibile che alcuni dottori peggiorino l'alfa, contribuendo con una visione unica e contrastando la tendenza.
rolando2,

@ jeremy-miles Grazie per questa risposta e per la gentile offerta di porre domande al riguardo. Ho cercato di attuare ciò che mi hai suggerito e ho modificato il PO per pubblicare alcuni dei risultati. La cosa principale di cui mi chiedo è se ho interpretato correttamente il tuo post, e anche ciò che sarebbe necessario per dimostrare che alcuni metodi di aggregazione funzionano meglio di altri metodi nella previsione del risultato.
user1205901 - Ripristina Monica il

Grazie per aver pubblicato i dati. Lo darò un'occhiata più tardi. (Quale software stai usando?)
Jeremy Miles il

@JeremyMiles Grazie per aver pubblicato questa modifica! Sto usando MATLAB, ma so abbastanza su R per spostarmi verso l'alto e usarlo invece, poiché hai già pubblicato il codice R. Ho calcolato che Alpha di Cronbach in SPSS - ottieni un valore diverso da R?
user1205901 - Ripristina Monica il

1
Sì, è quello che stavo pensando. Quindi ogni medico ha un peso diverso.
Jeremy Miles,

2

Due suggerimenti predefiniti:

  1. È possibile utilizzare pesi sulla funzione di perdita della regressione logistica, in modo che il medico che è molto sicuro che il paziente abbia il cancro con P = 1 ottenga il doppio dell'impatto e un altro che afferma di avere un cancro con P = 0,75. Non dimenticare di trasformare correttamente le tue probabilità in pesi.
  2. Una famiglia di modelli spesso trascurati sono i modelli di classificazione. All'interno delle classifiche ci sono tre grandi gruppi: classifica per elenco, per punto e per coppia, a seconda di quale sia il tuo input. Sembra che potresti usare la classificazione puntuale nel tuo caso.

Puoi suggerire un modo per trasformare correttamente le probabilità in pesi? Ho provato a cercare su Google questo concetto ma non sono riuscito a trovare alcun consiglio chiaro su come farlo.
user1205901 - Ripristina Monica il

@ user1205901, avevo in mente qualcosa di molto semplice come: Let P= probabilità di essere un cancro dato dal medico, quindi (in notazione pitone): y=[1 if p >= 0.5 else 0 for p in P]e w=[abs(p-0.5)*2 for p in P]. Quindi allenare il modello:LogisticRegression().fit(X,y,w)
Ricardo Cruz, il

Nella funzione di perdita, questo darà, ad esempio, il doppio del peso a 0,1 rispetto a 0,2 per non essere il cancro (0,1 -> 0,8 e 0,2 -> 0,6). Se il medico non è sicuro (P ~ 0,5), l'osservazione non contribuisce quasi alla perdita. Qualunque modello utilizzi deve supportare l'aggiunta di un vettore di costo alla funzione di perdita, che la maggior parte dei modelli supporta. Non so se questo va bene, ma sembra banale da provare. Deve prima specificare una metrica. La funzione di perdita può essere ulteriormente adattata a qualsiasi metrica desideri massimizzare.
Ricardo Cruz,

2

(Questo non rientra nella mia area di competenza, quindi la risposta di Jeremy Miles potrebbe essere più affidabile.)

Ecco un'idea.

i=1Nci{0,1}j=1mdij{0,1}

dijci

p[c]1Nici

p[dj|c]idijciici
jci

p[dj|c,wj]idijwijciiwijci
wij0dij

w[0,1]

p[dw]=dw(1d)1w
d=0

0^0=10^0=NaNw(0,1)k{1K}w=k/(K+1)


No Cancer (3) = Cancer (2)w[k]=kK25=135No Cancer (3) = Cancer (3)w[k]=kK+136=136

p[dj|c,wj]idijwijciiwijci

dδ[0,1]d{0,1}δi=wi(di=1)+(1wi)(di=0)δ=[0.8,0.4,0.8]p[c,δ]=cδ¯=0.8+0+0.83=230.8p[2]=c¯=23p[δ]=δ¯=560.8p[c|δ]=p[c,δ]/p[δ]=0.8p[δ|c]=p[c,δ]/p[c]=0.8

0

Dalla tua domanda, sembra che quello che vuoi testare sia il tuo sistema di misurazione. Nel regno dell'ingegneria di processo, si tratterebbe di un'analisi del sistema di misurazione degli attributi o di MSA.

Questo collegamento fornisce alcune informazioni utili sulla dimensione del campione necessaria e i calcoli eseguiti per condurre uno studio di questo tipo. https://www.isixsigma.com/tools-templates/measurement-systems-analysis-msa-gage-rr/making-sense-attribute-gage-rr-calculations/

Con questo studio, avresti anche bisogno del medico per diagnosticare lo stesso paziente con le stesse informazioni almeno due volte.

Puoi condurre questo studio in due modi. È possibile utilizzare la semplice classificazione del cancro / nessun tipo di cancro per determinare l'accordo tra i medici e da ciascun medico. Idealmente, dovrebbero anche essere in grado di diagnosticare con lo stesso livello di fiducia. È quindi possibile utilizzare la scala completa di 10 punti per verificare l'accordo tra e per ciascun medico. (Tutti dovrebbero essere d'accordo sul fatto che il cancro (5) abbia lo stesso punteggio, che nessun cancro (1) abbia lo stesso punteggio, ecc.)

I calcoli nel sito Web collegato sono semplici da eseguire su qualsiasi piattaforma che si sta utilizzando per i test.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.