我想显示彼此相邻的两个回归分析的结果,让我们说一个逻辑和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
答案 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输出与乳胶分开。我建议使用texreg和knitr。如上所述,乳胶输出可以使用Stargazer或xtable进行定制。然而,从我的观点来看,texreg
比观察者更有效率,比xtable更容易定制。这就是说我无法再现完全相同的格式,因为似乎p值似乎不是直接可用的。但如果估计值超出置信区间,则置信区间为星号。
以前的版本
texreg不直接计算奇数比率,但很容易定制。 加载texreg包后,您可以通过键入来访问提取功能。 (如果您更喜欢赔率记录,那么您可以直接跳到我们很高兴行)
命令行中的 extract.glm
和extract.coxph
并在脚本中复制它。然后我们只需修改
两个函数都 coefficients <- s$coef[, 1] into coefficients <- exp(s$coef[, 1])
。
如果出现问题,最好重命名这些功能。我选择了
extract.coxphOR
和extract.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}