天天看點

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

在讨論分類時,我們經常分析二維資料(一個自變量,一個因變量)。

但在實際生活中,有更多的觀察值,更多的解釋變量。随着兩個以上的解釋變量,它開始變得更加複雜的可視化。

資料

我們使用心髒病資料(檢視文末了解資料擷取方式),預測急診病人的心肌梗死,包含變量:

  1. 心髒指數
  2. 心搏量指數
  3. 舒張壓
  4. 肺動脈壓
  5. 心室壓力
  6. 肺阻力
  7. 是否存活
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

其中我們有急診室的觀察結果,對于心肌梗塞,我們想了解誰存活下來了,以得到一個預測模型。但是在運作一些分類器之前,我們先把我們的資料可視化。

主成分PCA

由于我們有7個解釋變量和我們的因變量(生存或死亡),我們可以去做一個PCA。

acp=PCA(X)      
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

添加死亡生存變量,就把它當作數字0,1變量。

左右滑動檢視更多

01

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

02

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

03

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

04

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料
是否存活= 是否存活=="存活")*1      
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

結果不錯,我們看到因變量與部分自變量是同向的。也可以可視化樣本和類别

plot(cp  )      
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

我們可以在這裡推導出一個不錯的分類器。至少,在前兩個成分上投影時,我們可以看到我們的類别。

現在,我們不能在前兩個主成分上得到一個分類器并将其可視化嗎?   因為PCA是簡單的基于正交投影的,是以我們可以(這裡的資料是标準化的)。給定前兩個分量平面上的兩個坐标,給定我們的變換矩陣、歸一化分量和一個分類器(這裡是基于邏輯回歸),我們可以回到原始空間,并對新資料進行分類。

  1.  PCA(X,ncp=ncol(X))
  2.  function(d1,d2,Mat,reg){
  3.    z=Mat %*% c(d1,d2,rep(0,ncol(X)-2))
  4.    newd=data.frame(t(z*s+m))
  5.  pred(reg, newd  }

現在考慮一個邏輯回歸。隻是為了簡化(去掉非顯著變量),我們使用一個逐漸回歸的程式來簡化模型。

  1.  reg_tot=step(glm(是否存活~. ,
  2.  family=binomial))
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

可視化等機率線(如個人有50%的生存機會)使用以下

  1.  xgrid=seq(-5,5,length=25 )
  2.  ygrid=seq(-5,5,length=25 )
  3.  zgrid=ter(xgrid,ygrid,p)

然後,我們在之前的圖形上添加一條等高線

  1.  PCA(data,quali.sup=8 )
  2.  contour( zgrid )
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

結果不差,但我們應該可以做得更好。如果我們把所有的變量都保留在這裡(即使它們不重要),會怎麼樣呢?

  1.   glm(是否存活~., 
  2.              family=binomial)
  3.  contour(xgrid,ygrid,zgrid )
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

在現實生活中,要想真正說出我們的分類器的一些相關資訊,我們應該在觀測值的一個子集上拟合我們的模型,然後在另一個子集上測試它。在這裡,我們的目标更多的是在某個投影空間上得到一個函數來可視化我們的分類。

決策樹

預設分類樹

> plot( re,type=4,extra=6)      
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

我們可以在此更改選項,例如每個節點的最小觀察數

  1.  rpart(factor(是否存活)~ ,
  2.  +       control=rpart.control(minsplit=10))
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

或者

  1.   rpart( 
  2.  +        control=rpart.control(minsplit=5))
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

要将該分類可視化,獲得前兩個成分的投影

  1.  > p=function(d1,d2) pred2(d1,d2 )
  2.  > zgrid=Outer(xgrid,ygrid,p)
  3.   PCA(  quali.sup=8,graph=TRUE)
  4.  > image(xgrid,ygrid,zgrid )
  5.  > contour(xgrid,ygrid,zgrid,add=TRUE,levels=.5)
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

也可以考慮這種情況

rpart( control=rpart.control(minsplit=5))      
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

最後,我們還可以生成更多的樹,通過采樣獲得。這就是bagging的概念:我們boostrap 觀測值,生長一些樹,然後,我們将預測值進行彙總。在網格上

  1.   > for(i in 1:1200){
  2.  + indice = sample(1:nrow(MYOCARDE),
  3.   + arbre_b = rpart(factor(是否存活)~.,
  4.  +}
  5.  >Zgrid = Z/1200

可視化

資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

最後,可以使用随機森林算法。

  1.  > fore= randomForest(factor(是否存活)~.,
  2.  > pF=function(d1,d2) pred2(d1,d2,Minv,fore)
  3.  > zgridF=Outer(xgrid,ygrid,pF)
  4.  PCA(data,.sup=8,graph=TRUE)
  5.  > image(xgrid,ygrid,Zgrid,add=TRUE,
  6.  > contour(xgrid,ygrid,zgridF,
資料分享|R語言用主成分PCA、 邏輯回歸、決策樹、随機森林分析心髒病資料并高維可視化|附代碼資料

資料擷取

在下面公衆号背景回複“心髒病資料”,可擷取完整資料。