原文链接:http:///?p=24973简介世界卫生组织估计全世界每年有 1200 万人死于心脏病。在美国和其他发达国家,一半的死亡是由于心血管疾病。心血管疾病的早期预后可以帮助决定改变高危患者的生活方式,从而减少并发症。本研究旨在查明心脏病最相关/风险因素,并使用机器学习预测总体风险。 数据准备来源该数据集(查看文末了解数据获取方式)来自对居民正在进行的心血管研究。分类目标是预测患者未来是否有 10 年患冠心病 (CHD) 的风险。数据集提供了患者的信息。它包括超过 4,000 条记录和 15 个属性。 变量每个属性都是一个潜在的风险因素。有人口、行为和医疗风险因素。 人口统计: 心脏病预测# 获取数据rdaa <- read.csv(路径)# 这边可以考虑增加变量收缩压与舒张压之差、描述收缩压、舒张压与高血压等级的变量 # 看数据结构 str(ata)# 考虑增加变量bplevel raw_data <- sqldf # 对变量类别进行区分 ra_da <- map str(ra_da ) 数据预处理查看和处理缺失值 # 这里我们使用mice包进行缺失值处理aggrmatplot 点击标题查阅往期内容 左右滑动查看更多 由上图可以看出,除了glucose变量,其它变量的缺失比例都低于5%,而glucose变量缺失率超过了10%。对此的处理策略是保留glucose变量的缺失值,直接删除其它变量的缺失值。现在处理glucose的缺失值, # 处理glucose列lee_a <- subset & !is.na & !is.na & !is.na & !is.na & !is.na # 查看glce与其它变量的线性相关性确定mice的填充策略 gcog = glm(lcse ~ .) smry(glseg) 填充,排除不重要的变量。至于为什么不选diaBP,主要是后面的相关性分析中,这两个变量会造成多重共线性。 mice%in% m=5, "pmm", mai = 50, sd=2333, pint= FALSE)#查看填充结果 smr(mc_od)# 查看原始数据和插补后的数据分布情况 epot(mi_md)sipt(mcod, pch=12)# 填充数据 mi_t <- complete fir_aa$loe <- miout$guose sum(is.na(flda)) 删除重复行# 查看有无重复行并删除重复行sum(duplicatedcomd_ata <- comdta\[!duplicated(), \] 查看离群点#查看异常值gplot(coedta)+geom_boxplot(ae(ftr(1),age))ggplot(copd\_dta)+geom\_boxplot(aes(factor(1cigDy))ggplot(coea)+geom_boxplot(aes(factor(1),ttl))ggplot(colt\_ta)+geom\_boxplot(aes(factor(1),syBP))ggplot(comeaa)+geom_boxplot(aes(factor(1),daP))ggplot()+gem_boxplot(aes(factor(1),BMI))# 查看cigsPerDay cigs\_sub <- comled\_dta # 查看totChol,删除异常点 # 查看sysBP, 删除异常点 # 查看BMI totChol: 总胆固醇水平大于240mg/dl已属于非常高,故删去水平值为600mg/dl的记录。sysBP: 去掉收缩压为295mg/dl的记录 # 删除各变量离群点competedata# 分类型变量列联分析 ggplot+geom_boxplotggplot+geom_boxplot(aes,totChol,fill=TenYerCHD))cometddata %>% fitr %>% ggplot 由图像知,glucose和hearRate变量有不显着的风险 table1=tablechisq.testtable1table2=table chisq.testtable3=table chisq.testchisq.testggpairs diaBP和sysBP有多重共线性的问题。 currentSmoker变量可能不显着,下面进入模型部分。 模型# 划分数据集split = sample.split train = subset 逻辑回归# 逻辑回归模型 - 使用所有变量fultaog = glm summary(fulog)fldaog = glm summary(fuatLg)prdts = predict glm_le <- tableACCU 随机森林rfoel <- randomForest# 获得重要性 imprace# 选择重要的因素 rfmdel <- randomForest # 误差 plot# 获取重要性 ggplot + geom_bar geom_text 这里有患病风险的误差不降反升,需要探究其中原因 # 绘制分类图像pred<-predict pdou_1<-predict #输出概率 table <- table sum(diag/sum #预测准确率plot(margin SVM支持向量机# 先进行模型调优tud <- tune.svm summary(tud )# 使用turning函数得到最佳参数设置支持向量机 mel.nd <- svm cost=tuned$ summary(modted)# 调用predict函数基于刚配置好的SVM模型进行类标号的预测: sm.ne.ed <- predict sv.tuedtble <- table sm.ue.tbeacy.s.vm <- sum(diag)/sum 模型诊断根据上面三个模型的结果,可以看出预测结果的类别数量分布非常不均衡 sumsum(TeYaHD == 0)针对这一现象,需要采取方法平衡数据集。 数据获取 |
|