Interpretación y validación de un modelo de regresión de riesgos proporcionales de Cox usando R en inglés simple

13

¿Alguien puede explicarme mi modelo de Cox en inglés simple?

Ajusté el siguiente modelo de regresión de Cox a todos mis datos usando la cphfunción. Mis datos se guardan en un objeto llamado Data. Las variables w, xy yson continuas; zEs un factor de dos niveles. El tiempo se mide en meses. A algunos de mis pacientes les faltan datos para la variable z( Nota : He notado debidamente la sugerencia del Dr. Harrell, a continuación, de que imputo estos valores para evitar sesgar mi modelo, y lo haré en el 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

También traté de probar la suposición de riesgos proporcionales usando el cox.zphcomando, a continuación, pero no sé cómo interpretar sus resultados. Poner plot()alrededor del comando da un mensaje de error.

 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

Primer problema

  • ¿Alguien puede explicarme los resultados de la salida anterior en inglés simple? Tengo antecedentes médicos y no tengo capacitación formal en estadística.

Segundo problema

  • Como lo sugirió el Dr. Harrell, me gustaría validar internamente mi modelo realizando 100 iteraciones de validación cruzada 10 veces utilizando el rmspaquete (por lo que entiendo, esto implicaría construir 100 * 10 = 1000diferentes modelos y luego pedirles que predigan los tiempos de supervivencia de pacientes que nunca habían visto).

    Intenté usar la validatefunción, como se muestra.

    > 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

    ¿Cómo se realiza el muestreo de 100x? Creo que mi código anterior solo realiza la validación cruzada una vez.

  • Entonces quería saber qué tan bueno era mi modelo en la predicción. Intenté lo siguiente:

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

    ¿Significa esto que mi modelo es solo un poco mejor que lanzar una moneda?

Tercer problema

El Dr. Harrell señala que asumí la linealidad de los efectos covariables, y que el número de eventos en mi muestra es apenas lo suficientemente grande como para ajustarse a un modelo confiable si todos los efectos covariables son lineales.

  • ¿Significa esto que debería incluir algún tipo de término de interacción en mi modelo? Si es así, ¿algún consejo sobre qué poner?
Alejandro
fuente
2
Hice algunas ediciones importantes a mi pregunta inicial, más arriba, unas tres horas después de haberla hecho inicialmente. He tratado de seguir los consejos muy útiles del Dr. Harrell. Realmente lo agradecería si alguien intentara explicarme el cphresultado anterior en inglés simple o me indicara una referencia que lo hiciera. Dr. Harrell, ¡muchas gracias por su ayuda hasta ahora!
Alexander

Respuestas:

12

Para comenzar, considere algunas cosas. Primero, está excluyendo demasiadas observaciones con datos faltantes y esto provocará un sesgo. Considere la imputación múltiple. En segundo lugar, hay un método de trazado paracox.zphlo cual es útil para evaluar los riesgos proporcionales. En tercer lugar, ha asumido la linealidad de los efectos covariables. Cuarto, el número de eventos en su muestra de entrenamiento es apenas lo suficientemente grande como para ajustarse a un modelo confiable si todos los efectos covariables son lineales (lo cual es raro). Y su muestra de prueba tendría que tener quizás 400 eventos antes de obtener una evaluación confiable de la precisión de la predicción. No está claro que tenía suficientes datos para dividir los datos en dos partes. La validación de remuestreo (100 repeticiones de validación cruzada 10 veces, o usar el bootstrap) es una mejor solución. Tanto su validación externa original (funciones rcorr.censy val.surv) como la validación interna de remuestreo (funciones validate, calibrate) se implementan en el rmspaquete R. Estudios de caso para elrmsel paquete se encuentra en mis notas del curso en2×2

Frank Harrell
fuente
1
Dr. Harrell, muchas gracias por sus comentarios. Traté de escribir plot(cox.zph(fit[[1]], transform="km", global=TRUE)), sin embargo, esto arrojó Error in plot.cox.zph(cox.zph(fit[[1]], transform = "km", global = TRUE)) : Spline fit is singular, try a smaller degrees of freedom. ¿Estoy llamando a esta función incorrectamente?
Alexander
1
Si combino mis datos de entrenamiento y validación, tengo 166 observaciones con 75 eventos. Como sugirió, puedo imputar los valores de mi variable "z" para mis 13 observaciones a las que les faltan esos datos, eliminando ese problema. Me gusta su sugerencia de realizar una validación cruzada de 100x 10 veces. Si tiene tiempo, realmente le agradecería si pudiera ofrecer una pista más concreta sobre cómo usar los paquetes rms para hacer esto. Mientras tanto, continuaré leyendo su sitio web. Me encantaría seguir tu curso en el futuro. Desafortunadamente, estoy en Europa en este momento, ¡un poco demasiado lejos!
Alexander
2
Para el problema de la singularidad, hazlo plot(cox.zph(...), df=2). Consulte los estudios de caso en las notas del curso para ver rmsejemplos o instale el paquete (que también necesita el Hmiscpaquete) y escriba estos comandos para que aparezcan los archivos de ayuda:?cph ?validate.cph ?calibrate.cph
Frank Harrell
2
¡De nuevo, gracias por tu ayuda! Este fin de semana imprimí las notas de tu curso y pasaré esta semana leyéndolas y trabajando en todos los casos de estudio.
Alexander
4

La salida de la función R CPH, en base a un ejemplo relevante, se explica en este fácil de seguimiento de papel por J. Fox.

Recomiendo leer este documento si aún no lo ha hecho.

Zhubarb
fuente
1
¿Puedes describir cómo el documento sugiere interpretar el cphresultado?
smillig
2
+1 ¡Gracias por la referencia y bienvenido a este sitio! Sería genial si también pudieras dar una descripción sucinta de los contenidos del documento a medida que buscamos respuestas que puedan ser independientes.
Gala
Este enlace ya no está allí
Marcin Kosiński
1
El enlace socialsciences.mcmaster.ca/jfox/Books/Companion-1E/… está funcionando actualmente y parece ser el mismo documento al que se hace referencia en esta respuesta.
dnlbrky