數據預處理--缺失值判斷和處理(刪除發、插補法(均值插補、熱平台插補))


 數據預處理

1 數據集加載

這里使用mice軟件包下的nhanes2數據集進行演示,這是一個含有缺失值的小規模數據集。

library(lattice)

library(MASS)

library(nnet)

library(mice)

data("nhanes2")

dim(nhanes2)   #獲取數據集的維度 25*4

summary(nhanes2)

 

結果分析:agehyp是定性變量,分別為3類和2類,bmichl是定量變量;age沒有缺失值,bmi9個缺失值,hyp8個缺失值,chi10個缺失值。

對數據集nhanes2做一個初步了解:

age:年齡段,取值為123,分別代表20-3940-5960-99這三個年齡段

bmi:身體質量指數,單位為kg/m2

hyp:是否患高血壓,1代表否,2代表是

chl:血清膽固醇總量,單位為mg/dL

2 數據清理

對於探索性數據,我們通常使用統計圖來探索數據規律,經常用直方圖hist,點圖dotchart,箱線圖boxplotQ-Qqqnorm(可以加上線qqline())

2.1 缺失值處理

在數據預處理中,可以使用函數is.an()判斷缺失值:

sum(is.na(nhanes2))

 

還有一個常用的函數complete.cases,用來判斷某一觀測樣本是否完整:

sum(complete.cases(nhanes2))

函數的結果顯示:數據中共有27個缺失值,數據框中共有13條完整觀測值。

存在缺失值數據的情況下,需要進一步對數據缺失狀況進行觀測,判斷缺失數據是否隨機,可以利用mice包中的md.pattern函數判斷:

md.pattern(nhanes2)

 

 

 

潔后果分析:1表示沒有缺失數據,0表示存在缺失數據,第1行第1列的13表示有13個樣本是完整的,第1列最后一個7表示有7個樣本少了hyp,bmi,chl三個變量,最后一行表示各個變量缺失的樣本數合計。

對缺失數據最簡單處理的方法是直接刪除含有缺失值的樣本,這樣做到的前提是缺失數據的比例較少,且缺失數據是隨機出現的,這樣刪除之后對分析結果影響不大。

也可以用變量均值或者中位數來代替缺失值的方式,這樣做的缺點在於當缺失數據不是隨機出現時會產生偏誤。

多重插補法通過變量間的關系對數據進行預測,利用蒙特卡洛方法生成多個完整的數據集,再對這些數據集分別進行分析。

R中可以調用mice包中的mice函數實現,函數的基本形式是:

mice(data,m=5,...)

其中,data代表一個有缺失值的數據框或者矩陣,缺失值用NA表示;m表示多插補重數,即生成m個完整數據集,默認為5

舉個例子,若要構建以chl為因變量,age,hyp,bmi為自變量的線性回歸模型,因為數據集中存在缺失值,不能直接用來構建模型,因此可以通過如下方式構建模型:

imp<-mice(nhanes2,m=4)   #生成4組完整的數據庫並賦給imp

 

fit<-with(imp,lm(chl~age+hyp+bmi))   #生成線性回歸模型

pooled<-pool(fit)    #對建立的4個模型匯總

summary(pooled)    

 

 

 

以上是對缺失值的判斷,下面是缺失值的處理方法:

1.刪除法

在不影響數據結構的情況下,根據數據處理的不同角度,可以將刪除法分為以下4種:

1)刪除觀測樣本

2)刪除某變量

3)使用原始完整數據分析

4)改變權重:通過對完整數據按照不同的權重進行加權,可以降低刪除缺失數據帶來的偏差。

2. 插補法

均值插補、回歸插補、二階插補、熱平台、冷平台、抽樣填補等單一變量插補,多變量插補是單變量插補的推廣。

均值插補:是通過計算缺失值所在變量所有非缺失觀測值的據那只,使用均值來代替缺失值的插補方法(類似的也可以使用中位數、四分位數進行插補)。

sub<-which(is.na(nhanes2[,4])==T)   #返回數據集第4列為NA的行

dataTR<-nhanes2[-sub,]   #4列不為NA的數存入數據集dataTR

dataTE<-nhanes2[sub,]    #將第4列為NA的數存入數據集dataTE

dataTE[,4]<-mean(dataTR[,4])   #用非缺失值的均值代替缺失值

dataTE

 

結果分析:均值插補的結果是191.4

隨機插補和均值插補沒有利用到相關變量信息,因此會存在一定的誤差,而回歸模型將需要插補的變量作為因變量,其他相關變量作為自變量,用過建立回歸模型預測出因變量的值對缺失變量進行插補。

sub<-which(is.na(nhanes2[,4])==T)

dataTR<-nhanes2[-sub,]

dataTE<-nhanes2[sub,]

dataTE

 

lm<-lm(chl~age,data=dataTR)  #構建回歸模型

nhanes2[sub,4]=round(predict(lm,dataTE))   #利用dataTE中數據按照模型lm對數據集中chl中的缺失數據進行預測

head(nhanes2)  #顯示缺失值處理后的結果

 

熱平台插補:是指在非缺失數據集中找到一個於缺失值所在樣本相似的樣本,利用其中的觀測值對缺失值進行插補。

accept<-nhanes2[which(apply(is.na(nhanes2),1,sum)!=0),]  #存在缺失值的樣本

donate<-nhanes2[which(apply(is.na(nhanes2),1,sum)==0),]   #無缺失值的樣本

accept[1,]

 

donate[1,]

 

對於存在缺失值的accept中的每個樣本呢,熱平台插補就是在donate中找到於該樣本相似的樣本,用相似樣本的對應值代替該樣本的缺失值。當變量數量很多時,很難找到於需要插補相似的樣本,此時可以按照某些變量將數據分層,在層中對缺失值使用均值插補,即采用冷平台插補方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM