“negative event times encountered; not permitted for Cox family“

2023-10-26

"not permitted for Cox family"

搞了好久,才发现生存时间里面有0值,所以必须删除0

基于Lasso回归筛选变量构建Cox模型并绘制Nomogram

研究背景

本章是基于Lasso回归筛选变量后,构建Cox回归临床预测模型,并绘制Nomogram图。Cox模型是一种半参数模型,该模型以生存结局和生存时间为因变量,分析多个因素对生存期的影响,常用RR来量化这种结果,绘制Nomogram列线图实现个体预测。有关Lasso回归可见公众号前文章介绍:如何进行高维变量筛选和特征选择(一)?Lasso回归

案例研究

  • 本文数据收集了83例癌症患者的生存资料,包含患者年龄、性别、癌症分期等。研究目的探讨癌症患者生存情况的影响因素并构建预测模型。
    临床研究一般有提供多个危险因素,首先做单因素的筛选,具体筛选方法,见公众号之前的文章。本文采用Lasso回归筛选因素。

  • 具体分析步骤是①筛选变量②基于这些变量构建模型③绘制Nomogram图,预测不同时间生存概率。③计算模型c_index(区分度)该步骤用神包rms一步实现。接下来直接上代码。

R代码及解读

##加载包 明确每个包的作用
library(glmnet) ##Lasso回归
library(rms)  ## 画列线图;
library(VIM) ## 包中aggr()函数,判断数据缺失情况
library(survival) ##  生存分析包
#读取数据集
dt <-read.csv("cancer.csv")
str(dt)  ##查看每个变量结构
aggr(dt,prop=T,numbers=T) #判断数据缺失情况,红色表示有缺失。
dt <- na.omit(dt) 按行删除缺失值

由图片可看到所有变量都为蓝色,没有缺失值。如果用na.omit()函数按照行删除。

第一步,也是很重要的一步,数据整理。

用for循环语句将数值型变量转为因子变量

for(i in names(dt)[c(4:9)]){dt[,i]<-as.factor(dt[,i])}##筛选变量前,首先将自变量数据(因子变量)转变成矩阵(matrix)## Lasso要求的数据类型
x.factors <- model.matrix(~ dt$sex+dt$trt+dt$bui+dt$ch+dt$p+dt$stage,dt)[,-1]#将矩阵的因子变量与其它定量边量合并成数据框,定义了自变量。
x <-as.matrix(data.frame(x.factors,dt[,3]))#设置应变量,打包生存时间和生存状态(生存数据)
y <- data.matrix(Surv(dt$time,dt$censor))
第二步:Lasso回归筛选变量
#调用glmnet包中的glmnet函数,注意family那里一定要制定是“cox”,如果是做logistic需要换成"binomial"。
fit <-glmnet(x,y,family ="cox",alpha =1)plot(fit,label=T)plot(fit,xvar="lambda",label=T)
#主要在做交叉验证,lasso
fitcv <- cv.glmnet(x,y,family="cox", alpha=1,nfolds=10)plot(fitcv)coef(fitcv, s="lambda.min")
##
#9 x 1 sparse Matrix of class "dgCMatrix"1
##d.sex1    .       
##d.trt1    .       
##d.bui1    .       
##d.ch2     .       
##d.ch3     .       
##d.ch4    -0.330676
##d.p1      .       
##d.stage4  .       
##d...3.

该图在之前文章提到,见如何进行高维变量筛选和特征选择(一)?Lasso回归,由上述代码以及图片完成变量筛选,这里只做演示,假设所有的变量都入选了,我们用这些入选的变量构建Cox回归模型。

第三步:构建Cox模型,并检验等比例风险
#拟合cox回归
coxm <-cph(Surv(time,censor==1)~age+sex+trt+bui+ch+p+stage,x=T,y=T,data=dt,surv=T) 
cox.zph(coxm)#等比例风险假定
##       chisq df     p
##age    1.993  1 0.158
##sex    0.363  1 0.547
##trt    3.735  1 0.053
##bui    2.587  1 0.108
##ch     0.296  1 0.587
##p      0.307  1 0.579
##stage  0.395  1 0.530
##GLOBAL 9.802  7 0.200

注意chp()函数的写法,其中因变量需要用Surv()先打包。后面写法同LR。

等比例风险检验:最后面的GLOBAL是整体看,P值大于0.05,全模型整体都是满足的。对于每一个分类来说P值大于0.05,也是满足的。

第四步:绘制nomogram图,注意该函数里面的参数设置。
surv <-Survival(coxm) # 建立生存函数
surv1 <-function(x)surv(1*3,lp=x) # 定义time.inc,3月OS
surv2 <-function(x)surv(1*6,lp=x) # 定义time.inc,6月OS
surv3 <-function(x)surv(1*12,lp=x) # 定义time.inc,1年OS

dd<-datadist(dt) #设置工作环境变量,将数据整合
options(datadist='dd') #设置工作环境变量,将数据整合

plot(nomogram(coxm,fun=list(surv1,surv2,surv3),
              lp= F,
              funlabel=c('3-Month Survival','6-Month survival','12-Month survival'),
              maxscale=100,fun.at=c('0.9','0.85','0.80','0.70','0.6','0.5','0.4','0.3','0.2','0.1')),
     xfrac=.45)
#maxscale 参数指定最高分数,一般设置为100或者10分
#fun.at 设置生存率的刻度
#xfrac 设置数值轴与最左边标签的距离,可以调节下数值观察下图片变化情况
plot(nomogram)

该图的使用,本质上是将Cox回归模型可视化展示,方便临床快速判断。假设有个病人性别为女,trt为0,P期为1,Nomogram用法是在sex变量上找到其值为1的刻度,然后画垂线投影到最上方的points刻度尺上,找到对应的分值为75分,同理找到trt为0的分值约为50分,P为1的对应分值为100,将这三个因素的points值加起来总分225。下一步在下面的Total Points刻度尺上找到225分,向下方的3个轴做垂线,6-Month-survival对应的值在0.6和0.7之间,约为0.65,说明该患者6个月的生存概率值为65%,其他以此类推。

第五步:利用rms包计算模型区分度。
##模型验证
#Concordance index
f<-coxph(Surv(time,censor==1)~age+sex+trt+bui+ch+p+stage,data=d)
sum.surv<-summary(f)
c_index<-sum.surv$concordance
c_index  ##
##C      se(C) 
##0.55396619 0.07664425

该模型的区分度C-index为0.554,其本质同ROC曲线面积。结果显示,该模型的区分度一般。根据前面变量筛选,考虑纳入更多的影响因素和样本。

函数介绍

glmnet()

glmnet(x, y, family = c("gaussian", "binomial", "poisson", "multinomial",
"cox", "mgaussian"), weights = NULL, offset = NULL, alpha = 1,
nlambda = 100, lambda.min.ratio = ifelse(nobs < nvars, 0.01, 1e-04),
lambda = NULL, standardize = TRUE, intercept = TRUE,
thresh = 1e-07, dfmax = nvars + 1, pmax = min(dfmax * 2 + 20,
nvars), exclude = NULL, penalty.factor = rep(1, nvars),
lower.limits = -Inf, upper.limits = Inf, maxit = 1e+05,
type.gaussian = ifelse(nvars < 500, "covariance", "naive"),
type.logistic = c("Newton", "modified.Newton"),
standardize.response = FALSE, type.multinomial = c("ungrouped",
"grouped"), relax = FALSE, trace.it = 0, ...)

cv.glmnet()

cv.glmnet(x, y,family = c("gaussian", "binomial", "poisson", "multinomial",
"cox", "mgaussian"), weights = NULL, offset = NULL, lambda = NULL,
type.measure = c("default", "mse", "deviance", "class", "auc", "mae",
"C"), nfolds = 10, foldid = NULL, alignment = c("lambda",
"fraction"), grouped = TRUE, keep = FALSE, parallel = FALSE,
gamma = c(0, 0.25, 0.5, 0.75, 1), relax = FALSE, trace.it = 0, ...)

Lasso回归复杂度调整的程度由参数lambda来控制,lambda越大模型复杂度的惩罚力度越大,从而获得一个较少变量的模型。Lasso回归和bridge回归都是Elastic Net广义线性模型的特例。除了参数lambda,还有参数alpha,控制对高相关性数据时建模的形状。Lasso回归,alpha=1(R语言glmnet的默认值),brigde回归,alpha=0,一般的elastic net 0<alpha<1.

根据Hastie(斯坦福统计学家), Tibshirani和Wainwright的Statistical Learning with Sparsity(The Lasso and Generalizations),如下五类模型的变量选择可采用R语言的glmnet包来解决。这五类模型分别是:

1. 二分类logistic回归模型

2. 多分类logistic回归模型

3.Possion模型

4.Cox比例风险模型

5.SVM

下面介绍如何使用glmnet包来实现,以二元logistic回归模型为例:

>library("glmnet") #加载该软件包

>cv.fit<-cv.glmnet(x,y,family="binomial")

#x为输入特征,x应该是矩阵格式的,若非矩阵格式,采用as.matrix()转换成矩阵格式,否则,会报如下错误:Error in lognet(x, is.sparse, ix, jx, y, weights, offset, alpha, nobs, :

(串列)对象不能强制改变成'double'种类。

其他模型familiy值不一样,如cox风险比例模型是cox,possion是possion,多分类logistic是multinomial,广义线性模型guassian,family还有一种选择是mgaussian,不知是否是svm模型?

正确答案是:参数family规定了回归模型的类型:

----family="gaussian"适用于一维连续因变量

----family=mgaussian"适用于多维连续因变量

----family="poisson"适用于非负次数因变量(count)

----family="binomial"适用于二元离散因变量(binary)

----family="multinomial"适用于多元离散因变量(category)

>plot(cv.fit)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“negative event times encountered; not permitted for Cox family“ 的相关文章

  • 软件测试|Python中如何提取列表中索引为奇数的元素

    简介 在Python中 我们经常需要从列表中提取特定位置的元素 如果我们想要提取列表中索引为奇数的元素 可以使用一些简单的方法来实现这一目标 本文将介绍如何在Python中提取列表中索引为奇数的元素 并提供示例代码来帮助大家更好地理解这个过
  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 基于java的婴幼儿产品销售系统设计与实现

    基于java的婴幼儿产品销售系统设计与实现 I 引言 A 研究背景和动机 婴幼儿产品销售系统是针对婴幼儿家庭的产品销售平台 该系统的设计需要满足安全 便捷 高效等多个方面的要求 针对该系统 我们可以采用基于Java的Web框架搭建 主要分为
  • 软件测试|使用Python读写yaml文件,你会了吗?

    简介 YAML YAML Ain t Markup Language 是一种可读的数据序列化格式 它常用于配置文件和数据交换 Python 提供了许多库来处理 YAML 文件 在本文中 我们将探讨如何使用 PyYAML 库来读取和写入 YA
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】毕业生就业管理微信小程序_lm9q0

    腾讯公司在2017年1月19日发布了一款不需要下载 不需要卸载 不需要存储的软件叫微信小程序 受到了很多人的喜欢 微信小程序自2017年发布至今 依托微信的社交属性和庞大的用户基数 已经渗透到生活的方方面面 1 微信小程序可以将基于微信平台
  • qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““

    系统环境 Win10家庭中文版 Qt 5 12 9 链接了一些64位的第三方库 程序编译完运行后出现 qt qpa plugin Could not find the Qt platform plugin windows in 弹窗如下 网
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 面试官随便问几个问题就知道你究竟做没做过微信支付宝支付

    面试官随便问几个问题就知道你究竟做没做过微信支付宝支付 你知道直连模式和服务商模式吗 网上的课程一般给你演示的都是直连模式 而企业中有不少是申请成为了服务商 因为里面有佣金提成 我粗俗地解释 直连模式 就是说你是一个会做生意的老板 自己会搞
  • (2024最新整理)Java最全八股文及答案!

    Java的特点 Java是一门面向对象的编程语言 面向对象和面向过程的区别参考下一个问题 Java具有平台独立性和移植性 Java有一句口号 Write once run anywhere 一次编写 到处运行 这也是Java的魅力所在 而实
  • 计算机Java项目|在线图书管理

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 春眠不觉晓,Java数据类型知多少?基础牢不牢看完本文就有数了

    俺滴座右铭是不在沉默中爆发 就在沉默中灭亡 一起加油学习 珍惜现在来之不易的学习时光吧 等工作之后 你就会发现 想学习真的需要挤时间 厚积薄发啦 我们知道Java是面向对象的静态型编程语言 在Java的世界里万物皆对象 但我认为是万物皆数据
  • 【一种新的Burton-Miller型奇异边界方法(BM-SBM)】用于声学设计灵敏度分析,2D和3D声学设计灵敏度分析的奇异边界方法研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 2D 2 2 3D
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-查找接口成功率最优时间段-Python-OD统一考试(C卷)

    题目描述 服务之间交换的接口成功率作为服务调用关键质量特性 某个时间段内的接口失败率使用一个数组表示 数组中每个元素都是单位时间内失败率数值 数组中的数值为0 100的整数 给定一个数值 minAverageLost 表示某个时间段内平均失
  • sychnorized积累

    sychnorized 1 对象锁 包括方法锁 默认锁对象为this 当前实例对象 和同步代码块锁 自己指定锁对象 2 类锁 指synchronize修饰静态的方法或指定锁对象为Class对象 3 加锁和释放锁的原理 现象 时机 内置锁th
  • 在 Python 中实现 List 抽象

    在 Python 中 创建一个包含多个对象的 list 很常见 例如 对于一组具有相同功能的对象 比如播放声音 希望能够使用类似 my list play 的语法来触发 list 中所有对象的 play 方法 另一个例子是 当希望关闭 li
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个

随机推荐

  • day5 qt

    include widget h include ui widget h Widget Widget QWidget parent QWidget parent ui new Ui Widget ui gt setupUi this tim
  • 计算机无法识别荣耀9,华为荣耀9连接不上电脑端华为手机助手怎么处理?

    如果手机无法连接华为手机助手 可通过以下步骤来尝试解决 步骤一 请确认USB线连接是否正常 若手机通知栏中没有显示USB已连接的提示 则可能是USB线连接不正常 手机能充电不能说明USB线是完全连接正常 比如部分USB线仅支持充电不支持数据
  • 独家

    随机森林 概述 当变量的数量非常庞大时 你将采取什么方法来处理数据 通常情况下 当问题非常庞杂时 我们需要一群专家而不是一个专家来解决问题 例如Linux 它是一个非常复杂的系统 因此需要成百上千的专家来搭建 以此类推 我们能否将许多专家的
  • 将线程pid转成16进制_如何使用jstack分析线程状态

    背景 记得前段时间 同事说他们测试环境的服务器cpu使用率一直处于100 本地又没有什么接口调用 为什么会这样 cpu使用率居高不下 自然是有某些线程一直占用着cpu资源 那又如何查看占用cpu较高的线程 当然一个正常的程序员不会写出上述代
  • Spring Cloud中的Ribbon的实现和使用

    Spring Cloud Ribbon 是 Spring Cloud 生态系统中的一个负载均衡客户端 它可以轻松地与其他 Spring Cloud 组件集成 提供负载均衡的方式来访问后端服务 下面介绍 Spring Cloud Ribbon
  • 如何进行远程调试(remote debug)。

    场景 scenario 本地机器 A 重现不了问题 其他机器或其他系统 B 可以重现问题 而重现问题的机器没有装VS调试工具 在开发本地机器中拷贝远程调试工具 以VS 2015 为例 将C Program Files x86 Microso
  • yum错误:Invalid configuration value: failovermethod=priority in /etc/yum.repos.d/CentOS-Epel.repo;

    错误描述 yum install y yum utils device mapper persistent data lvm2 Invalid configuration value failovermethod priority in e
  • 解析优化机器人课程体系与教学策略

    依据 基础教育信息技术课程标准 制定机器人教育课程标准 将机器人教育课程纳入新的课程体系 对现有机器人教育教材进行重新规划和修订 提高机器人教育在中小学阶段课时的比例 同时保证实践课的课时比例 加强学生的动手能力 保证教学质量 除此 还要保
  • 请尽快报名参加Imagine Cup 微软“创新杯”全球学生大赛

    微软Imagine Cup 2013大赛报名即将截止 截止报名时间是2013年1月31日 请各大高校抓紧时间报名参加 CSDN高校俱乐部校区将选出1个校区一等奖 10个校区二等奖 校区一等奖可直接参加中国区半决赛 团队成员还可获得CSDN高
  • VS构建项目报错信息及解决办法04

    报错信息及解决7 报错信息详情 error LNK2001 无法解析的外部符号 symbol 原因 编译后的代码引用或调用符号 该符号未在链接器搜索的任何库或对象文件中定义 什么是未解析的外部符号 符号 是函数或全局变量的内部名称 它是在已
  • 【算法】最优服务次序问题(贪心算法)

    设有n 个顾客同时等待一项服务 顾客i需要的服务时间为 t i 1 lt i lt n 应如何安排n个顾客的服务次序才能使平均等待时间达到最小 平均等待时间是n 个顾客等待服务时间的总和除以n 输入格式 第一行是正整数n 1
  • 归档的概念和用法

    归档的概念和用法 概念 对象归档是指将对象写入文件保存在硬盘的文件内 当在次打开程序时 可以还原这些对象 也可以称为对象序列化 对象持外化 数据持久化的方式 1 gt NSKeyedArchiver 对象归档 2 gt NSUserDefa
  • 回味2022

    回味2022 1 前言 2 过去的十二个月 3 我期望的2023 1 前言 2021年写给自己的总结 回味2021 一年又一年飞逝的光阴 我想唯有时间留给人的印象最为深刻吧 春去秋来 四季轮回间都是时光的印记 2022年12月30日 25岁
  • pycocotools报错 if type(resFile) == str or type(resFile) == unicode: NameError: name ‘unicode‘ is

    Q pycocotools报错 if type resFile str or type resFile unicode NameError name unicode is not defined A pycocotools与python版本
  • Springboot定义Controller接口的这些方式你肯定不知道

    环境 Springboot2 4 11 概述 当一个请求过来后Spring是如何进行处理的 下面简单的罗列下请个的过程中核心组件 SpringMVC处理的流程 DispatcherServlet 所有请求的入口 HandlerMapping
  • unity获取子物体个数、获取别的脚本的参数、获取脚本名、查找显示的物体、物体的显示和隐藏

    获取子物体个数 我有这么一个层级 我要获取levelSelectPanel里的levelSelectButton个数 于是 在脚本里先定义一个GameObject 用于接受面板输入进来的levelSelectPanel是哪一个 public
  • Python+Vue计算机毕业设计Vue的小区物业管理网站gb99s(源码+程序+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 项目运行环境配置 Python3 7 7 Django Mysql5 7 pip list HBuilderX Vscode也行 Vue Pychram社区版 项目技术 Dja
  • TypeScript学习(四):对象的定义及使用

    前面我们说到了数据类型 像什么布尔类型 数值类型 字符串类型等等 在开发中 我们还会遇到很多像对象 数组 函数等类型 那么在typescript中是怎么定义这些类型的 对象 object 我们先介绍下在JavaScript中式怎么定义对象的
  • 小智AI ChatGPT拓展人工智能应用的新可能

    人工智能 AI 技术是当今世界上最受关注的领域之一 随着越来越多的数据被收集 处理和分析 人们对AI的期望也在不断提高 AI的应用范围已经不再局限于科学研究和工业生产 而是逐渐渗透到各个领域 如医疗保健 金融 农业等 本文将探讨ChatGP
  • “negative event times encountered; not permitted for Cox family“

    not permitted for Cox family 搞了好久 才发现生存时间里面有0值 所以必须删除0 基于Lasso回归筛选变量构建Cox模型并绘制Nomogram 研究背景 本章是基于Lasso回归筛选变量后 构建Cox回归临床预