医学预测变量筛选的几种方法(R语言版)

医学预测变量筛选的几种方法(R语言版)

预测变量筛选是机器学习中的一个重要环节,它可以帮助我们识别出与目标变量最相关的特征,从而提高模型的预测精度和解释性。在医学领域,预测变量筛选可以用于疾病诊断、预后评估、个性化治疗等方面。
目前, 多种预测变量筛选方法,每种方法都有其特点。本文将介绍几种常用的R语言方法,包括:

  • 线性模型相关的:
    • 逐步法
    • Lasso回归法
  • 树形模型相关的:
    • Boruta法
    • SHAP法
  • 通用型:
    • RFE

1. 线性模型相关方法

1.1 逻辑回归的逐步法

逐步法是一种经典的变量筛选方法,它通过不断迭代的方式,逐步加入或剔除变量,最终找到一个最优的变量子集。逐步法有两种常见的形式:

  • 前向逐步回归:从一个包含所有变量的模型开始,每次迭代加入一个与目标变量最相关的变量,直到达到停止条件。
  • 后向逐步回归:从一个包含所有变量的模型开始,每次迭代剔除一个与目标变量最不相关的变量,直到达到停止条件。

逐步法的优点是简单易懂,计算效率高。缺点是容易陷入局部最优,并且不能很好地处理多重共线性问题。这里是用的是R语言的klaR包,主要进行逻辑回归的逐步法,其中又包括两种算法,stepclass和greedy.wilks。

library(klaR)
library(MASS)
#criterion:A list with elements:CR:Correctness Rate;AC:Accuracy;AS:Ability to Seperate;CF:Confidence;CFvec:Confidence for each (true) class
sc_obj <- stepclass(class ~ ., data = data, method = "qda",criterion = "AS") 
sc_obj

1.2 Lasso回归法

Lasso回归法是一种基于L1正则化的回归方法,它可以同时进行变量筛选和系数估计。Lasso回归的惩罚项会使部分系数变为0,从而实现变量筛选。

Lasso回归的优点是能够有效地处理多重共线性问题,并且具有较好的泛化能力。缺点是可能无法选择出所有重要的变量。

这里主要用到的包是glmnet。

library(glmnet)
#glmnet要求的数据格式,释放出分类变量的各个类别
y=data_one_hot%>%dplyr::select(contains('class'))%>%as.matrix()
x=data_one_hot%>%dplyr::select(!contains('class'))%>%as.matrix()
#cv获取lambda的取值范围
lasso_cv=cv.glmnet(x,y,family='binomial',type.measure='deviance')
plot(lasso_cv)
# tidy(lasso_cv)
lasso=glmnet(x,y,family='binomial',lambda=c(lasso_cv$lambda.min,lasso_cv$lambda.1se))
plot(lasso,xvar='lambda',label=TRUE)
coef(lasso)

2. 树形模型相关方法

2.1 Boruta法

Boruta法是一种基于随机森林的变量筛选方法。它通过构建多个随机森林模型,并比较每个变量在不同模型中的重要性,来判断该变量是否重要。

Boruta法的优点是能够有效地处理非线性关系,并且可以用于处理高维数据。缺点是计算效率较低。

R语言中的Boruta包可以实现。

library(Boruta)
set.seed(1)
boruta_obj<-Boruta(class ~.,data=data,doTrace=0,ntree=500,pValue=0.001)
print(TentativeRoughFix(boruta_obj))#分两类
print(boruta_obj)#三类,包含怀疑的数据

2.2 SHAP法

SHAP法是一种基于SHAP值(SHapley Additive Explanations)的变量解释方法。SHAP值可以解释每个变量对模型预测结果的贡献。

SHAP法可以用于变量筛选,通过比较不同变量的SHAP值大小,来判断该变量的重要性。SHAP法的优点是能够解释模型的预测结果,并且具有较好的可解释性。缺点是计算效率较低。

R语言的shapviz包可以实现SHAP值的计算和可视化。

shp <- shapviz(extract_fit_engine(lightgbm_final_fit), X_pred = data.matrix(data[,-9]),X=data)  
# svg('shap_plot_N_M.svg')
sv_importance(shp,kind="both",show_numbers = TRUE,number_size = 5)+theme(axis.text=element_text(size=14),axis.title.x = element_text(size=14))
# dev.off()

3. RFE
通过改变rfeControl函数中的functions参数,可以选定各种模型

library(caret)
# 设置rfe的选项
set.seed(1)
rfeControl = rfeControl(functions = gamFuncs,method = "cv", # 默认自助法重采样 bootsaveDetails = F, # 保存预测值和变量重要性number = 5, # 重抽样次数allowParallel = F # 允许多线程,用这个之前你要先准备好多线程!)
set.seed(1)
gamProfile <- rfe(class~., data,sizes = c(1:8),rfeControl = rfeControl)
gamProfile

以上介绍了五种常用的预测变量筛选方法,每种方法都有其优缺点。在实际应用中,可以根据具体情况选择合适的方法。文中代码为部分代码,完整的代码参见,可一键运行。和鲸社区代码示例

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两数之和(python)

官方题目描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现…

JSONP 实现跨域请求案例

后端使用 express 搭建&#xff0c;案例代码如下&#xff1a; const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…

婴儿浴盆CE认证EN17072检测报告

婴幼儿浴盆浴缸儿童护理用品CE认证EN17072测试报告 什么是婴儿浴盆&#xff1f; 婴儿浴盆是专为年幼的宝宝洗澡而设计的用品。您可以用婴儿浴盆将宝宝洗得干干净净&#xff0c;又不必过多担心安全问题。有些浴盆贴心的细节设计还能增加洗澡的乐趣。 大多数的婴儿浴盆尺寸适用…

布隆过滤器原理介绍和典型应用案例

整理自己过去使用布隆过滤器的应用案例和理解 基本介绍 1970年由布隆提出的一种空间效率很高的概率型数据结构&#xff0c;它可以用于检索一个元素是否在一个集合中&#xff0c;由只存0或1的位数组和多个hash算法, 进行判断数据 【一定不存在或者可能存在的算法】 如果这些…

【机器学习300问】43、回归模型预测效果明明很好,为什么均方根误差很大?

一、案例描述 假设我们正在构建一个房地产价格预测模型&#xff0c;目标是预测某个城市各类住宅的售价。模型基于大量房屋的各种特征&#xff08;如面积、地段、房龄、楼层等&#xff09;进行训练。 回归模型在大部分情况下对于住宅价格预测非常精准&#xff0c;用户反…

java Flink(四十三)Flink Interval Join源码解析以及简单实例

背景 之前我们在一片文章里简单介绍过Flink的多流合并算子 java Flink&#xff08;三十六&#xff09;Flink多流合并算子UNION、CONNECT、CoGroup、Join 今天我们通过Flink 1.14的源码对Flink的Interval Join进行深入的理解。 Interval Join不是两个窗口做关联&#xff0c;…

阿里云通过脚本直接修改SSH配置来允许root登录并启用密码认证

看起来你想要通过脚本直接修改SSH配置来允许root登录并启用密码认证。然而&#xff0c;PermitRootLogin和PasswordAuthentication这两个指令是/etc/ssh/sshd_config文件中的配置选项&#xff0c;不能直接通过set命令在bash脚本中设置。set命令在shell脚本中用于设置或取消设置s…

2.Redis有五种主要的数据类型

Redis有五种主要的数据类型 String&#xff08;字符串&#xff09;&#xff1a;String类型是最简单的数据类型&#xff0c;可以存储任意类型的数据&#xff0c;例如整数、浮点数、字符串等。String类型支持一些基本的操作&#xff0c;如设置值、获取值、增减值等。 Hash&#…

论文笔记:Llama 2: Open Foundation and Fine-Tuned Chat Models

导语 Llama 2 是之前广受欢迎的开源大型语言模型 LLaMA 的新版本&#xff0c;该模型已公开发布&#xff0c;可用于研究和商业用途。本文记录了阅读该论文的一些关键笔记。 链接&#xff1a;https://arxiv.org/abs/2307.09288 1 引言 大型语言模型&#xff08;LLMs&#xff…

cesium Clock JulianDate 日照分析

cesium在初始化的时候会自动把Clock对象挂载到容器上Clock内部以JulianDate维护时间&#xff0c;比北京时间慢8个小时&#xff0c;想显示北京时间需要计算时差JulianDate的日期部分和秒数部分是分开的 julianDayNumber&#xff1a;指整数天&#xff0c;记录从公元前4713年正午以…

GO 语言基础学习记录

一&#xff1a;声明变量 在golang语言中声明变量的方式 package main import "fmt" func main() { var a int 3 //关键字 var 变量名 变量指定类型 变量值 var b int //关键字 var 变量名 变量指定类型(注意:当变量没赋值时是按照变量…

【蓝桥杯】第15届蓝桥杯青少组stema选拔赛C++中高级真题答案(20240310)

一、选择题 第 1 题 第 2 题 表达式1000/3的结果是( A )。 A.333 B.333.3 C.334 D.333.0 第 3 题 下列选项中&#xff0c;判断a等于1并且b等于1正确的表达式是( B )。 A.!((a!1)&&(b!1)) B.!((a!1)||(b!1)) C.!(a1)&&(b1) D.(a1)&&(b1) 【解析】 A…

面试(一)

一. 说一下进程和线程的区别&#xff1f; (1)进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位。 (2)线程是进程的一部分&#xff0c;一个线程只能属于一个进程&#xff0c;一个进程可以有多个线程&#xff0c;但至少有一个线程。 (3)进程有自己独立地址空间&a…

我的春招求职面经

智能指针在面试时经常被问到&#xff0c;最近自己也在写&#xff0c;有一点思考&#xff0c;于是找到了这样一个题目&#xff0c;可以看看&#xff0c;上面这个代码有什么问题&#xff1f;留言区说出你的答案吧&#xff01; 最后分享一下之前的实习->春招->秋招等文章汇总…

可以完成80%的数据分析工作的20个Pandas函数

Pandas 是数据科学社区中使用最广泛的库之一&#xff0c;它是一个强大的工具&#xff0c;可以进行数据操作、清理和分析。本文将提供最常用的 Pandas 函数以及如何实际使用它们的样例。我们将涵盖从基本数据操作到高级数据分析技术的所有内容&#xff0c;到本文结束时&#xff…

huggingface的transformers训练bert

目录 理论 实践 理论 https://arxiv.org/abs/1810.04805 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;由Google在2018年提出。它是基于Transformer模型的预训练方法…

使el-table通过操控鼠标滚轮横向滚动

1.创建directive文件夹&#xff0c;里面创建directive.js文件 import Vue from vue;Vue.directive(scroll-x,{inserted:function(el){let domClass el.getAttribute(class)if(domClass.indexOf(el-table)<0){return false}const scrollDiv el;if(scrollDivnull){return fa…

OpenCV基于边缘的分割详解

OpenCV 中基于边缘的分割是一种常见的图像分割技术&#xff0c;它利用图像中的边缘信息来进行分割。边缘通常是图像中灰度值变化较大的区域&#xff0c;因此可以作为物体之间的分界线。以下是基于边缘的分割在 OpenCV 中的详细介绍&#xff1a; Canny 边缘检测&#xff08;Cann…

YOLOv9有效改进|CVPR2023即插即用的到残差注意力机制(轻量化注意力机制)Inverted Residual Mobile Block

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 在YOLOv9中加入CVPR2023即插即用的到残差注意力机制。 二、模块详解 2.1 模块简介 Inverted Residual Mobile Block结合了倒置残差块…

JavaEE企业开发新技术3

目录 2.11 Method的基本操作-1 文字性概念描述 代码&#xff1a; 2.12 Method的基本操作-2 2.13 Method的基本操作-3 2.14 数组的反射操作-1 文字性概念&#xff1a; 代码&#xff1a; 2.15 数组的反射操作-2 学习内容 2.11 Method的基本操作-1 文字性概念描述 Me…