如何将Cox回归输出结果转换为DataFrame?
将Cox回归结果转换为指定格式的DataFrame(R语言)
问题背景
我用以下代码运行了单变量Cox回归模型:
res <- coxph(Surv(DFS, DFS.Event) ~ Grade, data = Grade) summary(res)
模型输出结果如下:
Call: coxph(formula = Surv(DFS, DFS.Event) ~ Grade, data = Grade) n= 172, number of events= 38 (12 observations deleted due to missingness) coef exp(coef) se(coef) z Pr(|z|) GradeGrade2 1.153 3.167 1.026 1.123 0.261 GradeGrade3 1.006 2.736 1.028 0.979 0.327 exp(coef) exp(-coef) lower .95 upper .95 GradeGrade2 3.167 0.3158 0.4237 23.67 GradeGrade3 2.736 0.3655 0.3651 20.50 Concordance= 0.539 (se = 0.04 ) Likelihood ratio test= 1.82 on 2 df, p=0.4 Wald test = 1.34 on 2 df, p=0.5 Score (logrank) test = 1.45 on 2 df, p=0.5
需要把上述输出转换成如下格式的DataFrame:
Variable coef exp(coef) se(coef) z p lower 0.95 upper 0.95 GradeGrade2 1.153 3.167 1.026 1.123 0.261 0.4237 23.67 GradeGrade3 1.006 2.736 1.028 0.979 0.327 0.3651 20.5
解决方案
方法1:用broom包快速生成整洁DataFrame
broom是专门用来整理统计模型输出的工具包,操作简单:
- 安装并加载依赖包:
install.packages("broom") library(broom) library(dplyr)
- 提取并整理结果:
# 获取系数、标准误、z值、p值等核心信息 tidy_result <- tidy(res) %>% rename(Variable = term, p = p.value) %>% mutate(`exp(coef)` = exp(coef)) # 获取95%置信区间 ci_result <- confint(res) %>% as.data.frame() %>% rename(`lower 0.95` = 1, `upper 0.95` = 2) %>% rownames_to_column("Variable") # 合并两部分数据并调整列顺序 final_df <- left_join(tidy_result, ci_result, by = "Variable") %>% select(Variable, coef, `exp(coef)`, se.coef, z, p, `lower 0.95`, `upper 0.95`) %>% rename(se(coef) = se.coef) # 查看最终结果 final_df
方法2:手动提取模型输出(无需额外包)
如果不想安装新包,直接从模型的summary对象里提取数据:
library(dplyr) library(tibble) # 提取系数表部分 coef_table <- as.data.frame(summary(res)$coefficients) %>% rownames_to_column("Variable") %>% rename(p = `Pr(>|z|)`) # 提取置信区间表部分 ci_table <- as.data.frame(summary(res)$conf.int) %>% rownames_to_column("Variable") %>% select(Variable, `lower .95`, `upper .95`) # 合并并整理成目标格式 final_df <- left_join(coef_table, ci_table, by = "Variable") %>% select(Variable, coef, `exp(coef)`, se(coef), z, p, `lower .95`, `upper .95`) %>% rename(`lower 0.95` = `lower .95`, `upper 0.95` = `upper .95`) # 查看结果 final_df
两种方法都能得到符合预期的DataFrame,按需选择即可。
内容的提问来源于stack exchange,提问作者nicholaspooran
相关产品推荐
相关产品推荐

