簡介
世界衛生組織估計全世界每年有 1200 萬人死于心髒病。在美國和其他發達國家,一半的死亡是由于心血管疾病。心血管疾病的早期預後可以幫助決定改變高危患者的生活方式,進而減少并發症。本研究旨在查明心髒病最相關/風險因素,并使用機器學習預測總體風險。
資料準備
來源
該資料集來自對居民正在進行的心血管研究。分類目标是預測患者未來是否有 10 年患冠心病 (CHD) 的風險。資料集提供了患者的資訊。它包括超過 4,000 條記錄和 15 個屬性。
變量
每個屬性都是一個潛在的風險因素。有人口、行為和醫療風險因素。
人口統計:
• 性别:男性或女性(标量)
• 年齡:患者年齡;(連續 - 盡管記錄的年齡已被截斷為整數,但年齡的概念是連續的)
行為
• 目前吸煙者:患者是否是目前吸煙者(标量)
• 每天吸煙數:此人一天内平均吸煙的香煙數量。(可以認為是連續的,因為一個人可以擁有任意數量的香煙,甚至半支香煙。)
• BP Meds:患者是否服用降壓藥(标量)
•中風:患者之前是否有中風(标量)
• Hyp:患者是否患有高血壓(标量)
• 糖尿病:患者是否患有糖尿病(标量)
• Tot Chol:總膽固醇水準(連續)
• Sys BP:收縮壓(連續)
• Dia BP:舒張壓(連續)
• BMI:體重指數(連續)
• 心率:心率(連續 - 在醫學研究中,心率等變量雖然實際上是離散的,但由于存在大量可能值而被認為是連續的。)
• 葡萄糖:葡萄糖水準(連續)
預測變量(預期目标)
• 10 年患冠心病 CHD 的風險(二進制:“1”表示“是”,“0”表示“否”)
心髒病預測
- # 擷取資料
- rdaa <- read.csv(路徑)
- # 這邊可以考慮增加變量收縮壓與舒張壓之差、描述收縮壓、舒張壓與高血壓等級的變量
- # 看資料結構
- str(ata)
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yM1ATNyYGOygjNiRTNzImNzYzX5EjNwMTM5AzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- # 考慮增加變量bplevel
- raw_data <- sqldf
- # 對變量類别進行區分
- ra_da <- map
- str(ra_da )
資料預處理
檢視和處理缺失值
- # 這裡我們使用mice包進行缺失值處理
- aggr
matplot
由上圖可以看出,除了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(duplicated
comd_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_boxplot
ggplot+geom_boxplot(aes,totChol,fill=TenYerCHD))
- cometddata %>% fitr %>%
- ggplot
由圖像知,glucose和hearRate變量有不顯着的風險
- table1=table
- chisq.test
table1
- table2=table
- chisq.test
- table3=table
- chisq.test
chisq.test
ggpairs
diaBP和sysBP有多重共線性的問題。
currentSmoker變量可能不顯着,下面進入模型部分。
模型
- # 劃分資料集
- split = sample.split
- train = subset
邏輯回歸
- # 邏輯回歸模型 - 使用所有變量
- fultaog = glm
- summary(fulog)
- fldaog = glm
- summary(fuatLg)
- prdts = predict
- glm_le <- table
ACCU
随機森林
- 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.tbe
acy.s.vm <- sum(diag)/sum
模型診斷
根據上面三個模型的結果,可以看出預測結果的類别數量分布非常不均衡
sum
sum(TeYaHD == 0)