2011-10-15 4 views
6

Quiero exportar la salida de una regresión de cox a una tabla que luego puedo poner en mi artículo. Creo que la mejor manera de hacerlo es con xtable:Salida de regresión de Cox en xtable - elegir filas/columnas y agregar un intervalo de confianza

library(survival) 
data(pbc) 
fit.pbc <- coxph(Surv(time, status==2) ~ age + edema + log(bili) + 
    log(protime) + log(albumin), data=pbc) 

summary(fit.pbc) 
library(xtable) 
xtable(fit.pbc) 

Ahora quiero hacer lo siguiente para la salida:

  • Añadir intervalo de confianza (IC) del 95%
  • Seleccionar ciertas filas, según la edad y el registro (tiempo de protrombina)
  • Alrededor de la exp (B) & CI a tres decimales
  • Eliminar la columna con z & coef regulares

¡Gracias de antemano!

Respuesta

9

Me gustaría enfocar esto mirando primero cómo el paquete survival construye la tabla que imprime por defecto.

Para encontrar la función que hace que la impresión, examinemos la clase de su objeto en forma, y ​​luego buscar un método de impresión para esa clase:

class(fit.pbc) 
# [1] "coxph" 
grep("coxph", methods("print"), value=TRUE) 
# [1] "print.coxph"   "print.coxph.null" 
# [3] "print.coxph.penal" "print.summary.coxph" 

Después de echar un vistazo a print.coxph, aquí es lo que vine con:

cox <- fit.pbc 

# Prepare the columns 
beta <- coef(cox) 
se <- sqrt(diag(cox$var)) 
p <- 1 - pchisq((beta/se)^2, 1) 
CI <- round(confint(cox), 3) 

# Bind columns together, and select desired rows 
res <- cbind(beta, se = exp(beta), CI, p) 
res <- res[c("age", "log(protime)"),] 

# Print results in a LaTeX-ready form 
xtable(res) 
+0

Gracias, exactamente la solución simple que estaba buscando :) –

3
xtable(round(summary(fit.pbc)$conf.int[c(1,3),],3)) 
#-----------------------------# 
% latex table generated in R 2.13.1 by xtable 1.5-6 package 
% Sat Oct 15 18:36:04 2011 
\begin{table}[ht] 
\begin{center} 
\begin{tabular}{rrrrr} 
    \hline 
& exp(coef) & exp(-coef) & lower .95 & upper .95 \\ 
    \hline 
age & 1.04 & 0.96 & 1.02 & 1.06 \\ 
    log(bili) & 2.37 & 0.42 & 2.02 & 2.79 \\ 
    \hline 
\end{tabular} 
\end{center} 
\end{table} 

Esto muestra lo que ves con str en el resumen a objetos

str(summary(fit.pbc)) 
# snipped 
$ conf.int : num [1:5, 1:4] 1.0404 2.4505 2.3716 10.8791 0.0815 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:5] "age" "edema" "log(bili)" "log(protime)" ... 
    .. ..$ : chr [1:4] "exp(coef)" "exp(-coef)" "lower .95" "upper .95" 
+0

También puede usar el argumento 'digits' para' xtable' en lugar de enviarlo a través de 'round'. –

+0

Creo que el resumen ya está redondeado a 2 dígitos. (Pero de todos modos, rara vez hay suficiente precisión para justificar más de 2 dígitos.) –

+0

Gracias por el esfuerzo, eligió la respuesta de Josh ya que resuelve todos mis problemas. @DWin: especifiqué 3 dígitos porque las rondas de resumen son de 2 dígitos. Tengo un conjunto de datos muy grande y aún no he decidido la cantidad de decimales, aunque estoy completamente de acuerdo en que muchos decimales dan una percepción falsa de que las estadísticas son más precisas que son. –

Cuestiones relacionadas