Interprétation et validation d'un modèle de régression des risques proportionnels de Cox à l'aide de R en anglais simple

13

Quelqu'un peut-il m'expliquer mon modèle Cox en anglais simple?

J'ai ajusté le modèle de régression de Cox suivant à toutes mes données en utilisant la cphfonction. Mes données sont enregistrées dans un objet appelé Data. Les variables w, xet ysont continues; zest un facteur de deux niveaux. Le temps est mesuré en mois. Certains de mes patients n'ont pas de données pour la variable z( NB : j'ai dûment noté la suggestion du Dr Harrell, ci-dessous, que j'impute ces valeurs afin d'éviter de biaiser mon modèle, et que je le ferai à l'avenir).

> 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

J'ai également essayé de tester l'hypothèse de risques proportionnels en utilisant la cox.zphcommande ci-dessous, mais je ne sais pas comment interpréter ses résultats. Contourner plot()la commande donne un message d'erreur.

 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

Premier problème

  • Quelqu'un peut-il m'expliquer les résultats de la sortie ci-dessus en anglais simple? J'ai une formation médicale et aucune formation officielle en statistique.

Deuxième problème

  • Comme suggéré par le Dr Harrell, je voudrais valider en interne mon modèle en effectuant 100 itérations de validation croisée 10 fois en utilisant le rmspackage (d'après ce que je comprends, cela impliquerait de construire 100 * 10 = 1000différents modèles et de leur demander de prédire les temps de survie patients qu'ils n'avaient jamais vus).

    J'ai essayé d'utiliser la validatefonction, comme indiqué.

    > 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

    Comment effectuez-vous le rééchantillonnage 100x? Je pense que mon code ci-dessus n'effectue la validation croisée qu'une seule fois.

  • J'ai ensuite voulu savoir à quel point mon modèle était bon en prédiction. J'ai essayé ce qui suit:

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

    Est-ce à dire que mon modèle n'est que très légèrement meilleur que de lancer une pièce?

Troisième problème

Le Dr Harrell souligne que j'ai supposé la linéarité pour les effets de covariable et que le nombre d'événements dans mon échantillon est à peine assez grand pour correspondre à un modèle fiable si tous les effets de covariable se trouvent être linéaires.

  • Est-ce à dire que je devrais inclure une sorte de terme d'interaction dans mon modèle? Si oui, des conseils sur quoi mettre?
Alexandre
la source
2
J'ai apporté quelques modifications majeures à ma question initiale, ci-dessus, environ trois heures après l'avoir posée au départ. J'ai essayé de suivre les conseils très utiles du Dr Harrell. Je serais toujours très reconnaissant si quelqu'un tentait de m'expliquer la cphsortie ci-dessus dans un anglais simple, ou me pointait vers une référence qui le ferait. Dr Harrell, merci beaucoup pour votre aide jusqu'à présent!
Alexander

Réponses:

12

Pour commencer, considérez quelques points. Tout d'abord, vous excluez trop d'observations avec des données manquantes et cela entraînera un biais. Considérez l'imputation multiple. Deuxièmement, il existe une méthode de tracé pourcox.zphce qui est utile pour évaluer les risques proportionnels. Troisièmement, vous avez supposé la linéarité des effets de covariable. Quatrièmement, le nombre d'événements dans votre échantillon d'apprentissage est à peine suffisant pour correspondre à un modèle fiable si tous les effets de covariables se trouvent être linéaires (ce qui est rare). Et votre échantillon de test devrait avoir peut-être 400 événements avant de produire une évaluation fiable de la précision de la prédiction. Il n'est pas clair que vous disposiez de suffisamment de données pour diviser les données en deux parties. La validation du rééchantillonnage (100 répétitions de 10 fois la validation croisée, ou utilisez le bootstrap) est une meilleure solution. Les deux votre validation externe d' origine (fonctions rcorr.censet val.surv) et rééchantillonnage validation interne (fonctions validate, calibrate) sont mises en œuvre dans le R rmspackage. Études de cas pour lerms2×2

Frank Harrell
la source
1
Dr Harrell, merci beaucoup pour vos commentaires. J'ai essayé de taper plot(cox.zph(fit[[1]], transform="km", global=TRUE)), cependant, cela a donné Error in plot.cox.zph(cox.zph(fit[[1]], transform = "km", global = TRUE)) : Spline fit is singular, try a smaller degrees of freedom. Suis-je appeler cette fonction de manière incorrecte?
Alexander
1
Si je combine mes données d'entraînement et de validation, j'ai 166 observations avec 75 événements. Comme vous l'avez suggéré, je peux imputer les valeurs de ma variable "z" pour mes 13 observations qui manquent ces données, éliminant ainsi ce problème. J'aime votre suggestion d'effectuer une validation croisée 100x 10 fois. Si vous avez le temps, j'apprécierais vraiment si vous pouviez offrir un indice plus concret sur la façon d'utiliser les packages rms pour ce faire. En attendant, je continuerai à parcourir votre site Web. J'adorerais suivre votre cours à l'avenir. Malheureusement, je suis en Europe en ce moment, un peu trop loin!
Alexander
2
Pour le problème de singularité, faites plot(cox.zph(...), df=2). Voir les études de cas dans les notes de cours pour des rmsexemples ou installer le package (qui a également besoin du Hmiscpackage) et tapez ces commandes pour afficher les fichiers d'aide:?cph ?validate.cph ?calibrate.cph
Frank Harrell
2
Merci encore pour votre aide! Ce week-end, j'ai imprimé vos notes de cours et passerai cette semaine à les lire et à parcourir toutes les études de cas.
Alexander
4

La sortie de la fonction R cph, sur la base d' un exemple pertinent, est expliqué dans ce facile à suivre papier par J. Fox.

Je vous conseille fortement de lire ce document si vous ne l'avez pas déjà fait.

Zhubarb
la source
1
Pouvez-vous décrire comment l'article suggère d'interpréter le cphrésultat?
smillig
2
+1 Merci pour la référence et bienvenue sur ce site! Ce serait formidable si vous pouviez également donner un aperçu succinct du contenu de l'article alors que nous nous efforçons d'obtenir des réponses qui peuvent se suffire à elles-mêmes.
Gala du
Ce lien n'est plus là
Marcin Kosiński
1
Le lien socialsciences.mcmaster.ca/jfox/Books/Companion-1E/… fonctionne actuellement et semble être le même document référencé dans cette réponse.
dnlbrky