【问题标题】:Combining two tables and adding a header for each table in R组合两个表并为R中的每个表添加一个标题
【发布时间】:2014-06-07 14:36:56
【问题描述】:

我想将两个回归分析的结果并排显示,比如说逻辑回归和 COX 回归。变量以行表示,p、OR/HR 和置信区间的相应数据以列表示。所以,列名不匹配:左边是 OR,右边是 HR。

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

(1) 如果一个变量(行)由于变量选择而只出现在一个表中怎么办?在这种情况下,如果将两者结合起来,则另一个表中必须有一个空白行。

(2) 两个表合并后,如何在每个表的四列上添加一个标题,以便将它们标记为逻辑或 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   

【问题讨论】:

  • 如果你想根据变量名并排匹配,merge() 会比cbind 更好。如果您想要精美的表格,请考虑使用 xtablesstargazer 之类的包来制作 LaTeX 输出(或编写代码以使 LaTeX 完全符合您的要求)。这里没有足够的信息来提出更具体的建议(考虑添加您尝试过的示例数据和代码)
  • 谢谢。事实上,我想通过 xtable 传递最终输出,使其在 LaTex 中看起来不错。当我使用 merge() 时,如何指定通过变量名匹配,即第一列?用“colnames(LogRegTable)”列出列名以“p”开头,所以第二列。

标签: r xtable


【解决方案1】:

正如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)

【讨论】:

    【解决方案2】:

    我会这样做:

    #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")
    

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        【解决方案4】:

        如果您最终输出乳胶表。您不必将 R 输出与乳胶分开。我推荐使用texregknitr。如上所述,乳胶输出都可以使用 Stargazer 或 xtable 进行自定义。然而,从我的角度来看,texreg 比观星者更高效,并且比 xtable 更容易定制。也就是说,我无法重现您需要的完全相同的格式,因为 p 值似乎并不直接可用。但如果估计值超出置信区间,则置信区间会加星标。

        以前的版本

        texreg 不直接计算奇数比,但它很容易定制。 加载 texreg 包后,您可以通过键入来访问提取函数。 (如果您更喜欢赔率日志,那么您可以直接跳到 And we are good to go 行)

        extract.glmextract.coxph 在命令行中

        并将其复制到您的脚本中。那么我们只需要修改

        coefficients &lt;- s$coef[, 1] into coefficients &lt;- 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}
        

        【讨论】:

        • 您甚至不必重新定义 extract.glm 和 extract.coxph 方法。只需按照您的答案中所述调用 texreg 命令并使用 override.coef 参数来提供转换后的系数。您基本上可以在一行代码中完成所有操作。
        • 据我了解override.coef 不计算优势比。如果不是,那么您必须计算将它们放入数组中的几率并使用覆盖系数。
        • 是的,差不多就是这样。但是你可以在同一行代码中做到这一点。您修改后的示例: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))))
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 2022-11-20
        • 2019-05-11
        • 2014-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多