Interpretazione e validazione di un modello di regressione dei rischi proporzionali di Cox usando R in un inglese semplice


13

Qualcuno può spiegarmi il mio modello Cox in un inglese semplice?

Ho adattato il seguente modello di regressione di Cox a tutti i miei dati usando la cphfunzione. I miei dati vengono salvati in un oggetto chiamato Data. Le variabili w, xe ysono continue; zè un fattore di due livelli. Il tempo è misurato in mesi. Ad alcuni dei miei pazienti mancano i dati per la variabile z( NB : ho debitamente notato il suggerimento del Dr. Harrell, di seguito, che imputo questi valori in modo da evitare di influenzare il mio modello e lo farò in futuro).

> fit <- cph(formula = Surv(time, event) ~ w + x + y + z, data = Data, x = T, y = T, surv = T, time.inc = 12)

Cox Proportional Hazards Model
Frequencies of Missing Values Due to Each Variable
Surv(time, event)    w    x    y    z 
                0    0    0    0   14 

                Model Tests          Discrimination 
                                            Indexes        
Obs       152   LR chi2      8.33    R2       0.054    
Events     64   d.f.            4    g        0.437    
Center 0.7261   Pr(> chi2) 0.0803    gr       1.548    
                Score chi2   8.07                      
                Pr(> chi2) 0.0891                      

                   Coef    S.E.   Wald Z   Pr(>|Z|)
         w      -0.0133  0.0503    -0.26     0.7914  
         x      -0.0388  0.0351    -1.11     0.2679  
         y      -0.0363  0.0491    -0.74     0.4600  
         z=1     0.3208  0.2540     1.26     0.2067

Ho anche provato a testare l'assunzione di rischi proporzionali usando il cox.zphcomando di seguito, ma non so come interpretarne i risultati. Mettendo plot()attorno al comando viene visualizzato un messaggio di errore.

 cox.zph(fit, transform="km", global=TRUE)
            rho chisq      p
 w      -0.1125 1.312 0.2520
 x       0.0402 0.179 0.6725
 y       0.2349 4.527 0.0334
 z=1     0.0906 0.512 0.4742
 GLOBAL      NA 5.558 0.2347

Primo problema

  • Qualcuno può spiegarmi i risultati dell'output di cui sopra in un inglese semplice? Ho un background medico e nessuna formazione formale in statistica.

Secondo problema

  • Come suggerito dal Dr. Harrell, vorrei validare internamente il mio modello eseguendo 100 iterazioni di 10 convalide incrociate usando il rmspacchetto (da quello che ho capito, ciò comporterebbe la costruzione di 100 * 10 = 1000modelli diversi e quindi chiedendo loro di prevedere i tempi di sopravvivenza di pazienti che non avevano mai visto).

    Ho provato a usare la validatefunzione, come mostrato.

    > v1 <- validate(fit, method="crossvalidation", B = 10, dxy=T)
    > v1
          index.orig training    test optimism index.corrected  n
    Dxy      -0.2542  -0.2578 -0.1356  -0.1223         -0.1320 10
    R2        0.0543   0.0565  0.1372  -0.0806          0.1350 10
    Slope     1.0000   1.0000  0.9107   0.0893          0.9107 10
    D         0.0122   0.0128  0.0404  -0.0276          0.0397 10
    U        -0.0033  -0.0038  0.0873  -0.0911          0.0878 10
    Q         0.0155   0.0166 -0.0470   0.0636         -0.0481 10
    g         0.4369   0.4424  0.6754  -0.2331          0.6700 10

    Come si esegue il ricampionamento 100x? Penso che il mio codice sopra esegua la convalida incrociata solo una volta.

  • Volevo quindi sapere quanto fosse buono il mio modello nella previsione. Ho provato quanto segue:

    > c_index <- abs(v1[1,5])/2 + 0.5
    > c_index
    [1] 0.565984

    Questo significa che il mio modello è solo leggermente migliore rispetto al lancio di una moneta?

Terzo problema

Il Dr. Harrell sottolinea che ho assunto la linearità per gli effetti della covariata e che il numero di eventi nel mio campione è appena abbastanza grande da adattarsi a un modello affidabile se tutti gli effetti della covariata risultano essere lineari.

  • Questo significa che dovrei includere una sorta di termine di interazione nel mio modello? In tal caso, qualche consiglio su cosa mettere?

2
Ho apportato alcune importanti modifiche alla mia domanda iniziale, sopra, circa tre ore dopo che l'ho posta inizialmente. Ho cercato di seguire i consigli molto utili del Dr. Harrell. Lo apprezzerei ancora se qualcuno tentasse di spiegarmi l' cphoutput di cui sopra in un inglese semplice o di indicarmi un riferimento che lo farebbe. Dr. Harrell, grazie mille per il tuo aiuto finora!
Alexander,

Risposte:


12

Per iniziare, considera alcune cose. Innanzitutto, stai escludendo troppe osservazioni con dati mancanti e questo causerà una distorsione. Considera l'imputazione multipla. In secondo luogo, esiste un metodo di trama percox.zphche è utile per valutare i rischi proporzionali. Terzo, hai assunto la linearità per gli effetti della covariata. In quarto luogo, il numero di eventi nel campione di allenamento è appena abbastanza grande da adattarsi a un modello affidabile se tutti gli effetti della covariata risultano essere lineari (il che è raro). E il tuo campione di test dovrebbe avere forse 400 eventi prima di produrre una valutazione affidabile dell'accuratezza della previsione. Non è chiaro che si disponessero di dati sufficienti per dividere i dati in due parti. Il ricampionamento della convalida (100 ripetizioni di 10 convalide incrociate o l'uso del bootstrap) è una soluzione migliore. Sia la tua validazione esterna originale (funzioni rcorr.cense val.surv) che il ricampionamento validazione interna (funzioni validate, calibrate) sono implementati nel rmspacchetto R. Casi studio per ilrms2×2


1
Dr. Harrell, grazie mille per i tuoi commenti. Ho provato a digitare plot(cox.zph(fit[[1]], transform="km", global=TRUE)), tuttavia, questo ha fruttato Error in plot.cox.zph(cox.zph(fit[[1]], transform = "km", global = TRUE)) : Spline fit is singular, try a smaller degrees of freedom. Sto chiamando questa funzione in modo errato?
Alexander,

1
Se unisco i miei dati di allenamento e di validazione, ho 166 osservazioni con 75 eventi. Come hai suggerito, posso imputare i valori della mia variabile "z" per le mie 13 osservazioni a cui mancano quei dati, eliminando quel problema. Mi piace il tuo suggerimento di eseguire la convalida incrociata 100x 10 volte. Se hai tempo, apprezzerei molto se tu potessi offrire un suggerimento più concreto su come usare i pacchetti rms per farlo. Nel frattempo, continuerò a leggere il tuo sito web. Mi piacerebbe seguire il tuo corso in futuro. Purtroppo al momento sono in Europa, un po 'troppo lontano!
Alexander,

2
Per il problema della singolarità, fallo plot(cox.zph(...), df=2). Vedi i casi studio nelle note del corso per rmsesempi o installa il pacchetto (che ha bisogno anche del Hmiscpacchetto) e digita questi comandi per visualizzare i file della guida:?cph ?validate.cph ?calibrate.cph
Frank Harrell,

2
Grazie ancora per il vostro aiuto! Questo fine settimana ho stampato i tuoi appunti del corso e passerò questa settimana a leggerli e a lavorare su tutti i casi di studio.
Alexander,

4

L'output della funzione R CPH, sulla base di un esempio rilevante, è spiegato in questo facile da seguire carta da J. Fox.

Consiglio vivamente di leggere questo documento se non lo hai già fatto.


1
Puoi descrivere come il documento suggerisce di interpretare l' cphoutput?
smillig,

2
+1 Grazie per il riferimento e benvenuto in questo sito! Sarebbe bello se tu potessi anche dare una breve panoramica del contenuto del documento mentre cerchiamo risposte che possano resistere da sole.
Galà,

Questo link non c'è più
Marcin Kosiński,

1
Il link socialsciences.mcmaster.ca/jfox/Books/Companion-1E/… funziona attualmente e sembra essere lo stesso documento a cui fa riferimento questa risposta.
dnlbrky,
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.