Вывод регрессии Кокса в xtable - выбор строк / столбцов и добавление доверительного интервала

Я не хочу экспортировать результат регрессии Кокса в таблицу, которую затем могу поместить в свою статью. Я думаю, лучший способ сделать это с помощью xtable:

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)

Теперь я хочу сделать с выводом следующее:

  • Добавьте доверительный интервал (ДИ) 95%
  • Выберите определенные строки, скажем, возраст и журнал (protime)
  • Округлите exp (B) и CI до трех десятичных знаков.
  • Удалите столбец с z и регулярным коэффициентом

Заранее спасибо!


person Max Gordon    schedule 15.10.2011    source источник


Ответы (2)


Я бы подошел к этому, сначала взглянув на то, как пакет survival создает таблицу, которую он печатает по умолчанию.

Чтобы найти функцию, которая выполняет эту печать, изучите класс подходящего объекта, а затем найдите метод печати для этого класса:

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

Посмотрев на print.coxph, я пришел к выводу:

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)
person Josh O'Brien    schedule 15.10.2011
comment
Спасибо, именно то простое решение, которое я искал :) - person Max Gordon; 16.10.2011

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}

Это показывает, что вы видите с помощью str на объекте-сводке.

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"
person IRTFM    schedule 15.10.2011
comment
Вы также можете использовать аргумент digits для xtable вместо того, чтобы отправлять его через round. - person Brian Diggs; 16.10.2011
comment
Думаю, сводка уже округлена до 2-х цифр. (Но в любом случае точности достаточно, чтобы оправдать более двух цифр.) - person IRTFM; 16.10.2011
comment
Спасибо за усилия, выбрал ответ Джоша, поскольку он решает все мои проблемы. @DWin - я указал 3 цифры, потому что сводка округляется до 2 цифр - у меня очень большой набор данных, и я еще не определился с количеством десятичных знаков, хотя я полностью согласен с тем, что многие десятичные дроби дают ложное представление о статистике, являющейся более точной, чем они есть. - person Max Gordon; 16.10.2011