機(jī)器學(xué)習(xí)之Lasso回歸

生存模型:
? Cox單因素分析 (前面一篇文章講生存分析的時(shí)候講了)
? Lasso回歸 (本篇文章)
? Cox多因素分析
? 隨機(jī)森林
? 支持向量機(jī)

1、lasso回歸:從一堆的基因中找到幾個(gè)關(guān)鍵的用來(lái)建模或者預(yù)測(cè)

輸入數(shù)據(jù):表達(dá)矩陣(exprSet)和病人對(duì)應(yīng)的生死(meta$event)


image.png

病人的ID

判斷一下是否相等:這一步是至關(guān)重要的,如果樣本和病人ID順序不對(duì),后面都是錯(cuò)的


image.png
> identical(stringr::str_sub(colnames(exprSet),1,12),meta$ID)
[1] TRUE
image.png

image.png

這個(gè)包我沒(méi)有下載成功收捣。陨收。势告。岸啡。不知道原因是什么,然后我一直搜索赫编。巡蘸。。
我覺(jué)得如果不是網(wǎng)絡(luò)問(wèn)題擂送,肯定就是鏡像問(wèn)題悦荒,不知道清華鏡像最近咋了
然后我就換了厲害無(wú)比的阿里云鏡像:

劃重點(diǎn)!`诙帧!!??

options("repos" = c(CRAN="https://mirrors.aliyun.com/CRAN/"))

結(jié)果一頓操作猛如虎就成功了枉氮。本來(lái)都打算放棄了允粤。。问芬。


image.png

下面正式開(kāi)始:

這里是舉例子悦析,所以只計(jì)算了10個(gè)λ值,解釋一下輸出結(jié)果三列的意思此衅。
- Df 是自由度
- 列%Dev代表了由模型解釋的殘差的比例强戴,對(duì)于線性模型來(lái)說(shuō)就是模型擬合的 R^2(R-squred)亭螟。它在0和1之間,越接近1說(shuō)明模型的表現(xiàn)越好骑歹,如果是0预烙,說(shuō)明模型的預(yù)測(cè)結(jié)果還不如直接把因變量的均值作為預(yù)測(cè)值來(lái)的有效。
- Lambda 是構(gòu)建模型的重要參數(shù)道媚。
解釋的殘差百分比越高越好扁掸,但是構(gòu)建模型使用的基因的數(shù)量也不能太多,需要取一個(gè)折中值衰琐。

image.png
#### 2.1挑選合適的λ值
計(jì)算1000個(gè)也糊,畫(huà)圖,篩選表現(xiàn)最好的λ值
cv_fit <- cv.glmnet(x=x, y=y, nlambda = 1000,alpha = 1)
plot(cv_fit)
image.png

兩條虛線分別指示了兩個(gè)特殊的λ值,一個(gè)是lambda.min,一個(gè)是lambda.1se,這兩個(gè)值之間的lambda都認(rèn)為是合適的羡宙。lambda.1se構(gòu)建的模型最簡(jiǎn)單狸剃,即使用的基因數(shù)量少,而lambda.min則準(zhǔn)確率更高一點(diǎn)狗热,使用的基因數(shù)量更多一點(diǎn)钞馁。

#### 2.2 用這兩個(gè)λ值重新建模
model_lasso_min <- glmnet(x=x, y=y, alpha = 1, lambda=cv_fit$lambda.min)
model_lasso_1se <- glmnet(x=x, y=y, alpha = 1, lambda=cv_fit$lambda.1se)

這兩個(gè)值體現(xiàn)在參數(shù)lambda上。有了模型匿刮,可以將篩選的基因挑出來(lái)了僧凰。所有基因存放于模型的子集beta中,用到的基因有一個(gè)s0值熟丸,沒(méi)用的基因只記錄了“.”训措,所以可以用下面代碼挑出用到的基因。

head(model_lasso_min$beta)
choose_gene_min=rownames(model_lasso_min$beta)[as.numeric(model_lasso_min$beta)!=0]
choose_gene_1se=rownames(model_lasso_1se$beta)[as.numeric(model_lasso_1se$beta)!=0]
length(choose_gene_min)
length(choose_gene_1se)
image.png

image.png
### 3.模型預(yù)測(cè)和評(píng)估
#### 3.1自己預(yù)測(cè)自己:自我驗(yàn)證
newx參數(shù)是預(yù)測(cè)對(duì)象光羞。輸出結(jié)果lasso.prob是一個(gè)矩陣绩鸣,第一列是min的預(yù)測(cè)結(jié)果,第二列是1se的預(yù)測(cè)結(jié)果纱兑,預(yù)測(cè)結(jié)果是概率呀闻,或者說(shuō)百分比,不是絕對(duì)的0和1潜慎。
將每個(gè)樣本的生死和預(yù)測(cè)結(jié)果放在一起捡多,直接cbind即可。
lasso.prob <- predict(cv_fit,  #predict是預(yù)測(cè)铐炫,是一個(gè)泛型函數(shù)
                      newx=x ,  #這個(gè)是預(yù)測(cè)對(duì)象垒手,cv_fit是預(yù)測(cè)數(shù)據(jù)
                      s=c(cv_fit$lambda.min,cv_fit$lambda.1se) )
re=cbind(y ,lasso.prob)  #cbind是按列合并
head(re)
image.png
#### 3.2 箱線圖
對(duì)預(yù)測(cè)結(jié)果進(jìn)行可視化。以實(shí)際的生死作為分組倒信,畫(huà)箱線圖整體上查看預(yù)測(cè)結(jié)果淫奔。
re=as.data.frame(re)
colnames(re)=c('event','prob_min','prob_1se')
#上面一行的代碼意思是把列名一次改為'event','prob_min','prob_1se'
re$event=as.factor(re$event)  #作為因子來(lái)變成分類變量
library(ggpubr) 
p1 = ggboxplot(re, x = "event", y = "prob_min",
               color = "event", palette = "jco",
               add = "jitter")+ stat_compare_means()
p2 = ggboxplot(re, x = "event", y = "prob_1se",
          color = "event", palette = "jco",
          add = "jitter")+ stat_compare_means()
library(patchwork)
p1+p2
image.png

可以看到,真實(shí)結(jié)果是死(0)的樣本堤结,預(yù)測(cè)的值就小一點(diǎn)(靠近0)唆迁,真實(shí)結(jié)果是活著(1)的樣本鸭丛,預(yù)測(cè)的值就大一點(diǎn)(靠近1),整體上趨勢(shì)是對(duì)的唐责,但不是完全準(zhǔn)確鳞溉,模型是可用的.對(duì)比兩個(gè)λ值構(gòu)建的模型,差別不大鼠哥,1se的預(yù)測(cè)值準(zhǔn)確一點(diǎn)熟菲。

下面是ROC曲線:

#### 3.3 ROC曲線
計(jì)算AUC取值范圍在0.5-1之間,越接近于1越好朴恳〕保可以根據(jù)預(yù)測(cè)結(jié)果繪制ROC曲線。
library(ROCR)
library(caret)
# 自己預(yù)測(cè)自己
#min    下面整段復(fù)制運(yùn)行代碼就會(huì)出圖
pred_min <- prediction(re[,2], re[,1])
auc_min = performance(pred_min,"auc")@y.values[[1]]
perf_min <- performance(pred_min,"tpr","fpr")
plot(perf_min,colorize=FALSE, col="blue") 
lines(c(0,1),c(0,1),col = "gray", lty = 4 )
text(0.8,0.2, labels = paste0("AUC = ",round(auc_min,3)))
AUC幾乎接近0.9了已經(jīng)很不錯(cuò)了
#1se
pred_1se <- prediction(re[,3], re[,1])
auc_1se = performance(pred_1se,"auc")@y.values[[1]]
perf_1se <- performance(pred_1se,"tpr","fpr")
plot(perf_1se,colorize=FALSE, col="red") 
lines(c(0,1),c(0,1),col = "gray", lty = 4 )
text(0.8,0.2, labels = paste0("AUC = ",round(auc_1se,3)))
image.png
#強(qiáng)迫癥選項(xiàng)于颖,想把兩個(gè)模型畫(huà)一起呆贿。
plot(perf_min,colorize=FALSE, col="blue") 
plot(perf_1se,colorize=FALSE, col="red",add = T) 
lines(c(0,1),c(0,1),col = "gray", lty = 4 )
text(0.8,0.3, labels = paste0("AUC = ",round(auc_min,3)),col = "blue")
text(0.8,0.2, labels = paste0("AUC = ",round(auc_1se,3)),col = "red")
#round()這個(gè)函數(shù)是取幾位小數(shù),round(656563,3)就是取3位小數(shù)
image.png

AUC

library(ROCR)
library(caret)
# 訓(xùn)練集模型預(yù)測(cè)測(cè)試集
#min
pred_min <- prediction(re[,2], re[,1])
auc_min = performance(pred_min,"auc")@y.values[[1]]
perf_min <- performance(pred_min,"tpr","fpr")

#1se
pred_1se <- prediction(re[,3], re[,1])
auc_1se = performance(pred_1se,"auc")@y.values[[1]]
perf_1se <- performance(pred_1se,"tpr","fpr")

tpr_min = performance(pred_min,"tpr")@y.values[[1]]
tpr_1se = performance(pred_1se,"tpr")@y.values[[1]]
dat = data.frame(tpr_min = perf_min@y.values[[1]],
                 fpr_min = perf_min@x.values[[1]],
                 tpr_1se = perf_1se@y.values[[1]],
                 fpr_1se = perf_1se@x.values[[1]])

ggplot() + 
  geom_line(data = dat,aes(x = fpr_min, y = tpr_min),color = "blue") + 
  geom_line(data = dat,aes(x = fpr_1se, y = tpr_1se),color = "red")+
  geom_line(aes(x=c(0,1),y=c(0,1)),color = "grey")+
  theme_bw()+
  annotate("text",x = .75, y = .25,
           label = paste("AUC of min = ",round(auc_min,2)),color = "blue")+
  annotate("text",x = .75, y = .15,label = paste("AUC of 1se = ",round(auc_1se,2)),color = "red")+
  scale_x_continuous(name  = "fpr")+
  scale_y_continuous(name = "tpr")
image.png

最后補(bǔ)充一個(gè)小小知識(shí)點(diǎn)

#設(shè)置隨機(jī)數(shù)種子森渐,這樣的話每次抽出來(lái)的數(shù)就是一樣的了
set.seed(1234)
sample(1:50,7)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末做入,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子同衣,更是在濱河造成了極大的恐慌竟块,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耐齐,死亡現(xiàn)場(chǎng)離奇詭異浪秘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)埠况,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)秫逝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)询枚,“玉大人,你說(shuō)我怎么就攤上這事浙巫〗鹗瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵渊抄,是天一觀的道長(zhǎng)护桦。 經(jīng)常有香客問(wèn)我二庵,道長(zhǎng),這世上最難降的妖魔是什么杭隙? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任痰憎,我火速辦了婚禮铣耘,結(jié)果婚禮上蜗细,老公的妹妹穿的比我還像新娘据德。我一直安慰自己棘利,他們只是感情好水援,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布系冗。 她就那樣靜靜地躺著掌敬,像睡著了一般楷兽。 火紅的嫁衣襯著肌膚如雪芯杀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音尼荆,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛褒搔,可吹牛的內(nèi)容都是我干的星瘾。 我是一名探鬼主播磕瓷,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼肮柜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芒澜,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤南吮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后誊酌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體部凑,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年碧浊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涂邀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡箱锐,死狀恐怖比勉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驹止,我是刑警寧澤浩聋,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站臊恋,受9級(jí)特大地震影響衣洁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捞镰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一闸与、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岸售,春花似錦践樱、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至屎慢,卻和暖如春瞭稼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腻惠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工环肘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人集灌。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓悔雹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腌零,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359