R語言︱缺失值處理之多重插補——mice包
每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~
———————————————————————————
筆者寄語:缺失值是資料清洗過程中非常重要的問題(其他方法可見:R語言︱異常值檢驗、離群點分析、異常值處理),筆者在進行mice包的多重插補過程中遇到相當多的問題。
大致的步驟簡介如下:
缺失資料集——MCMC估計插補成幾個資料集——每個資料集進行插補建模(glm、lm模型)——將這些模型整合到一起(pool)——評價插補模型優劣(模型係數的t統計量)——輸出完整資料集(compute)
步驟詳細介紹:
函式mice()首先從一個包含缺失資料的資料框開始,然後返回一個包含多個(預設為5個)完整資料集的物件。
每個完整資料集都是通過對原始資料框中的缺失資料進行插補而生成的。 由於插補有隨機的成分,因此每個完整資料集都略有不同。
然後, with()函式可依次對每個完整資料集應用統計模型(如線性模型或廣義線性模型) ,
最後, pool()函式將這些單獨的分析結果整合為一組結果。最終模型的標準誤和p值都將準確地反映出由於缺失值和多重插補而產生的不確定性。
#多重插補法處理缺失,結果轉存 library(lattice) #調入函式包 library(MASS) library(nnet) library(mice) #前三個包是mice的基礎 imp=mice(inputfile,m=4) #4重插補,即生成4個無缺失資料集 fit=with(imp,lm(sales~date,data=inputfile))#選擇插補模型 pooled=pool(fit) summary(pooled) result4=complete(imp,action=3)#選擇第三個插補資料集作為結果
結果解讀:
(1)imp物件中,包含了:每個變數缺失值個數資訊、每個變數插補方式(PMM,預測均值法常見)、插補的變數有哪些、預測變數矩陣(在矩陣中,行代表插補變數,列代表為插補提供資訊的變數, 1和0分別表示使用和未使用);
同時 利用這個程式碼imp$imp$sales 可以找到,每個插補資料集缺失值位置的資料補齊具體數值是啥。
> imp$imp$sales
1 2 3 4
9 3614.7 3393.1 4060.3 3393.1
15 2332.1 3614.7 3295.5 3614.7
(2)with物件。插補模型可以多樣化,比如lm,glm都是可以直接應用進去,詳情可見《R語言實戰》第十五章;
(3)pool物件。summary之後,會出現lm模型係數,可以如果出現係數不顯著,那麼則需要考慮換插補模型;
(4)complete物件。m個完整插補資料集,同時可以利用此函式輸出。
————————————————————————————————————————————————————
1、缺失值模式——視覺化(md.pattern())
mice
包提供了一個很好的函式md.pattern()
,用它可以對缺失資料的模式有個更好的理解。還有一些視覺化的介面,通過VIM、箱型圖、lattice來展示缺失值情況。可見部落格:
————————————————————————————————————————————————————
2、mice函式詳解
mice函式主要引數有mice(資料集,m=5,meth=”PMM“)
m為預設插補資料集數量,5為預設值;meth為預設插補方式,PMM為預設方式預測均值匹配。
還有一些其他methods插補方法,比如貝葉斯線性迴歸(norm)、基於bootstrap的線性迴歸(norm.boot)、線性迴歸預測值(norm.predict)、分類迴歸樹(cart)、隨機森林(rf)等等。(詳情可help(mice)獲取資訊)
使用這些插補方法對資料有嚴格的要求,比如貝葉斯線性迴歸等前三個模型都需要資料符合numeric格式,而PMM、cart、rf任意格式都行。
使用以上模型遇見的問題有:
1、PMM相當於某一指標的平均值作為插補,會出現插補值重複的問題;
2、cart以及rf是挑選某指標中最大分類的那個數字,是指標中的某一個數字,未按照規律;
3、要使用norm.predict,必須先對資料進行格式轉換,這個過程中會出現一些錯誤,比如以下錯誤警告:
Error in solve.default(xtx + diag(pen)) :
Imputation method norm.boot is not for factors with three or more levels.
————————————————————————————————————————————————————
3、with-pool函式的作用
在使用Mice包的過程中會出現以下的疑惑:
已經有mice函式補齊了缺失值,可以直接用compete直接調出,為啥還要用with,pool?
mice函式中預設插補5個數據集,那麼哪個資料集最好,值得選出?
筆者認為with-pool的作用是用來選擇資料集的。
with函式中有5個插補資料集的迴歸模型~資料集T檢驗~某資料集是否合格;
pool函式把5個迴歸模型彙總~資料集F檢驗~整個方法是否合格。
當然,一個未解決的問題是,小資料集可以每個資料集進行觀察,如果要插補很多,該怎麼辦呢?
其中,批量匯入、寫出資料的方法可見:
每每以為攀得眾山小,可、每每又切實來到起點,大牛們,緩緩腳步來俺筆記葩分享一下吧,please~
———————————————————————————