零基础入门转录组数据分析——预后模型之多因素cox模型

零基础入门转录组数据分析——预后模型之多因素cox模型

目录

  • 零基础入门转录组数据分析——预后模型之多因素cox模型
    • 1. 预后模型和多因素cox模型基础知识
    • 2. 多因素cox预后模型(Rstudio)——代码实操
      • 2. 1 数据处理
      • 2. 2 构建多因素cox模型(用输入的全部10个基因)
      • 2. 3 计算风险评分



1. 预后模型和多因素cox模型基础知识

1.1 预后模型是什么?
预后模型(Prognostic Model)是一种基于统计学和机器学习方法的预测工具,它通过分析患者的临床特征、生物标志物、治疗方案等多种因素,来预测患者未来发生某种不良事件(如疾病复发、死亡等)的概率。

1.2 预后模型的特点是什么?

  • 时间维度: 预后模型通常具有时间维度,即预测的是未来某一时刻或时间段内发生的事件,例如:在1000天的时候疾病患者的生存的概率。
  • 多因素分析: 预后模型考虑多种影响因素,包括患者的临床特征、生物学标志物、治疗方案等,以提高预测的准确性和可靠性。

1.3 构建预后模型对于临床应用有哪些帮助?

  • 指导临床决策: 预后模型可以帮助医生预测疾病的可能进展,从而为患者提供更加个性化的治疗建议。例如,在癌症治疗中,预后模型可以预测患者的复发风险和生存时间,帮助医生制定更加合理的治疗方案。

  • 疾病风险评估: 预后模型能够识别哪些患者更有可能出现不良结局,使医生可以进行早期干预,降低患者的风险。

  • 提供研究基础: 预后研究为后续的临床试验提供了有价值的数据,为疾病的进一步研究打下基础,例如:后续研究可以重点关注某些指标/特征。

1.4 风险评分是什么?
风险评分是一种量化评估患者疾病风险或治疗结果的方法。它通过综合考虑患者的多个临床特征和生物标志物,计算出一个数值(即风险评分),用于预测患者的预后(如生存率、复发率等)或治疗反应。

1.5 风险评分和预后模型的关系是什么?
预后模型往往通过计算风险评分来实现对患者预后的预测,风险评分是预后模型中的核心组成部分,它反映了模型对患者临床结局的量化评估。 简单理解为:风险评分就是预后模型的量化指标,后续也是通过风险评分来对预后模型进行验证

1.6 多因素cox模型是什么?
多因素Cox模型,即Cox比例风险模型(Cox Proportional Hazards Model),是一种可以同时分析多个特征/变量对患者生存状态影响的统计模型。

1.7 多因素cox分析和之前的单因素cox分析的区别?
区别就在于: 单因素cox分析是对每个特征/变量单独进行分析,来研究该特征/变量是否与患者生存有联系,局限性就在于只分析了一种特征/变量。然鹅不同特征/变量之间或多或少都是存在联系的,而多因素cox分析就是同时分析多个特征/变量对于生存时间的影响,来看不同特征/变量对于患者生存的影响是否独立。

举个栗子: 有8个基因通过了单因素cox筛选,被认为是预后基因 (可以显著影响患者生存或复发) ,此时将8个基因进行多因素cox分析,有3个基因多因素cox计算的p < 0.05,此时这3个基因被认为是独立预后基因——虽然多个基因之间存在相互干扰的情况,但是这3个基因仍然显著影响患者生存或复发

1.8 多因素cox分析筛选独立预后基因和多因素cox构建预后模型有什么区别?
目的不一样:前者是用来筛选基因的,后者是用输入的基因构建模型并计算风险评分

注:多因素cox计算风险评分这里有两种思路(在本章中会重点介绍第一种方式,在下一章中会介绍第二种方式):
(1)第一种就是直接用输入的全部基因去构建多因素cox模型并计算风险评分。
(2)第二种是在第一种多因素cox模型的基础上加入逐步回归,剔除一些相对不重要的基因,剩下的基因构建的模型被认为是最优模型,拿这个模型去计算风险评分

综上所述: 预后模型就是一种预测工具,它可以通过多种特征/变量来预测未来某段时间患者的生存/复发概率,在预后模型中有一个量化指标叫做风险评分。在确认要输入的特征/变量之后,就可以去构建多因素cox预后模型并计算风险评分。

注意:
(1)与预后相关的分析输入的都是疾病样本,和对照样本无关!!
(2)输入的特征/变量必须是与预后相关的特征/变量,如何筛选预后特征,可见之前的章节:单因素cox筛选预后相关特征



2. 多因素cox预后模型(Rstudio)——代码实操

本项目以TCGA——肺腺癌为例展开分析
物种:人类(Homo sapiens)
R版本:4.2.2
R包:tidyverse,survival

废话不多说,代码如下:

2. 1 数据处理

设置工作空间:

rm(list = ls()) # 删除工作空间中所有的对象
setwd('/XX/XX/XX') # 设置工作路径
if(!dir.exists('./15_risk_model_multivariate_cox')){dir.create('./15_risk_model_multivariate_cox')
} 
setwd('./15_risk_model_multivariate_cox/') 

加载包:

library(tidyverse)
library(survival)

导入要分析的表达矩阵train_data ,并对train_data 的列名进行处理(这是因为在读入的时候系统会默认把样本id中的“-”替换成“.”,所以要给替换回去

train_data <- read.csv("./data_fpkm.csv", row.names = 1, check.names = F)  # 行名为全部基因名,每列为样本名
colnames(train_data) <- gsub('.', '-', colnames(train_data), fixed = T)

train_data 如下图所示,行为基因名(symbol),列为样本名
在这里插入图片描述
导入分组信息表group

group <- read.csv("./data_group.csv", row.names = 1) # 为每个样本的分组信息(tumor和control)
colnames(group) <- c('sample', 'group')

group 如下图所示,第一列sample为样本名,第二列为样本对应的分组 (分组为二分类变量:disease和control)
在这里插入图片描述
导入样本对应的生存信息表survival_data

survival_data <- read.csv('./data_survival.csv', row.names = 1, check.names = F) # 样本生存信息(生存时间,生存状态)

survival_data 如下图所示,第一列sample为样本名,第二列为样本对应的生存状态(0表示存活,1表示死亡) ,第三列为样本对应的生存时间(单位是天
在这里插入图片描述

接下来从group,train_data 和 survival_data中筛选出疾病样本

注:涉及到复发/生存的分析点基本都是用的疾病样本,不要附加对照样本!!!!

group <- group[group$group == 'disease', ] ## 筛选疾病样本
train_data <- train_data[, group$sample] ## 从全部表达矩阵中同样筛选出疾病样本
survival_data <- survival_data[survival_data$sample %in% group$sample, ] ## 从生存信息表中提取出疾病样本的生存信息

导入要用于构建模型的基因hub_gene (10个基因,假设这10个基因均通过了前面的单因素cox筛选是预后基因)

hub_gene <- data.frame(symbol = gene <- c('VPS13D', 'MFF', 'ACSL1', 'VDAC1', 'PRELID1', 'BAK1','CYCS', 'BCL2L10', 'MPV17L', 'PHB'))
colnames(hub_gene) <- "symbol"

hub_gene 如下图所示,只有一列:10个基因的基因名
在这里插入图片描述

train_data中取出这10个基因对应的表达矩阵,并且与之前准备的生存信息表从survival_data进行合并

dat <- train_data[rownames(train_data) %in% hub_gene$symbol, ] %>%t() %>% as.data.frame() # 整理后行为样本名,列为基因名
dat$sample <- rownames(dat)
dat <- merge(survival_data, dat, var = 'sample')
dat <- column_to_rownames(dat, var = "sample") %>% as.data.frame()

dat 如下图所示,行为样本名,第一列OS为生存状态,OS.time为生存时间,后面的列均为基因的表达量。
在这里插入图片描述

2. 2 构建多因素cox模型(用输入的全部10个基因)

通过as.formula函数将要进行分析的生存状态(OS)和生存时间(OS.time)以及基因转换为R的公式对象

## 准备多因素cox的公式
multivariable_cox_formula <- as.formula(paste0('Surv(OS.time, OS)~',paste(hub_gene$symbol,sep = '',collapse = '+')))

multivariable_cox_formula如下图所示
在这里插入图片描述
根据准备的公式拟合Cox比例风险回归模型

## 多因素cox分析
multivariabl_cox <- coxph(multivariable_cox_formula,data = dat)

在查看多因素cox结果multivariabl_cox前需要进行ph假定检验

## ph假设检验
multivariabl_cox_ph <- cox.zph(multivariabl_cox)
multivariabl_cox_ph_table <- multivariabl_cox_ph$table[-nrow(multivariabl_cox_ph$table),] %>% as.data.frame()

PH假定是Cox比例风险回归模型的一个核心假设,它要求不同个体之间的风险比率(hazard ratio)在整个随访期间内保持恒定,即不受时间的影响。换句话说,不同个体的风险在整个时间范围内以相同的比率增加或减少

举个栗子:假设正在研究两种不同治疗方法(治疗A和治疗B)对癌症患者生存时间的影响。招募了100名癌症患者,其中50名接受治疗A,50名接受治疗B,目标是确定哪种治疗方法能让患者活得更长。此时要控制不论是在研究开始时、中途还是结束时,治疗A组相对于治疗B组的死亡风险都应该保持不变,否则无法说明是治疗效果差诱导的死亡还是由于其他因素干扰导致的死亡,这时模型的估计结果可能会受到偏差,导致无法准确判断哪种治疗方法更有效。

multivariabl_cox_ph_table 如下图所示

  • chisq: 这一列显示的是卡方(Chi-squared)统计量的值。在进行PH假定检验时,这个统计量用于量化协变量效应是否随时间变化。具体来说,它是通过比较不同时间点的风险比率来计算的。如果chisq值很小(并且对应的p值也很大),那么可以认为PH假定成立,即风险比率在整个随访期间内保持恒定
  • df: 这一列显示的是自由度(Degrees of Freedom)。在PH假定检验的上下文中,这个值通常等于1,因为在检验的是单个协变量是否满足PH假定。
  • p: 这一列显示的是与chisq统计量相关联的p值。如果p值大于0.05,则没有足够的证据拒绝PH假定的零假设,即认为PH假定成立——风险比率在整个随访期间内保持恒定,即不受时间的影响。

在这里插入图片描述

multivariabl_cox_ph_table 中可以看到第三列对应的p值大于0.05,说明所有基因均满足ph假定检验,可以往下查看多因素cox的结果,否则要剔除p < 0.05的基因重新构建模型。

接下来就可以提取多因素cox分析结果的详细信息了

## 提取多因素cox分析结果的详细信息
multivariabl_cox_res_all <- summary(multivariabl_cox)multivariable_cox_res <- data.frame(gene = rownames(data.frame(multivariabl_cox_res_all$coefficients)),coef = data.frame(multivariabl_cox_res_all$coefficients)[, 1],p_value = signif(as.matrix(multivariabl_cox_res_all$coefficients)[,5],2),HR = signif(as.matrix(multivariabl_cox_res_all$coefficients)[,2],2), HR.95L = signif(multivariabl_cox_res_all$conf.int[,3],2), HR.95H = signif(multivariabl_cox_res_all$conf.int[,4],2))write.csv(multivariable_cox_res, './multivariable_cox_res.csv')

multivariable_cox_res 如下图所示:

  • gene——表示基因名称
  • coef——为每个基因对应的系数(这个系数就是后面参与风险评分计算的
  • p_value——表示多因素cox计算的p值,小于0.05被认为该基因是独立预后基因
  • HR——表示风险比值比(如果HR大于1表示该基因是个危险因素,如果HR小于1表示该基因是个安全因素
  • HR.95L和HR.95H——表示HR波动的95上下置信区间,可以理解成波动范围
    在这里插入图片描述

2. 3 计算风险评分

接下来就是计算该模型对应的风险评分,来量化评估该模型对患者未来健康状况或疾病进展的风险。

使用predict函数来根据之前构建的多因素cox模型来预测风险评分

riskScore <- predict(multivariabl_cox, newdata = dat, type = "lp") %>% as.data.frame() # 行为每个样本名,第一列为其对应的风险评分
colnames(riskScore) <- 'riskscore'

riskScore 如下图所示,行名为样本名,第一列riskscore就是对应样本的风险评分——就是给每个样本分配一个具体的分数,以反映其未来发生不良事件(如疾病复发、死亡等)的风险大小。
在这里插入图片描述

将风险评分和生存信息,基因表达量等整理到一张表格中,后续验证会用到

riskScore$sample <- rownames(riskScore)cox_data <- dplyr::select(dat, OS, OS.time, hub_gene$symbol)
cox_data$sample <- rownames(cox_data)risk <- merge(cox_data, riskScore, by = 'sample')
risk$risk <- ifelse(risk$riskscore > median(risk$riskscore), 1, 0)write.csv(risk, './risk.csv')

risk 如下图所示,第一列sample为样本名,第二列OS就是样本对应的生存状态,OS.time就是样本对应的生存时间,中间的列就是那10个预后基因对应的表达量,倒数第二列riskscore就是前一步计算出来的风险评分,最后一列risk就是对应的风险分组,1表示高风险组,0表示低风险组,区分度是风险评分的中位值。
在这里插入图片描述

计算出来的风险评分,就是模型对患者未来健康状况或疾病进展风险的量化评估,后续将针对计算出来的风险评分去研究如何对预后模型进行验证,在本章中不做介绍,会在全部预后模型介绍完之后统一进行说明



结语:

以上就是构建预后模型之多因素cox模型的所有过程,如果有什么需要补充或不懂的地方,大家可以私聊我或者在下方评论。

如果觉得本教程对你有所帮助,希望广大学习者能够花点自己的小钱支持一下(点赞旁的打赏按钮)作者创作(可以的话一杯蜜雪奶茶即可),感谢大家的支持~~~~~~ ^_^ !!!

祝大家能够开心学习,轻松学习,在学习的路上少一些坎坷~~~

请添加图片描述


  • 目录部分跳转链接:零基础入门生信数据分析——导读

http://www.ppmy.cn/news/1517131.html

相关文章

如何构建社区康养管理系统?实现老年人服务管理全攻略【Java SpringBoot】

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

【Go语言成长之路】多模块工作区入门

文章目录 【Go语言成长之路】多模块工作区入门前提条件一、创建一个模块二、创建工作空间三、创建第二个模块四、更多关于workspace 【Go语言成长之路】多模块工作区入门 ​ 多模块工作区(muti-module workspaces)可以使得开发者在多个模块中构建并且运行代码&#xff0c;相互…

在浏览器上使用transformers.js运行(WebGPU)RMBG-1.4进行抠图(背景移除)

在浏览器上使用transformers.js运行&#xff08;WebGPU&#xff09;RMBG-1.4进行抠图&#xff08;背景移除&#xff09; 说明&#xff1a; 首次发表日期&#xff1a;2024-08-28官方Github仓库地址&#xff1a; https://github.com/xenova/transformers.js/tree/main/examples…

《深入浅出WPF》读书笔记.8路由事件

《深入浅出WPF》读书笔记.8路由事件 背景 路由事件是直接响应事件的变种。直接响应事件&#xff0c;事件触发者和事件响应者必须显示订阅。而路由事件的触发者和事件响应者之间的没有显示订阅&#xff0c;事件触发后&#xff0c;事件响应者安装事件监听器&#xff0c;当事件传…

SpringBoot -在Axis2中,RPCServiceClient调用WebService

在 Axis2 中,RPCServiceClient 是一种用于调用 WebService 的客户端实现。下面是如何将它们 结合起来使用的一个示例: 步骤 1: 添加依赖 首先,在 pom.xml 文件中添加 Axis2 的相关依赖。 <dependencies><!-- 其他依赖 --><dependency><groupId>…

拓扑排序-

基本原理 就是存在一个入度为0的点和一个出度为0的点 然后图中所有点都是指向同一个方向&#xff1b; /* 拓扑序列&#xff1a; 特点&#xff1a;有向无环图 判断&#xff1a;判断所有的点是否入度为0 换句话 就是入度为0的点个数是否满点的总数 过程&#xff1a;建图、入度数…

2024HarmonyOS应用开发者高级认证最新整理题库和答案(已收录182道 )

更新截止2024-08-27,完整题库一共182道题,足够覆盖90%考题,如有新题和遗漏我会持续补充 所有题目的选项都是打乱顺序的,记答案不要记序号 完整题库请在我的网盘下载或查看在线文档 完整题库在线文档预览 单选(已收录102道) 1 . 以下哪个装饰器用来表示并发共享对象。(B) A. @…

通过Python绘制不同数据类型适合的可视化图表

在数据可视化中&#xff0c;对于描述数值变量与数值变量之间的关系常见的有散点图和热力图&#xff0c;以及描述数值变量与分类变量之间的关系常见的有条形图&#xff0c;饼图和折线图&#xff0c;可以通过使用Python的matplotlib和seaborn库来绘制图表进行可视化表达&#xff…

超详细!!!uniapp通过unipush全流程实现app消息推送

云风网 云风笔记 云风知识库 一、HBuilder新建APP项目 二、配置推送服务 1、登录Dcloud开发者中心开发者中心&#xff0c;查看我的应用 2、生成云端证书 3、创建平台信息 4、配置推送服务信息 这里需要关联服务空间&#xff0c;可以申请免费服务空间进行测试 三、代码配置 1…

Java笔试面试题AI答之线程(24)

文章目录 139. 简述为什么 wait(), notify()和 notifyAll()必须在同步方法或 者同步块中被调用&#xff1f;140. 简述为什么 Thread 类的 sleep()和 yield ()方法是静态的 &#xff1f;1. sleep() 方法2. yield() 方法总结 141. 简述同步方法和同步块&#xff0c;哪个是更好的选…

hydra密码爆破工具详细使用教程

Hydra是一个强大的密码爆破工具&#xff0c;可以用来测试网络系统的弱口令。下面是使用Hydra的基本教程&#xff1a; 1. 安装Hydra 可以从Hydra的官方网站&#xff08;https://github.com/vanhauser-thc/thc-hydra&#xff09;下载最新版本的Hydra&#xff0c;并按照安装说明进…

spring boot 配置监听多端口

如何实现Spring Boot配置监听多端口 1. 概述 在Spring Boot应用中&#xff0c;有时候需要监听多个端口&#xff0c;比如同时监听HTTP和HTTPS端口。本文将介绍如何实现在Spring Boot应用中配置监听多端口。 2. 流程表格 步骤 操作 1 添加依赖 2 创建多端口配置类 3 …

turtlebot 测试 Gazebo Harmonic ROS Jazzy

源码移植后理论上支持所有Gazebo和ROS版本&#xff0c;但花费时间较多。 只推荐学习Gazebo 经典版和Gazebo Harmonic以及之后版本。 在中间的过渡版本&#xff0c;不推荐学习。 Gazebo经典版包括Gazebo 7 Gazebo 9 Gazebo 11。 Gazebo Harmonic 和 ROS2 jazzy 安装和测试-CSDN博…

vue3+ts el-table 鼠标移动到某单元格内时就显示 tooltip

在Vue 3和Element Plus中&#xff0c;要在鼠标移动到表格某个单元格上时显示tooltip&#xff0c;可以使用el-tooltip组件&#xff0c;并结合表格的cell-mouse-enter和cell-mouse-leave事件。 <template> <el-table :data"tableData" cell-mouse-e…

深度学习-批量与动量【Datawhale X 李宏毅苹果书 AI夏令营】

实际工程中使用批量和动量可以对抗鞍点或局部最小值。 批量&#xff1a; 在计算梯度的时候不会用所有数据计算损失。类比我们考试复习时&#xff0c;一个单元一个单元的知识点输入&#xff0c;所有单元都输入就是一整个轮回。而这一个单元用深度学习的术语来说就是批量&#x…

CSRF 概念及防护机制

概述 CSRF&#xff08;Cross-Site Request Forgery&#xff09;&#xff0c;即跨站请求伪造&#xff0c;是一种网络攻击方式。在这种攻击中&#xff0c;恶意用户诱导受害者在不知情的情况下执行某些操作&#xff0c;通常是利用受害者已经登录的身份&#xff0c;向受害者信任的…

【精选】基于数据可视化的智慧社区内网平台

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

华为AC旁挂二层组网配置详解:从DHCP部署到无线业务配置,完成网络搭建

组网需求 AC组网方式&#xff1a;旁挂二层组网。 DHCP部署方式&#xff1a; AC作为DHCP服务器为AP分配IP地址。 防火墙作为DHCP服务器为STA分配IP地址。 业务数据转发方式&#xff1a;直接转发。 网络拓扑图 对于旁边路直接转发&#xff0c;优点就是数据流量不经过AC&…

决策树和随机森林介绍

hello大家好&#xff0c;俺是没事爱瞎捣鼓又分享欲爆棚的叶同学&#xff01;&#xff01;&#xff01;今天我来给大家介绍一下决策树与随机森林&#xff0c;说起随机森林俺还有件很久远的丑事&#xff0c;之前有关课的结课作业就是用模型训练并预测&#xff0c;那时我比较天真&…

OpenCV(第二关--读取图片和摄像头)实例+代码

以下内容&#xff0c;皆为原创&#xff0c;制作不易&#xff0c;感谢大家的关注和点赞。 一.读取图片 我们来读取图片&#xff0c;当你用代码读取后&#xff0c;可能会发现。怎么跟上传的图片颜色有些许的不一样。因为OpenCV的颜色通道是BGR&#xff0c;而我们平常用的matplotl…