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

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

预测变量筛选是机器学习中的一个重要环节,它可以帮助我们识别出与目标变量最相关的特征,从而提高模型的预测精度和解释性。在医学领域,预测变量筛选可以用于疾病诊断、预后评估、个性化治疗等方面。

目前, 多种预测变量筛选方法,每种方法都有其特点。本文将介绍几种常用的R语言方法,包括:

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

1. 线性模型相关方法

1.1 逻辑回归的逐步法

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

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

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

r 复制代码
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。

r 复制代码
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包可以实现。

r 复制代码
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值的计算和可视化。

r 复制代码
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()

总结

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

相关推荐
究极无敌暴龙战神X4 分钟前
前端学习之ES6+
开发语言·javascript·ecmascript
虞书欣的69 分钟前
Python小游戏24——小恐龙躲避游戏
开发语言·python·游戏·小程序·pygame
FHYAAAX17 分钟前
【机器学习】任务十:从函数分析到机器学习应用与BP神经网络
开发语言·python
汉克老师35 分钟前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节
爱吃生蚝的于勒1 小时前
C语言最简单的扫雷实现(解析加原码)
c语言·开发语言·学习·计算机网络·算法·游戏程序·关卡设计
Ai 编码助手1 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm1 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
hummhumm1 小时前
第 8 章 - Go语言 数组与切片
java·开发语言·javascript·python·sql·golang·database
何曾参静谧1 小时前
「QT」文件类 之 QDir 目录类
开发语言·qt
何曾参静谧1 小时前
「QT」文件类 之 QTemporaryDir 临时目录类
开发语言·qt