组合两个表并为R中的每个表添加标题

时间:2014-06-07 14:36:56

标签: r xtable

我想显示彼此相邻的两个回归分析的结果,让我们说一个逻辑和COX回归。变量以行和对应的数据表示,p,OR / HR和列中的置信区间。因此,列名称不匹配:它左边是OR,右边是HR。

我试过cbind,但我遇到了以下问题:

(1)如果一个变量(行)由于变量选择仅出现在一个表中怎么办?在这种情况下,在两者组合时,另一个表中必须有一个空白行。

(2)两个表合并后,如何在每个表的四列上添加标题,以便将它们标记为logistic或COX?

我正在寻找的输出将通过xtable显示为乳胶表:

   | Logistic regression          | COX regression
   | p     | OR    | 2.5% | 97.5% | p     | HR    | 2.5% | 97.5% 
v1 | 0.849 | 0.936 | ...  | ...   |       |       |      |
v2 | 0.249 | 0.595 | ...  | ...   | 0.026 | 1.916 | ...  | ...
v3 |       |       |      |       | 0.023 | 0.140 | ...  | ...

以下是一些示例代码:

library(xtable);library(survival)
# Creating a sample data frame
set.seed(1234)
event <- as.numeric(round(rnorm(10,5,5))>1);tte<-abs(round(rnorm(10,5,5)))
v1 <- round(rnorm(10,5,5));v2 <- round(rnorm(10,2,5));v3 <- round(rnorm(10,1,5))
df<-data.frame(event, tte, v1, v2, v3)

# Some logistic regression ...
LogReg <- glm(event~v1+v2,family=binomial,data=df)
LogRegTable<-round(cbind(summary(LogReg)$coef[, "Pr(>|z|)"], exp(coef(LogReg)),   exp(confint(LogReg))),3)
colnames(LogRegTable)<-c("p","OR","2.5%","97.5%")
LogRegTable<-LogRegTable[!rownames(LogRegTable)=="(Intercept)",] 

# ... and some COX regression
CoxReg <- coxph(Surv(df$tte, df$event)~v2+v3,data=df)
CoxRegTable<-round(cbind(summary(CoxReg)$coef[, "Pr(>|z|)"], exp(coef(CoxReg)),  exp(confint(CoxReg))),3)
colnames(CoxRegTable)<-c("p","HR","2.5%","97.5%")

# There we go
LogRegTable
CoxRegTable

# Now, how to get them in one table?
xtable(
  cbind(LogRegTable, CoxRegTable)
)
# ... messes up the correct row names   

4 个答案:

答案 0 :(得分:2)

正如MrFlick建议的那样,你可以使用merge()比使用cbind更有效。

您可以使用merge(),如下所示:

xtable <- merge(LogRegTable, CoxRegTable, by.x = "p", by.y = "p", all = TRUE)

在这种情况下,by.x和by.y引用要合并的列。如果两个表中的列名相同(就像在这种情况下那样),那么您可以使用by =“p”,但是此方法(使用by.x和by.y)允许您合并两个不同的列标题。

all = TRUE将强制合并表保留两个表中的所有行,即使它们都不共享p的值。如果您将此更改为FALSE,那么它将删除具有p值的任何行,这两个表中都不存在。

如果您想在之后重命名列名称(尽管您的列名应该已经令人满意地保留),您可以使用colnames(),如下所示:

colnames(xtable) <- c("col1_name", "col2_name", etc)

答案 1 :(得分:1)

我将如何做到这一点:

#Add column for variable name 
LogRegTable <- cbind(v = rownames(LogRegTable), LogRegTable)
CoxRegTable <- cbind(v = rownames(CoxRegTable), CoxRegTable)

#merge on variable name
bothTable <- merge(LogRegTable, CoxRegTable, by = "v", all = TRUE)

#create an xtable object
forLatex <- xtable(bothTable)

#remove rownames and formatting details which I personally prefer to set up in my actual latex code.
#customize based on ?print.xtable to fit your needs
#and write the table to a text file
cat( print.xtable(forLatex, include.colnames = FALSE, include.rownames = FALSE, only.contents = TRUE), file = "latextable.txt")

希望有所帮助。

答案 2 :(得分:1)

R并没有真正做到你所要求的“双标题”(列名称可以在标题名称下分组),但这样可以让你做到可管理的事情:

您必须转换为data.frame才能使用此功能,这意味着以数字开头的列名将在其前面获得一个X.您可以稍后为xtable更改此设置。 您应该添加一个标识变量的列:

> LogRegTable = data.frame(LogRegTable, Variable = rownames(LogRegTable))
> CoxRegTable = data.frame(CoxRegTable, Variable = rownames(CoxRegTable))
> LogRegTable
       p    OR X2.5. X97.5. Variable
v1 0.849 0.936 0.433  2.018       v1
v2 0.249 0.595 0.129  0.995       v2
> CoxRegTable
       p    HR X2.5. X97.5. Variable
v2 0.026 1.916 1.080  3.402       v2
v3 0.023 0.140 0.025  0.766       v3  

然后这是一个简单的合并操作:

> merge(LogRegTable, CoxRegTable, by="Variable", all=T, suffixes = c("Log", "Cox"))
  Variable  pLog    OR X2.5.Log X97.5.Log  pCox    HR X2.5.Cox X97.5.Cox
1       v1 0.849 0.936    0.433     2.018    NA    NA       NA        NA
2       v2 0.249 0.595    0.129     0.995 0.026 1.916    1.080     3.402
3       v3    NA    NA       NA        NA 0.023 0.140    0.025     0.766

答案 3 :(得分:1)

如果您最终输出乳胶表。你不必将R输出与乳胶分开。我建议使用texregknitr。如上所述,乳胶输出可以使用Stargazer或xtable进行定制。然而,从我的观点来看,texreg比观察者更有效率,比xtable更容易定制。这就是说我无法再现完全相同的格式,因为似乎p值似乎不是直接可用的。但如果估计值超出置信区间,则置信区间为星号。

以前的版本

texreg不直接计算奇数比率,但很容易定制。 加载texreg包后,您可以通过键入来访问提取功能。 (如果您更喜欢赔率记录,那么您可以直接跳到我们很高兴行)

命令行中的

extract.glmextract.coxph

并在脚本中复制它。然后我们只需修改

两个函数都

coefficients <- s$coef[, 1] into coefficients <- exp(s$coef[, 1])

如果出现问题,最好重命名这些功能。我选择了

extract.coxphORextract.glmOR

运行该函数后,我们必须告诉texreg使用我们修改过的函数而不是常规函数。

 setMethod("extract", signature = className("glm","stats"),definition = extract.glmOR)
 setMethod("extract", signature = className("coxph","survival"),definition = extract.coxphOR)

我们很高兴:

texreg(list(LogReg,CoxReg),ci.force = T,single.row=T,ci.force.level=0.025,custom.model.names = c("Logistic Regression", "Cox Regression"))

更新版本 如评论中所建议的,可以更容易地计算比值比。虽然之前的版本效率不高,但我要留下以防有人需要修改提取功能。

texreg(list(LogReg,CoxReg),ci.force = TRUE, single.row = TRUE, ci.force.level = 0.025,    custom.model.names = c("Logistic Regression", "Cox Regression"), override.coef = list(exp(coef(LogReg)), exp(coef(CoxReg))))

结果:

\begin{table}
\begin{center}
\begin{tabular}{l c c }
\hline
           & Logistic Regression & Cox Regression \\
\hline
(Intercept)    & $1.77 \; [1.72;\ 1.82]^{*}$ &                             \\
v1             & $0.94 \; [0.92;\ 0.95]^{*}$ &                             \\
v2             & $0.59 \; [0.58;\ 0.61]^{*}$ & $1.92 \; [1.91;\ 1.93]^{*}$ \\
v3             &                             & $0.14 \; [0.11;\ 0.17]^{*}$ \\
\hline
AIC            & 13.63                       & 17.36                       \\
BIC            & 14.54                       &                             \\
Log Likelihood & -3.82                       &                             \\
Deviance       & 7.63                        &                             \\
Num. obs.      & 10                          & 10                          \\
R$^2$          &                             & 0.68                        \\
Max. R$^2$     &                             & 0.92                        \\
Num. events    &                             & 7                           \\
Missings       &                             & 0                           \\
PH test        &                             & 0.90                        \\
\hline
\multicolumn{3}{l}{\scriptsize{$^*$ 0 outside the confidence interval}}
\end{tabular}
\caption{Statistical models}
\label{table:coefficients}
\end{center}
\end{table}