16 votos

Interpretación y validación de un modelo de regresión de riesgos proporcionales de Cox utilizando R en lenguaje sencillo

¿Puede alguien explicarme el modelo de Cox en lenguaje sencillo?

He ajustado el siguiente modelo de regresión de Cox para todo de mis datos utilizando el cph función. Mis datos se guardan en un objeto llamado Data . Las variables w , x y y son continuos; z es un factor de dos niveles. El tiempo se mide en meses. A algunos de mis pacientes les faltan datos para la variable z ( NB : He tomado buena nota de la sugerencia del Dr. Harrell, más abajo, de que impute estos valores para no sesgar mi modelo, y así 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 el supuesto de riesgos proporcionales utilizando el cox.zph más abajo, pero no sabe cómo interpretar sus resultados. Poniendo 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

  • ¿Puede alguien explicarme los resultados de la salida anterior en un lenguaje sencillo? Tengo formación médica y no tengo formación formal en estadística.

Segundo problema

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

    Intenté usar el validate 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 remuestreo 100x? Creo que mi código anterior sólo realiza la validación cruzada una vez.

  • A continuación, quise saber lo bueno que era mi modelo en la predicción. Probé lo siguiente:

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

    ¿Significa esto que mi modelo es sólo ligeramente mejor que lanzar una moneda?

Tercer problema

El Dr. Harrell señala que he asumido la linealidad de los efectos de las covariables, y que el número de eventos en mi muestra es apenas lo suficientemente grande como para ajustar un modelo fiable si todos los efectos de las covariables resultan ser lineales.

  • ¿Significa esto que debo incluir algún tipo de término de interacción en mi modelo? Si es así, ¿algún consejo sobre qué poner?

2 votos

He hecho algunas modificaciones importantes a mi pregunta inicial, más arriba, unas tres horas después de haberla formulado inicialmente. He intentado seguir los útiles consejos del Dr. Harrell. Todavía apreciaría mucho si alguien intentara explicar lo anterior cph de la producción en inglés, o indíqueme una referencia que lo haga. Dr. Harrell, ¡muchas gracias por su ayuda hasta ahora!

13voto

dan90266 Puntos 609

Para empezar, ten en cuenta algunas cosas. En primer lugar, está excluyendo demasiadas observaciones con datos perdidos y esto causará un sesgo. Considere la imputación múltiple. En segundo lugar, existe un método de trazado para cox.zph que es útil para evaluar los riesgos proporcionales. En tercer lugar, se ha asumido la linealidad de los efectos de las covariables. En cuarto lugar, el número de eventos en su muestra de entrenamiento es apenas lo suficientemente grande para ajustar un modelo fiable si todos los efectos de las covariables resultan ser lineales (lo cual es raro). Y la muestra de prueba tendría que tener quizás 400 eventos antes de poder evaluar de forma fiable la precisión de la predicción. No está claro que tuvieras suficientes datos para dividirlos en dos partes. La validación por remuestreo (100 repeticiones de validación cruzada de 10 veces, o utilizar el bootstrap) es una solución mejor. Tanto su validación externa original (funciones rcorr.cens y val.surv ) y la validación interna por remuestreo (funciones validate , calibrate ) se implementan en el R rms paquete. Estudios de caso para el rms paquete se encuentran en mis notas del curso en http://biostat.mc.vanderbilt.edu/rms (y tengo un curso de 3 días sobre esto en Nashville el próximo mes). Tenga en cuenta que $2\times 2$ Las tablas no son apropiadas para su uso con datos continuos.

1 votos

Dr. Harrell, muchas gracias por sus comentarios. He intentado escribir plot(cox.zph(fit[[1]], transform="km", global=TRUE)) Sin embargo, esto produjo 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 de forma incorrecta?

1 votos

Si combino mis datos de entrenamiento y validación, tengo 166 observaciones con 75 eventos. Como sugieres, puedo imputar los valores de mi variable "z" para mis 13 observaciones a las que les falta ese dato, eliminando ese problema. Me gusta tu sugerencia de realizar una validación cruzada de 10 veces. Si tienes tiempo, te agradecería mucho que me dieras una pista más concreta sobre cómo utilizar los paquetes rms para hacer esto. Mientras tanto, seguiré leyendo su sitio web. Me encantaría hacer su curso en el futuro. Desgraciadamente, en este momento estoy en Europa, ¡demasiado lejos!

2 votos

Para el problema de la singularidad, haga plot(cox.zph(...), df=2) . Consulte los estudios de casos en las notas del curso para rms o instalar el paquete (que también necesita el Hmisc ) y escriba estos comandos para que aparezcan los archivos de ayuda: ?cph ?validate.cph ?calibrate.cph

5voto

Zhubarb Puntos 2330

La salida de la función R cph, basada en un ejemplo relevante, se explica en este sencillo papel por J. Fox.

Le aconsejo encarecidamente que lea este documento si aún no lo ha hecho.

1 votos

¿Puede describir cómo el documento sugiere interpretar la cph ¿salida?

2 votos

+1 ¡Gracias por la referencia y bienvenido a este sitio! Sería estupendo si también pudieras dar una visión sucinta del contenido del documento, ya que nos esforzamos por dar respuestas que puedan valerse por sí mismas.

0 votos

Este enlace ya no existe

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X