医院内跌倒的预测模型构建(Boruta+lightgbm+DCA分析)

医院内跌倒的预测模型构建(Boruta+lightgbm+DCA分析)

跌倒有时候是很严重的事情,常常听说骨质疏松的老年人跌倒后造成髋骨骨折,导致长期卧床,进而导致肌肉萎缩、肺炎等等并发症,最终导致不良预后。医院内的跌倒也是相似的情况,而跌倒又是可以预防的事件,明确医院内跌倒的危险因素并进行预测,都会有助于预防医院内跌倒。数据集来自于dryad数据库,属于来自于临床的真实数据。

上篇文章中,我将分类预测模型分为两种类型,一类是直接预测类别,这类模型重视准确度等评价指标;另一类是将预测概率作为模型预测结果,重视校准曲线等评价指标。这里阐述后一类预测模型的构建流程,作为举例说明。完成代码请查看和鲸社区相关项目。

1. Boruta变量筛选

根据模型构建目的确定结局变量为是否发生了医院内跌倒。通过变量筛选迅速确定与结局指标相关的因素作为构建预测模型的预测变量。

library(Boruta)
#Boruta筛选变量
set.seed(1)
boruta_obj<-Boruta(event~.,data=data_m,doTrace=0,ntree=400,pValue=0.05)
print(TentativeRoughFix(boruta_obj))#分两类
print(boruta_obj)#三类,包含怀疑的数据

在这里插入图片描述

2. 构建临床预测模型

这一步唯一想说的就是下面的后概率校准过程。使用的是probably包,同时改善了ROC曲线和校准曲线的表现,而有一个良好的校准曲线是使用预测概率作为预测结果的前提条件。

#通过交叉验证进行模型评价
set.seed(345)
lightgbm_res_fit <-lightgbm_wf%>%
  finalize_workflow(best_lightgbm)%>%
  fit_resamples(resamples=cv_folds,metrics=cls_metrics,control=control_resamples(save_pred = TRUE))

lightgbm_res_fit %>%
  collect_metrics()
# # 
lg_predict_data <- lightgbm_res_fit %>%
  collect_predictions()
# head(lg_predict_data)#用于dca分析的概率
logit_val <- cal_validate_logistic(lightgbm_res_fit, metrics = cls_metrics, save_pred = TRUE)
#矫正后的模型可以取metrics和probility
collect_metrics(logit_val)

在这里插入图片描述
在这里插入图片描述

3. DCA分析确定决策阈值

DCA最大的价值在于确定决策阈值。图中可以看到模型的阈值仅在0-0.25之间才能产生临床收益,可以作为决策阈值的范围,具体的决策阈值可以在这个范围内确定。完整的代码中展示了如何通过概率来绘制决策曲线,就不局限与线性模型。因为跌倒数据集属于不平衡数据集,导致阈值范围偏一侧。

#借鉴代码,a method, this code was used to calculate the nb 。
ntbft<-function(data,outcome,frm=NULL,exterdt=NULL,pred=NULL,xstart=0.01,xstop=0.99,step=0.01,type="treated"){
#main func
    pt<-seq(from=xstart,to=xstop,by=step)#生成threshold
    lpt<-length(pt)
    #type 
    if(type=="treated") coef<-cbind(rep(1,lpt),rep(0,lpt))
    if(type=="untreated") coef<-cbind(rep(0,lpt),rep(1,lpt))
    if(type=="overall") coef<-cbind(rep(1,lpt),rep(1,lpt))
    if(type=="adapt") coef<-cbind(1-pt,pt)
    #response
    response<-as.vector(t(data[outcome]))#true_value
    if(is.data.frame(exterdt)) response<-as.vector(t(exterdt[outcome]))# the nb of val data
    event.rate<-mean(response)#?
    nball<-event.rate-(1-event.rate)*pt/(1-pt)#ALL
    nbnone<-1-event.rate-event.rate*(1-pt)/pt#none

    #no pred, glm
    if(is.null(pred)){
        model<-glm(frm,data=data,family=binomial("logit"))
        pred<-model$fitted.values
    if(is.data.frame(exterdt))# val data
        pred<-predict(model,newdata=exterdt,type="response")
    }
# pred and response should be of the same length, pred and response was applied.计算NB
    N<-length(pred)
    nbt<-rep(NA,lpt)
    nbu<-rep(NA,lpt)
    for(t in 1:lpt){
        tp<-sum(pred>=pt[t] & response==1)
        fp<-sum(pred>=pt[t] & response==0)
        fn<-sum(pred<pt[t] & response==1)
        tn<-sum(pred<pt[t] & response==0)
        nbt[t]<-tp/N-fp/N*(pt[t]/(1-pt[t]))
        nbu[t]<-tn/N-fn/N*((1-pt[t])/pt[t])
        }
    nb<-data.frame(pt)#
    names(nb)<-"threshold"
    nb["all"]<-coef[,1]*nball
    nb["none"]<-coef[,2]*nbnone
    nb["pred"]<-coef[,1]*nbt+coef[,2]*nbu
    return(nb)
    }
plot.ntbft<-function(nb,nolines=2:dim(nb)[2], nobands=NULL,ymin=-0.01, ymax=max(nb[,c(nolines,nobands)],na.rm=T),
    legpos=c(0.9,0.8)){
#主函数
    ylow<-nb[,1]
    yup<-nb[,1]
    if(!is.null(nobands)){
        ylow<-nb[,min(nobands)]
        yup<-nb[,max(nobands)]
    }
    nb.melt<-melt(nb[,c(1,nolines)],
            id.vars="threshold",
            value.name="Netbenefit",variable.name="Models")
#绘图
print(ggplot(nb.melt)+
    theme(legend.position=legpos)+
    geom_line(aes(x=threshold,y=Netbenefit,
                colour=Models,linetype=Models
                ))+
    geom_ribbon(data=nb,aes(x=threshold,
                ymin=ylow,ymax=yup),
                linetype=2,alpha=0.2)+
    scale_y_continuous(limits=c(ymin,ymax))+
    xlab("Threshold probability")+ylab("Net benefit"))
}

在这里插入图片描述

4.最后

通过以上的步骤构建了一个临床预测模型,后续可以通过构建web APP 部署来方便临床实践,对医院内容易跌倒的人群进行预测,进而采取跌倒的保护措施,预防跌倒造成的危害。同时,建立相关的队列来评价预测模型是否能够产生临床影响,即是回答否保护了易跌倒的人群。在确认了这些之后,模型就可以进入到临床应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nacos源码分析01-服务注册与集群间数据是同步】

文章目录 了解CAPBASE理论Nacos支持CP还是AP集群数据同步实现集群数据一致性源码 了解CAP CAP理论的核心观点是&#xff0c;一个分布式系统无法同时完全满足一致性、可用性和分区容错性这三个特性。具体而言&#xff0c;当发生网络分区时&#xff0c;系统必须在一致性和可用性之…

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习&#xff0c;已经掌握了JavaSE的知识&#xff0c;这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种&#xff1a; 四类&#xff1a;整形、浮点…

​​​​​​​Beyond Compare 3密钥被撤销的解决办法

首先&#xff0c;BCompare3的链接如下 链接&#xff1a;https://pan.baidu.com/s/1vuSxY0cVQCt0-8CpFzUhvg 提取码&#xff1a;8888 --来自百度网盘超级会员V7的分享 1.问题现象 激活之后在使用过程中有时候会出现密钥被撤销的警告&#xff0c;而且该工具无法使用&#xff…

渡众机器人自动驾驶小车运行Autoware 实现港口物流运输

Autoware 是一个开源的自动驾驶软件堆栈&#xff0c;提供了丰富的功能和模块&#xff0c;用于实现自动驾驶车辆的感知、定位、规划和控制等功能。北京渡众机器人公司将多款自动驾驶小车在多场景运行Autoware &#xff0c;它可以实现以下功能&#xff1a; 1. 感知&#xff1a;利…

小数第n位【蓝桥杯】

小数第n位 模拟 思路&#xff1a;arr数组用来记录已经出现过的a&#xff0c;在循环时及时退出。易知题目的3位即a%a后的第n-1,n,n1位。该代码非常巧妙&#xff0c;num记录3位的输出状况。 #include<iostream> #include<map> using namespace std; typedef long l…

制造企业如何通过PLM系统实现BOM管理的飞跃

摘要 在当今快速变化的制造行业中&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;系统的应用已成为企业提升效率、降低成本和增强竞争力的关键。本文将探讨PLM系统如何通过其先进的BOM&#xff08;物料清单&#xff09;管理功能&#xff0c;帮助制造企业在整个产品生…

uniApp子组件监听数据的变化的方法之一

props:{//用来接收外界传递过来的数据swiperList:{type:Array,default:[]}}, swiperList&#xff1a;是父组件传递过来的值 通过 watch 监听&#xff08;在父组件中也同样可以使用&#xff0c;跟VUE的监听数据变化同理&#xff09; watch:{//监听组件中的数据变化swiperList(ol…

(深度学习记录)第TR3周:Transformer 算法详解

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文本的输入处理中&#xff0c;transformer会将输入文本序列的每个词转化为一个词向量&#xff0c;我们通常会选择一个合适的长度作为输入…

C. Turtle and an Incomplete Sequence

思路&#xff1a;首先如果都是-1的话&#xff0c;我们可以输出1 2循环&#xff0c;否则。 首先处理首尾的连续-1串&#xff0c;这个也很好处理&#xff0c;最后我们处理两个非-1之间的-1串。 对于左边的数a[l]和右边的数a[r]&#xff1a; 如果a[l] > a[r]&#xff0c;那么…

CompassArena 司南大模型测评--代码编写

测试角度 要说测试模型&#xff0c;对咱们程序员来说&#xff0c;那自然是写代码的能力强不强比较重要了。那么下面我们以 leetcode 中的一道表面上是困难题的题目来考考各家大模型&#xff0c;看看哪个才应该是咱们日常写程序的帮手。 部分模型回答 问题部分如下截图&#…

ArcGIS教程(05):计算服务区和创建 OD 成本矩阵

准备视图 启动【ArcMap】->双击打开【Exercise05.mxd】->启用【Network Analyst 扩展模块】。前面的文章已经讲过&#xff0c;这里不再赘述。 创建服务区分析图层 1、在 Network Analyst 工具栏上&#xff0c;单击 【Network Analyst】&#xff0c;然后单击【新建服务…

CAC2.0全生命周期防护,助力企业构建安全闭环

5月29日&#xff0c;CACTER邮件安全团队凭借多年的邮件安全防护经验&#xff0c;在“防御邮件威胁-企业如何筑起最后防线”直播分享会上展示了构建安全闭环的重要性&#xff0c;并深入介绍了全新CAC 2.0中的“威胁邮件提示”功能。 下滑查看更多直播精彩内容 构建安全闭环的必要…

Solidity学习-投票合约示例

以下的合约有一些复杂&#xff0c;但展示了很多Solidity的语言特性。它实现了一个投票合约。 当然&#xff0c;电子投票的主要问题是如何将投票权分配给正确的人员以及如何防止被操纵。 我们不会在这里解决所有的问题&#xff0c;但至少我们会展示如何进行委托投票&#xff0c;…

显示器与电脑如何分屏显示?

1.点击电脑屏幕右键--显示设置 2、然后找到屏幕---找到多显示器---选择扩展显示器

亚马逊云科技峰会盛大举行 | 光环新网携光环云数据以高性能智算服务助力企业创新发展

2024年5月29日&#xff0c;云计算行业的年度盛典”2024亚马逊云科技中国峰会”在上海世博中心再次盛大启幕。作为全球领先的云计算服务提供商&#xff0c;亚马逊云科技峰会聚焦前沿科技&#xff0c;与来自不同行业、不同科技领域的优秀企业和用户共同探索AI时代的云端创新发展。…

游戏逆向工具分析及解决方案

游戏逆向&#xff0c;是指通过各类工具对游戏进行反编译及源码分析&#xff0c;尝试分析游戏的实现逻辑的过程。这个过程需要使用解密、反编译、解压缩等技术&#xff0c;目的是还原或分析出游戏的代码逻辑及资源。 游戏逆向工具可以按照不同功能进行划分&#xff0c;如&#…

分布式任务队列系统 celery 原理及入门

基本 Celery 是一个简单、灵活且可靠的分布式任务队列系统&#xff0c;用于在后台执行异步任务处理大量消息。支持任务调度、任务分发和结果存储&#xff0c;并且可以与消息代理&#xff08;如 RabbitMQ、Redis 等&#xff09;一起工作&#xff0c;以实现任务的队列管理和执行…

对于vsc中的vue命令 vue.json

打开vsc 然后在左下角有一个设置 2.点击用户代码片段 3.输入 vue.json回车 将此代码粘贴 &#xff08;我的不一定都适合&#xff09; { "vue2 template": { "prefix": "v2", "body": [ "<template>", " <…

更新详情 | Flutter 3.22 与 Dart 3.4

作者 / Michael Thomsen 过去几个月&#xff0c;Dart & Flutter 部门可谓忙碌非凡&#xff0c;但我们很高兴地宣布&#xff0c;Flutter 3.22 和 Dart 3.4 已经在今年的 Google I/O 大会上精彩亮相&#xff01; Google I/Ohttps://io.google/2024/intl/zh/ 我们始终致力于提…

【调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站】

调试笔记-系列文章目录 调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站 文章目录 调试笔记-系列文章目录调试笔记-20240530-Linux-在 OpenWRT-23.05 上为 nginx 配置 HTTPS 网站 前言一、调试环境操作系统&#xff1a;OpenWrt 23.05.3调试环境调试目标…