R語言數據分析與挖掘(第一章):數據預處理(2)——缺失值常用的處理方法

  • 2019 年 10 月 7 日
  • 筆記

上一篇文章(缺失值處理)介紹了缺失值處理的判斷方法,這一講接著介紹缺失值常用的幾種處理方法:刪除法,替換法和插補法。不同的方法對應不同類型的缺失值。

1.刪除法

如果缺失值的比例很小,且不影響整體的數據結構,即缺失值類型是完全隨機缺失時,可以考慮將缺失值刪除,該方法操作非常簡單,使用函數na.omit()就可以將含有缺失值的行刪除。其函數的基本書寫格式為:

na .omit (object,....)

其中object即為需要處理的數據對象。下面我們對algae數據集進行處理:

> algae=na.omit(algae)  > sum(is.na(algae))  [1] 0

上一篇文章中,我們介紹到該數據集有33個缺失值,刪除後,現在為0了。

除了na.omit()函數外,還可以利用complete.cases函數來刪除含有缺失值的行。

> # 因為上一句程式碼已經刪除過,這裡重新載入原始數據  > data(algae)  > algae<-algae[complete.cases(algae),]  > sum(!complete.cases(algae))  [1] 0

2.替換法

直接刪除含有缺失值的行記錄的代價和風險較大,故我們可以考慮將缺失值部分替換掉,如用均值去替換,即均值替換法,該方法根據變數的不同類型選擇不同的替換,對數值型變數採用均值替換,對非數值型變數採用眾數替換。

下面我們將對algae數據集採用均值替換處理缺失值:

> data(algae)  > mean(complete.cases(algae))  [1] 0.92  > algae[is.na(algae)]<-mean(complete.cases(algae))  > sum(!complete.cases(algae))  [1] 0

但是均值替換法還是存在一些問題,因為該方法適用於處理完全隨機缺失數據,且會改變整體數據的統計性質,比如方差變小,存在偏差等,因此在在實踐中並不常用。

3.插補法

實戰中常用的方法是插補法,隨機插補的思想類似,利用非缺失數據的均值或者隨機數來填補缺失值,下面我們詳細介紹多重插補。

多重插補的主要思想是:利用蒙特卡洛模擬法(MCMC)將原始數據集插補成幾個完整數據集,在每個新數據集中利用線性回歸(lm)或廣義線性回歸(glm)等方法進行插補建模,再將這些完整的模型整合到一起,評價插補模型的優劣並返回完數據集。

該方法主要利用mice包中的函數mice進行,其函數的基本書寫格式為,

mice(data,m=5,method=vector("character",length =ncol (data)),seed = NA,    defaultMethod = c("pmm","logreg","polyreg","polr"),....)

參數介紹:

data一個包含完整數據和缺失數據的矩陣或數據框,其中各缺失數據用符號NA表示;

m:指定的多正插補數,默認值為5;

method:一個字元串,或者長度與數據集列數相同的字元串向量,用於指定數據集中的每一列採用的插補方法,單一字元串指定所有列用相同方法插補,字元串向量指定不同列採用不同方法插補,默認插補法取決需要插補的目標列,並由defaulmethod指定參數;

seed:一個整數,用於函數set.seed()的參數,指定產生固定的隨機數的個數,默認值為NA;

defaultMethod:一個向量,用於指定每個數據集採用的插補建模方法,可供選者的方法有多種,「pmm」表示用預測的均值匹配,「logreg」表示用邏批回歸擬合,「polyreg」表示多項式擬合,「polr」表示採用比例優勢模型擬合等。

需要注意的是:選擇不同的插補建模方法對數據有不同的要求,回歸法適用於數值型數據集,「pmm」對數據格式沒有特殊要求。在實戰過程中我們還會用到函數pool()、函數compute()等。下面我們將用到一些回歸知識, 有疑感的話先放著,後面分析數據時我們會深入了解。

> imp<-mice(algae[,4:11],seed=1234)   iter imp variable    1   1    1   2    1   3    1   4    1   5    2   1    2   2    2   3    2   4    2   5    3   1    3   2    3   3    3   4    3   5    4   1    4   2    4   3    4   4    4   5    5   1    5   2    5   3    5   4    5   5  > fit <- with(imp,lm(mxPH~.,data = algae[,4:11]))  > pool=pool(fit)  > options(digits=3) # 設定輸出結果保留3位小數。  > summary(pool)               estimate std.error statistic  df  p.value  (Intercept)  7.90e+00  2.49e-01    31.735 190 0.00e+00  mnO2        -1.43e-02  2.39e-02    -0.598 190 5.51e-01  Cl           2.20e-03  1.32e-03     1.669 190 9.68e-02  NO3         -2.15e-02  2.18e-02    -0.986 190 3.25e-01  NH4         -1.75e-05  4.08e-05    -0.429 190 6.69e-01  oPO4         1.36e-03  1.50e-03     0.908 190 3.65e-01  PO4         -5.96e-04  1.14e-03    -0.522 190 6.02e-01  Chla         1.31e-02  2.82e-03     4.654 190 6.10e-06

上述程式碼表示:

  首先創建一個imp對象,該對象是包含4個插補對象的列表,使用的數據為algae數據集中含有缺失值的第4到11列數據,默認插補查補數據集為5個;然後創建fit對象,用於設定統計分析方法,這裡指定線性回歸,則fit是一個包含4個統計分析結果的列表對象;再創建pool 對象,該對象將前面的四個統計分析結果匯總;最後用summary函數顯示pool的統計資訊,指定輸出結果保留3位小數。

插補完後,對插補數據和原始數據進行對比,利用mice包中的函數stripplot()對變數分布圖進行可視化。

algae_complete=complete(imp,action=1)  sum(is.na(algae_complete))  par(mfrow=c(3,3))  stripplot(imp,pch=c(1,8),col=c("grey","1"))  par(mfrow=c(1,1)

缺失值處理是一個不容易的工程,我們在數據挖掘中可選擇對缺失數據不敏感的方法,比如決策樹,這樣就省略了缺失值處理的步驟。如果對於數據敏感的方法,還是要處理的哦!!