生信喵 发表于 2025-6-2 10:20:19

cox输出到表格

<h1>背景</h1>
<p>计算coxHR,单因素cox和多因素cox,输出为表格</p>
<p><img src="https://roim-picx-bpc.pages.dev/rest/R6m8xTK.png" alt="" /></p>
<p>出自文章PMID: 28356122</p>
<h1>应用场景</h1>
<p>对比和展示临床相关因素和基因表达对疾病发病或预后的影响。</p>
<p>例如TCGA数据、大规模临床试验数据等等。</p>
<h1>输入数据</h1>
<p>包含示例表格中研究的相关因素,每个因素为一列,最后两列是两个基因的表达矩阵;每行是一个sample。</p>
<pre><code class="language-{r}">clin_mRNA_miRNA &lt;- read.csv(&quot;easy_input.csv&quot;, as.is = T)
head(clin_mRNA_miRNA)
</code></pre>
<p>**特别说明:**从TCGA数据库下载数据到整理成这个文件,经过了很多步骤。感兴趣的小伙伴可参考压缩包中的 <code>How_to_get_easy_input.R</code>文件,里面是前期数据处理的代码。</p>
<ul>
<li>原文未详细描述样品筛选的方法,我们采用公认的方法进行了样品筛选。</li>
<li>原文也未提供验证数据集,因此,从TCGA随机抽取60个样本作为验证。</li>
</ul>
<p>因此,最后生成的表格中的数值与原文有出入。</p>
<p>下面开始进行数值计算和表格绘制:</p>
<h1>数值计算</h1>
<h2>临床数据和表达量的预处理</h2>
<pre><code class="language-{r}">#性别
clin_mRNA_miRNA$gender&lt;-factor(clin_mRNA_miRNA$gender, ordered = T)

#年龄
clin_mRNA_miRNA$age&lt;-ifelse(clin_mRNA_miRNA$age&gt;median(clin_mRNA_miRNA$age),
                            '&gt;=median','&lt;median')
clin_mRNA_miRNA$age&lt;-factor(clin_mRNA_miRNA$age, ordered = T)

#淋巴结数目
clin_mRNA_miRNA$lymph_node_examined_count&lt;-ifelse(clin_mRNA_miRNA$lymph_node_examined_count&lt;12,
                                                '&lt;12','&gt;=12')
clin_mRNA_miRNA$lymph_node_examined_count&lt;-factor(clin_mRNA_miRNA$lymph_node_examined_count, ordered = T)

#淋巴转移
clin_mRNA_miRNA$lymphatic_invasion&lt;-factor(clin_mRNA_miRNA$lymphatic_invasion, ordered = T)

#病理M期
clin_mRNA_miRNA$pathologic_M&lt;-factor(clin_mRNA_miRNA$pathologic_M, ordered = T)

#肿瘤分期 stagei 代表1 和2期   stageiii 代表 3和4期前期已预处理数据
clin_mRNA_miRNA$tumor_stage&lt;-factor(clin_mRNA_miRNA$tumor_stage, ordered = T)

#血管侵犯
clin_mRNA_miRNA$venous_invasion&lt;-factor(clin_mRNA_miRNA$venous_invasion, ordered = T)

#CEA水平
clin_mRNA_miRNA$preoperative_pretreatment_cea_level&lt;-ifelse(clin_mRNA_miRNA$preoperative_pretreatment_cea_level&lt;5,
                                                            '&lt;5','&gt;=5')
clin_mRNA_miRNA$preoperative_pretreatment_cea_level&lt;-factor(clin_mRNA_miRNA$preoperative_pretreatment_cea_level,
                                                             ordered = T)
#mir195中位数为界,分为高于中位数和低于中位数
#这里不建议改为mir-195,否则,后面cox单因素计算公式可能会出错
clin_mRNA_miRNA$mir195&lt;-as.numeric(clin_mRNA_miRNA$mir195)
clin_mRNA_miRNA$mir195&lt;-ifelse(clin_mRNA_miRNA$mir195&lt;median(clin_mRNA_miRNA$mir195),
                                    '&lt;median','&gt;=median')
clin_mRNA_miRNA$mir195&lt;-factor(clin_mRNA_miRNA$mir195,ordered = T)

#YAP1中位数为界,分为高于中位数和低于中位数
clin_mRNA_miRNA$YAP1&lt;-as.numeric(clin_mRNA_miRNA$YAP1)
clin_mRNA_miRNA$YAP1&lt;-ifelse(clin_mRNA_miRNA$YAP1&lt;median(clin_mRNA_miRNA$YAP1),
                                    '&lt;median','&gt;=median')
clin_mRNA_miRNA$YAP1&lt;-factor(clin_mRNA_miRNA$YAP1,ordered = T)
str(clin_mRNA_miRNA)
</code></pre>
<h2>回归分析</h2>
<pre><code class="language-{r}">#单因素回归分析
library(survival)
sur&lt;-Surv(time=clin_mRNA_miRNA$`OS`, event = clin_mRNA_miRNA$`EVENT`)

#批量多个单因素cox回归
univarcox&lt;- function(x){
formu&lt;-as.formula(paste0('sur~',x))
unicox&lt;-coxph(formu,data=clin_mRNA_miRNA)
unisum&lt;-summary(unicox)#汇总数据
HR&lt;-round(unisum$coefficients[,2],3)# HR风险比
Pvalue&lt;-unisum$coefficients[,5]#p值
CI95&lt;-paste0(round(unisum$conf.int[,c(3,4)],3),collapse = '-') #95%置信区间
univarcox&lt;-data.frame('characteristics'=x,
                     'Hazard Ration'=HR,
                     'CI95'=CI95,
                     'pvalue'=ifelse(Pvalue &lt; 0.001, &quot;&lt; 0.001&quot;, round(Pvalue,3)))
return(univarcox)#返回数据框
}

#选择需要进行单因素分析变量名称
(variable_names&lt;-colnames(clin_mRNA_miRNA))
univar&lt;-lapply(variable_names,univarcox)
univartable&lt;-do.call(rbind,lapply(univar,data.frame))
univartable$`HR(95%CI)`&lt;-paste0(univartable$Hazard.Ration,'(',univartable$CI95,')')
univartable1&lt;-dplyr::select(univartable,characteristics,`HR(95%CI)`,pvalue,-CI95,-Hazard.Ration)

#选取p值&lt;0.05的因素
(names&lt;-univartable1$characteristics)

##多因素cox回归
#整合多个因素 p&lt;0.05的公式
(form&lt;-as.formula(paste0('sur~',paste0(names,collapse = '+'))))
multicox&lt;-coxph(formula = form,data = clin_mRNA_miRNA)
multisum&lt;-summary(multicox)##汇总
muHR&lt;-round(multisum$coefficients[,2],3)#
muPvalue&lt;-multisum$coefficients[,5]#p值
muCIdown&lt;-round(multisum$conf.int[,3],3)#下
muCIup&lt;-round(multisum$conf.int[,4],3)#上
muCI&lt;-paste0(muCIdown,'-',muCIup)##95%置信区间
multicox&lt;-data.frame('characteristics'=names,
                     'muHazard Ration'=muHR,
                     'muCI95'=muCI,
                     'mupvalue'=ifelse(muPvalue &lt; 0.001, &quot;&lt; 0.001&quot;, round(muPvalue,3)))
rownames(multicox)&lt;-NULL
multicox$`HR(95%CI)`&lt;-paste0(multicox$muHazard.Ration,'(',multicox$muCI95,')')
multicox&lt;-dplyr::select(multicox,characteristics,`HR(95%CI)`,mupvalue,-muCI95,-muHazard.Ration)

#合并单因素多因素表格
uni_multi&lt;-dplyr::full_join(univartable1,multicox,by=&quot;characteristics&quot;)
uni_multi$characteristics &lt;- as.character(uni_multi$characteristics)
</code></pre>

生信喵 发表于 2025-6-2 10:21:57

<h1>验证</h1>
<p>由于文章没上传验证数据集数据,用 <code>p = 0.7</code>参数从clin_mRNA_miRNA中 随机抽取取70%做训练集,其余为验证集</p>
<pre><code class="language-{r,message=FALSE}">if(!require(caret))(install.packages(caret))
set.seed(121)
samdata&lt;- createDataPartition(clin_mRNA_miRNA$`EVENT`, p=0.7, list=F)
valid&lt;-clin_mRNA_miRNA[-samdata,]
summary(valid)

#单因素分析
sur2&lt;-Surv(time=valid$`OS`,event = valid$`EVENT`)#数据集需要修改
#批量多个单因素cox回归
univarcox&lt;- function(x){
formu&lt;-as.formula(paste0('sur2~',x))
unicox&lt;-coxph(formu,data=valid)##数据集更改
unisum&lt;-summary(unicox)#汇总数据
HR&lt;-round(unisum$coefficients[,2],3)# HR风险比
Pvalue&lt;-unisum$coefficients[,5]#p值
CI95&lt;-paste0(round(unisum$conf.int[,c(3,4)],3),collapse = '-') #95%置信区间
univarcox&lt;-data.frame('characteristics'=x,
                        'Hazard Ration'= HR,
                        'CI95'= CI95,
                        'pvalue'= ifelse(Pvalue &lt; 0.001, &quot;&lt; 0.001&quot;, round(Pvalue,3)))
return(univarcox)#返回数据表
}

#选择需要进行单因素分析变量名称
(variable_names&lt;-colnames(valid))
univar&lt;-lapply(variable_names,univarcox)
univartable&lt;-do.call(rbind,lapply(univar,data.frame))
univartable$`HR(95%CI)`&lt;-paste0(univartable$Hazard.Ration,'(',univartable$CI95,')')
univartable2&lt;-dplyr::select(univartable,characteristics,`HR(95%CI)`,pvalue,-CI95,-Hazard.Ration)

#多因素分析
#选取p值&lt;0.05的因素
(names2&lt;-as.character(univartable2$characteristics))

##多因素cox回归
#整合多个因素 p&lt;0.05的公式
(form&lt;-as.formula(paste0('sur2~',paste0(names2,collapse = '+'))))
multicox&lt;-coxph(formula = form,data = valid)#数据集需要更改
multisum&lt;-summary(multicox)##汇总
muHR&lt;-round(multisum$coefficients[,2],3)#风险比
muPvalue&lt;-multisum$coefficients[,5]#p值
muCIdown&lt;-round(multisum$conf.int[,3],3)#下
muCIup&lt;-round(multisum$conf.int[,4],3)#上
muCI&lt;-paste0(muCIdown,'-',muCIup)##95%置信区间
multicox2&lt;-data.frame('characteristics'=names2,
                     'muHazard Ration'=muHR,
                     'muCI95'=muCI,
                     'mupvalue'=ifelse(muPvalue &lt; 0.001, &quot;&lt; 0.001&quot;, round(muPvalue,3)))
rownames(multicox2)&lt;-NULL
multicox2$`HR(95%CI)`&lt;-paste0(multicox2$muHazard.Ration,'(',multicox2$muCI95,')')
multicox2&lt;-dplyr::select(multicox2,characteristics,`HR(95%CI)`,mupvalue,-muCI95,-muHazard.Ration)

#合并验证集单因素多因素结果
uni_multi2&lt;-dplyr::full_join(univartable2,multicox2,by=&quot;characteristics&quot;)
uni_multi2$characteristics &lt;- as.character(uni_multi2$characteristics)
</code></pre>
<h1>输出html格式表格</h1>
<pre><code class="language-{r}">#合并TCGA与验证集单因素多因素表格
comtable&lt;-rbind(uni_multi,uni_multi2,stringsAsFactors = F)
colnames(comtable)&lt;-c(&quot;&quot;,&quot;Univariate analysis\nHR (95% CI)&quot;,&quot;\nP value&quot;,&quot;Multivariate analysis\nHR (95% CI)&quot;,&quot;\nP value&quot;)
#表格里面不打印NA
comtable &lt;- &quot;&quot;

#生成html
require(kableExtra)

# if (knitr:::is_html_output()) {
#   cn = sub(&quot;\n&quot;, &quot;&lt;br&gt;&quot;, colnames(comtable))
# } else if (knitr:::is_latex_output()) {
#   usepackage_latex('makecell')
#   usepackage_latex('booktabs')
#   cn = linebreak(colnames(comtable), align=&quot;c&quot;)
# }   
cn = sub(&quot;\n&quot;, &quot;&lt;br&gt;&quot;, colnames(comtable))

comtable %&gt;%
    kable(booktabs = T, escape = F, caption = &quot;Table 2 Univariate and multivariate analyses of clinicopathological
characteristics, miR-195-5p, and YAP1 with overall survival in TCGA COAD
cohort and independent validation cohort&quot;,
      col.names = cn) %&gt;%
    kable_styling(c(&quot;striped&quot;, &quot;scale_down&quot;)) %&gt;%
    group_rows(&quot;TCGA COAD testing set (n=200)&quot;, 1,nrow(uni_multi)) %&gt;%
    group_rows(&quot;Independent validation cohort (n=60)&quot;, nrow(uni_multi)+1,nrow(comtable)) %&gt;%
    footnote(general = &quot;The data...&quot;,
             footnote_as_chunk = T)
</code></pre>
<p><img src="https://roim-picx-bpc.pages.dev/rest/Avb9xTK.png" alt="" /></p>
<h1>生成csv格式的表格</h1>
<pre><code class="language-{r}">#合并TCGA与验证集单因素多因素表格
table_subtitle &lt;- c(NA,&quot;HR (95% CI)&quot;,&quot;P value&quot;,&quot;HR (95% CI)&quot;,&quot;P value&quot;)
TCGA &lt;- c(&quot;TCGA COAD testing set (n=200)&quot;,rep(&quot;&quot;,4))
val&lt;-c(&quot;Independent validation cohort (n = 60)&quot;,rep(&quot;&quot;,4))
comtable&lt;-rbind(table_subtitle,TCGA, uni_multi,val,uni_multi2,stringsAsFactors = F)
colnames(comtable)&lt;-c(&quot;&quot;,&quot;Univariate analysis&quot;,&quot;&quot;,&quot;Multivariate analysis&quot;,&quot;&quot;)
#表格里面不打印NA
comtable &lt;- &quot;&quot;
str(comtable)
#保存到csv文件
write.csv(comtable,&quot;Table2.csv&quot;, quote = F, row.names = F)
</code></pre>
<h1>生成word格式的表格(推荐,投稿可能有用)</h1>
<pre><code class="language-{r}">#合并TCGA与验证集单因素多因素表格
table_subtitle &lt;- c(NA,&quot;HR (95% CI)&quot;,&quot;P value&quot;,&quot;HR (95% CI)&quot;,&quot;P value&quot;)
TCGA &lt;- c(&quot;TCGA COAD testing set (n=200)&quot;,rep(NA,4))
val&lt;-c(&quot;Independent validation cohort (n = 60)&quot;,rep(NA,4))
comtable&lt;-rbind(table_subtitle,TCGA, uni_multi,val,uni_multi2,stringsAsFactors = F)
colnames(comtable)&lt;-c(NA,&quot;Univariate analysis&quot;,NA,&quot;Multivariate analysis&quot;,NA)
#表格里面不打印NA
comtable &lt;- &quot;&quot;

#保存到word文档
title_name&lt;-'Table 2 Univariate and multivariate analyses of clinicopathological
characteristics, miR-195-5p, and YAP1 with overall survival in TCGA COAD
cohort and independent validation cohort'
table1&lt;-comtable
mynote &lt;- &quot;Note: ...&quot;

if(!require(officer)) (install.packages('officer'))
library(officer)
my_doc &lt;- read_docx()#初始化一个docx

my_doc %&gt;%
##添加段落标题名称
body_add_par(value = title_name, style = &quot;table title&quot;) %&gt;%

#添加表格
body_add_table(value = table1, style = &quot;Light List Accent 2&quot; ) %&gt;%

#添加Note
body_add_par(value = mynote) %&gt;%

#打印到word文档
print(target = &quot;Table2.docx&quot;)

#查看表格相关参数
read_docx() %&gt;% styles_info() %&gt;%
subset( style_type %in% &quot;table&quot; )
#用这些参数,把表格设置成你想要的形式
</code></pre>

生信喵 发表于 2025-6-2 10:22:35

<p>文中所用数据可以关注公众号“生信喵实验柴”<br />
<img src="https://ipfs.io/ipfs/QmWMrgpjHGN5raAJdpML1fJL721mQNub87FsrS7bphNWFp" alt="1.png" /><br />
发送关键词“20250421”获取</p>
页: [1]
查看完整版本: cox输出到表格