我们使用mice包中的nhanes2数据集进行研究,该数据集是一个含有缺失值的小规模数据集。
(1)加载mice包
r
r library(lattice) library(mice)
鎼笺复鎼笺父鎸笺父鏀笺耿鎴笺赋碳鎰笺工鎴笺赴鏄笺梗鎰笺赋鎴笺埂鎰笺副鎰笺攻mice鎰笺副鎰笺功
The following object is masked _by_ 鎰笺副鎰笺攻.GlobalEnv鎰笺副鎰笺功:
nhanes2
(2)加载mice包里的nhanes2数据集
r
r attach(nhanes2)
(3)展示nhanes2数据集
r
r nhanes2
(4)显示数据集行、列数(相当于dim)
r
r nrow(nhanes2);ncol(nhanes2)
[1] 25
[1] 4
(5)获取数据集的概括信息:
NA代表缺失值;age年龄;bmi身体质量指数;hyp是否高血压;chl血清胆固醇总量。
r
r summary(nhanes2)
age bmi hyp chl
20-39:12 Min. :20.40 no :13 Min. :113.0
40-59: 7 1st Qu.:22.65 yes : 4 1st Qu.:185.0
60-99: 6 Median :26.75 NA's: 8 Median :187.0
Mean :26.56 Mean :191.4
3rd Qu.:28.93 3rd Qu.:212.0
Max. :35.30 Max. :284.0
NA's :9 NA's :10
(6)显示数据集前几行情况
r
r head(nhanes2)
在数据预处理的过程中,首先我们要判断数据是否有缺失值。
(1)计算数据集nhanes中的缺失值的数量
r
r is.na(nhanes2)
age bmi hyp chl
1 FALSE TRUE TRUE TRUE
2 FALSE FALSE FALSE FALSE
3 FALSE TRUE FALSE FALSE
4 FALSE TRUE TRUE TRUE
5 FALSE FALSE FALSE FALSE
6 FALSE TRUE TRUE FALSE
7 FALSE FALSE FALSE FALSE
8 FALSE FALSE FALSE FALSE
9 FALSE FALSE FALSE FALSE
10 FALSE TRUE TRUE TRUE
11 FALSE TRUE TRUE TRUE
12 FALSE TRUE TRUE TRUE
13 FALSE FALSE FALSE FALSE
14 FALSE FALSE FALSE FALSE
15 FALSE FALSE FALSE TRUE
16 FALSE TRUE TRUE TRUE
17 FALSE FALSE FALSE FALSE
18 FALSE FALSE FALSE FALSE
19 FALSE FALSE FALSE FALSE
20 FALSE FALSE FALSE TRUE
21 FALSE TRUE TRUE TRUE
22 FALSE FALSE FALSE FALSE
23 FALSE FALSE FALSE FALSE
24 FALSE FALSE FALSE TRUE
25 FALSE FALSE FALSE FALSE
r
r sum(is.na(nhanes2))
[1] 27
函数is.na()用来判断缺失值
(2)计算数据集nhanes中完整样本的数量
r
r complete.cases(nhanes2)
[1] FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE
[15] FALSE FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE
r
r sum(complete.cases(nhanes2))
[1] 13
函数complete.cases用来判断完整数据
数据共有27个缺失值,13行完整样本数量
(3)通过列表显示数据集缺失情况
r
r md.pattern(nhanes2)
age hyp bmi chl
13 1 1 1 1 0
1 1 1 0 1 1
3 1 1 1 0 1
1 1 0 0 1 2
7 1 0 0 0 3
0 8 9 10 27
1表示没有缺失数据,0表示存在缺失数据。 最左侧第1列表示样本数量,最右侧最后1列是缺失的属性数量。 最下方最后1行表示在该属性下的缺失的样本数量。
删除法是将缺失数据集转变成完整数据集最便捷、最粗暴的方法。删除法适用于缺失数据比例较小这种情况。
主要分2种删除方式:
(一) 删除样本。(删除行)
(二) 删除属性。(删除列)
大部分的统计软件包都默认采用行删除法来处理缺失值。因此,许多人在使用例如回归方法分析数据时,都没有意识到有“缺失值问题”需要处理。
使用na.omit()函数来对缺失数据的行进行删除
r
r newnhanes = na.omit(nhanes2) newnhanes
思考:如果要删除数据集中的缺失属性该怎样操作呢?
删除法虽然简单,但是会造成信息损失,改变数据结构等问题。 因此,在某些情况下,找到缺失值的合适替代值来进行插补,或许是更好的做法。
插补法主要包括:均值插补、回归插补、多重插补等变量插补方法。
(一)均值法
均值法是通过计算缺失值所在变量所有非缺失观测值的均值,使用均值来替代缺失值的插补方法。
我们以均值法为例来对nhanes2数据集的第4列进行实现。
(1)展示数据集nhanes2
r
r nhanes2
(2)将第四列中为NA值的行号存入数据集sub中
r
r is.na(nhanes2[,4])
[1] TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE
[15] TRUE TRUE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE
r
r sub=which(is.na(nhanes2[,4])) sub
[1] 1 4 10 11 12 15 16 20 21 24
(3)将第四列不为NA的数存入数据集A中
r
r A=nhanes2[-sub,] A
(4)将第四列为NA的数存入数据集B中
r
r B=nhanes2[sub,] B
(5)计算数据集第四列没有缺失值数据的均值
r
r A_4mean=mean(A[,4]) A_4mean
[1] 191.4
(6)利用均值代替缺失值
r
r B[,4]=A_4mean B
思考:用中位数或四分位数进行插补该怎样操作呢?
(二)回归插补
回归插补是需要将插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值 对缺失变量进行插补。
我们以回归插补为例来对nhanes2数据集的第4列进行实现。
(1)将第四列不为NA的数存入数据集C中
r
r sub=which(is.na(nhanes2[,4])) C=nhanes2[-sub,]
C
(2)将第四列为NA的数存入数据集D中
r
r D=nhanes2[sub,] D
(3)以C数据集中的age为自变量,chl为因变量构建线性回归模型lm
r
r lm=lm(chl~age,data=C) lm
Call:
lm(formula = chl ~ age, data = C)
Coefficients:
(Intercept) age40-59 age60-99
169.00 33.80 55.67
(4)利用构建的lm模型对数据集D中的chl的缺失数据进行预测
r
r E=predict(lm,D) E
1 4 10 11 12 15 16 20 21
169.0000 224.6667 202.8000 169.0000 202.8000 169.0000 169.0000 224.6667 169.0000
24
224.6667
(5)将预测出的数据E替代nhanes2中chl为NA的数据
r
r F <- nhanes2 F[sub,4]=round(E) F
函数round()表示四舍五入。
多重插补是通过变量间的关系对缺失数据进行预测,利用蒙特卡洛方法生成多个 完整的数据集,再对这些数据集分别进行分析,最后对分析结果进行汇总处理。
(1)我们用mice()函数来进行多重插补
r
r imp=mice(nhanes2,m=4)
iter imp variable
1 1 bmi hyp
1 2 bmi hyp
1 3 bmi hyp
1 4 bmi hyp
2 1 bmi hyp
2 2 bmi hyp
2 3 bmi hyp
2 4 bmi hyp
3 1 bmi hyp
3 2 bmi hyp
3 3 bmi hyp
3 4 bmi hyp
4 1 bmi hyp
4 2 bmi hyp
4 3 bmi hyp
4 4 bmi hyp
5 1 bmi hyp
5 2 bmi hyp
5 3 bmi hyp
5 4 bmi hyp
r
r #fit=with(imp,lm(chl~age+hyp+bmi)) #pooled=pool(fit)
#summary(pooled)
mice()函数中m默认为5,即插补5组新数据。因采用蒙特卡洛模拟方法生成插补数据,因此,如果不设种子时,每次插补数据并不相同。with()函数可依次对每个完整数据集应用统计模型;pool()函数将这些单独的分析结果整合为一组结果。最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。
(2)通过complete()函数来查看不同组的插补数据
r
r complete(imp,action = 3)