數據預處理
1 數據集加載
這里使用mice軟件包下的nhanes2數據集進行演示,這是一個含有缺失值的小規模數據集。
library(lattice)
library(MASS)
library(nnet)
library(mice)
data("nhanes2")
dim(nhanes2) #獲取數據集的維度 25*4
summary(nhanes2)
結果分析:age和hyp是定性變量,分別為3類和2類,bmi和chl是定量變量;age沒有缺失值,bmi有9個缺失值,hyp有8個缺失值,chi有10個缺失值。
對數據集nhanes2做一個初步了解:
age:年齡段,取值為1、2、3,分別代表20-39、40-59、60-99這三個年齡段
bmi:身體質量指數,單位為kg/m2
hyp:是否患高血壓,1代表否,2代表是
chl:血清膽固醇總量,單位為mg/dL
2 數據清理
對於探索性數據,我們通常使用統計圖來探索數據規律,經常用直方圖hist,點圖dotchart,箱線圖boxplot和Q-Q圖qqnorm(可以加上線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中找到於該樣本相似的樣本,用相似樣本的對應值代替該樣本的缺失值。當變量數量很多時,很難找到於需要插補相似的樣本,此時可以按照某些變量將數據分層,在層中對缺失值使用均值插補,即采用冷平台插補方法。