当前位置: 首页 > news >正文

R语言手搓一个计算生存分析C指数(C-index)的函数算法

应粉丝要求,需要手写一个计算生存分析C指数(C-index)的函数。我在既往文章有介绍:C指数是评估生存模型预测性能的核心指标,其思想源自大神Harrell’s C-statistic。它衡量的是:模型对任意两个个体发生事件风险的排序能力。

在这里插入图片描述

  1. 核心思想
    对于一对可比较的个体 (i, j):
    若模型预测的风险 risk_i > risk_j,
    且实际观察到 time_i < time_j(即个体 i 比 j 更早发生事件),
    则这对个体被认为是“一致的”(concordant)。
    C指数就是所有可比较对中,“一致对”的比例。

在这里插入图片描述
用通俗的话来说,咱们以死亡举例子,比如咱们预测A的死亡率高于B,那么A的生存时间是不是要短于B?,要是咱们计算A和B的时候,A死亡率高B,而且A的生存时间短于B,那么咱们就说A和B具有一致性。因此,咱们需要的参数有:死亡结局,生存时间和预测的死亡率。

概念很简单,但实际操作还是有许多情况要考虑的,
比如:
1.在A和B都挂了,就直接比较AB的生存时间
2.A挂了,B还没挂,这个需要份两个情况,A风险大于B和A风险小于B
3.A没挂,B挂了,也是要分两种情况,A风险大于B和A风险小于B

下面导入个实际数据来演示一下:自用的是survival包自带的癌症数据

library(survival)
library(rms)
bc<-cancer
bc$status<-ifelse(bc$status==1,0,1)

在这里插入图片描述
Status是结局指标,time是时间,其他是协变量

刚才咱们知道:咱们需要的参数有:死亡结局,生存时间和预测的死亡率。因此先组建模型

dc<-datadist(bc)
options(datadist="dc")
f <- cph(Surv(time, status) ~ age + sex + ph.ecog + pat.karno +wt.loss, x=T, y=T, surv=T, data=cancer, time.inc=36)

生成预测概率,这个预测概率就是咱们的三要素中的预测的死亡率

bc$risk_score<-predict(f)

既然三个指标都有了,咱们就可以开干计算了

先生成所有的基础指标

  n <- length(time)concordant <- 0     discordant <- 0      tied_risk <- 0       total_pairs <- 0   

写个循环,要考虑上面三个情况

for (i in 1:(n-1)) {for (j in (i+1):n) {if (time[i] != time[j] && (status[i] == 1 || status[j] == 1)) {total_pairs <- total_pairs + 1if (time[i] < time[j]) {if (risk[i] > risk[j]) {concordant <- concordant + 1} else if (risk[i] < risk[j]) {discordant <- discordant + 1} else {tied_risk <- tied_risk + 1}} else {if (risk[j] > risk[i]) {concordant <- concordant + 1} else if (risk[j] < risk[i]) {discordant <- discordant + 1} else {tied_risk <- tied_risk + 1}}}}
}

最后进行计算

c_index <- (concordant + 0.5 * tied_risk) / total_pairs

咱们把上面步骤封装成一个函数,进行计算一下,约等于0.658

在这里插入图片描述
那这个结果对不对呢,咱们使用RMS包自带的rcorrcens函数和survival包的concordance函数验证一下

concordance(f)

在这里插入图片描述
也是0.658,结果一模一样,再试下RMS包自带的rcorrcens函数

rcorrcens(Surv(time, status) ~ predict(f), data = bc)

在这里插入图片描述
1-0.342=0.658,因此,三个函数计算的结果都是一模一样,咱们计算完全没有问题,玩美复现了生存分析C指数计算,但是我这个走的是for循环,数据量大的话可能要等一等。

新的问题来复杂加权数据也就nhanes数据的生存分析C指数怎么算?了解了原理,计算也就非常容易了,下次再介绍。

http://www.dtcms.com/a/494463.html

相关文章:

  • 使用leaflet库加载服务器离线地图瓦片(这边以本地nginx服务器为例)
  • 无状态协议HTTP/HTTPS (笔记)
  • 模式识别与机器学习课程笔记(8):特征提取与选择
  • python+uniapp基于微信美食点餐系统小程序
  • 【邀请函】锐成信息 × Sectigo | CLM - SSL 证书自动化运维解决方案发布会
  • 基于MATLAB实现基于距离的离群点检测算法
  • 冠县网站建设电话wordpress插件 电商
  • 【Android】RecyclerView LayoutManager 重写方法详解
  • 数据流通合规新基建 隐私计算平台的三重安全防线
  • MySQL-2--数据库的查询
  • 微信公众号商城网站开发wordpress 留言板制作
  • 虚幻基础:角色旋转控制角色视角控制
  • 【轨物方案】智慧供暖全景运营物联网解决方案
  • 超越“接收端”:解析视频推拉流EasyDSS在RTMP推流生态中的核心价值与中流砥柱作用
  • 自助建站上建的网站免费吗信息技术网站建设专业
  • 融合SpringBoot3和Vue3工程
  • 怎么学做网站制作商水县住房城乡建设网站
  • 16-机器学习与大模型开发数学教程-第1章 1-8 泰勒展开与高阶近似
  • 【学习系列】SAP RAP 6:行为定义-Concurrency Control
  • docker 运行容器限制 CPU
  • Python自动化从入门到实战(24)如何高效的备份mysql数据库,数据备份datadir目录直接复制可行吗?一篇给小白的完全指南
  • 个人可以备案网站的内容国外直播平台tiktok
  • C语言也能干大事网站开发pdf企业网站管理系统多站多语言版
  • 清理页面缓存
  • YD925输出5V,高性价比的非隔离电源方案详细介绍
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十二)Python编程之常用模块
  • SQL注入完全攻略:从手工注入到自动化工具的渗透实战
  • 做网站的价格是多少临沂网站域名
  • 深入理解 HTML `<label>` 的 `for` 属性:提升表单可访问性与用户体验
  • 大型语言模型(LLM)文本中提取结构化信息:LangExtract(一)