引用
1.缺失值填充方法
- 删除
- 平均值、中位数
- 回归插值
- 多元回归插值
2.mice包介绍
对于缺失值数据的处理,用3个步骤来进行定义。
- 填充:mice()函数,从一个包含缺失数据的数据框开始,然后返回一个包含多个完整数 据集的对象,每个完整数据集都是通过对原始数据框中的缺失数据进行插而生成的。
- 分析:with()函数,可依次对每个完整数据集应用统计模型,分析填充的结果。
- 优化:pool()函数,将这些单独的分析结果整合为一组结果,最终模型的标准误和p值,都将准确地反映出由于缺失值和多重插补而产生的不确定性。
3.具体操作
3.1观察缺失值
- 左边第一列,为样本数
- 右边第一列,为累积缺失值行数,0为没有缺失。
- 最下面一行,每个列有多少个缺失值
mice::md.pattern(airquality)
Wind Temp Month Day Solar.R Ozone
111 1 1 1 1 1 1 0
35 1 1 1 1 1 0 1
5 1 1 1 1 0 1 1
2 1 1 1 1 0 0 2 #(有两行)
0 0 0 0 7 37 44
3.2 多重填补法
- 进行填充
> imputed_Data <- mice(airquality, m=5, maxit = 50, method = 'pmm', seed = 500)
iter imp variable
1 1 Ozone Solar.R
1 2 Ozone Solar.R
1 3 Ozone Solar.R
1 4 Ozone Solar.R
1 5 Ozone Solar.R
2 1 Ozone Solar.R
2 2 Ozone Solar.R
// 省略输出
airquality
, 原始数据集;m
, 多重填补法的填补矩阵数,默认为5次;maxit
,最大迭代次数,默认5次;method
, 填补用的方法,pmm
为预测均值匹配(predictive mean matching)。用methods(mice)
可以看到有哪些可用的方法。
3.3 填补结果
- 以$Ozone为例,左边第一列为缺失值的行号,其他每一列都为每次pmm算法生成的填充结果,每一行表示生成的5次结果分别是什么值。
> imputed_Data$imp
$Ozone
1 2 3 4 5
5 18 18 18 6 1
10 20 30 16 16 16
25 18 19 8 6 13
26 4 1 28 19 37
27 14 7 11 18 41
32 59 40 44 23 31
33 36 7 13 65 41
// 省略输出
$Solar.R
1 2 3 4 5
5 215 299 65 98 112
6 222 157 320 332 279
11 183 47 137 135 7
27 36 223 25 238 238
96 273 323 291 294 175
97 287 275 285 31 237
98 323 187 294 320 264
-
分面板观察,以独立的各个指标进行分组,5组数据的填充情况。
-
每一个面板为一个列的原始数据和5次填充的数据,灰色散点为原始数据取值的分布,红色的小点为填充的数据取值的分布。
> stripplot(imputed_Data, col=c("grey",mdc(2)),pch=c(1,20))
-
分面板观察,以Ozone和Solar.R做进行分组组合,观察5组数据的填充情况。
-
每一个面板为一个列的原始数据和5次填充的数据,x轴为Solar.R,y轴为Ozone,蓝色散点为原始数据取值的分布,红色的小点为填充的数据取值的分布。
> xyplot(imputed_Data , Ozone ~ Solar.R | .imp, pch=20,cex=1.2)
3.4 分析结果优化
-
使用生成的填补的结果,应用统计模型,对每个完整的数据集进行评价。这里我们以多元线性回归模型作为评价填充值好坏的模型。
-
使用with()函数,对5组插补数据集进行多元线性回归分析模型,进行T检验,判断数据集中每个变量的有效性。
> fit=with(imputed_Data,lm(Ozone ~ Wind + Solar.R + Temp))
# 查看统计结果
> summary(fit)
# A tibble: 20 x 5
term estimate std.error statistic p.value
<chr> <dbl> <dbl> <dbl> <dbl>
1 (Intercept) -39.9 19.1 -2.09 3.87e- 2
2 Wind -3.60 0.549 -6.55 8.90e-10
3 Solar.R 0.0572 0.0200 2.87 4.72e- 3
4 Temp 1.38 0.213 6.46 1.39e- 9
5 (Intercept) -69.2 19.7 -3.51 5.99e- 4
6 Wind -3.24 0.567 -5.71 5.81e- 8
7 Solar.R 0.0582 0.0204 2.86 4.84e- 3
8 Temp 1.71 0.218 7.85 7.50e-13
9 (Intercept) -59.5 19.2 -3.10 2.34e- 3
10 Wind -3.13 0.550 -5.68 6.85e- 8
11 Solar.R 0.0571 0.0198 2.88 4.54e- 3
12 Temp 1.57 0.215 7.29 1.66e-11
13 (Intercept) -67.4 18.5 -3.64 3.73e- 4
14 Wind -2.94 0.531 -5.53 1.41e- 7
15 Solar.R 0.0668 0.0189 3.54 5.40e- 4
16 Temp 1.61 0.204 7.87 6.83e-13
17 (Intercept) -38.4 21.6 -1.78 7.69e- 2
18 Wind -3.99 0.620 -6.44 1.52e- 9
19 Solar.R 0.0523 0.0223 2.34 2.05e- 2
20 Temp 1.44 0.239 6.04 1.15e- 8
- 多元线性模型y=ax1+bx2+c*x3+e,x1=Wind,x2=Solar.R,x3=Temp, e=Intercept,上面数据集以每4行为一组,每组分别为多元线性回归的结果。
数据解释:
term
,变量;
estimate
,参数估计值;
std.error
,残差的标准误差;
statistic
,t统计量;
p.value
,p-value值
3.5 模型评估
- 使用pool()函数,将5个单独回归模型进行汇总,整理模型的标准误和p值等多个评价参数,进行F检验,判断模型整体拟合的有效性。pooled对象是一个包含这m个统计分析平均结果的列表对象,准确地反映出由于缺失值和多重插补而产生的不确定性。
> pooled=pool(fit)
> pooled
Class: mipo m = 5
estimate ubar b t dfcom df riv
(Intercept) -54.87825512 3.864370e+02 2.189907e+02 6.492258e+02 149 19.08909 0.68003032
Wind -3.37959755 3.186764e-01 1.758552e-01 5.297026e-01 149 19.61464 0.66219610
Solar.R 0.05833371 4.121520e-04 2.745861e-05 4.451024e-04 149 114.74908 0.07994702
Temp 1.54135605 4.758977e-02 1.736383e-02 6.842637e-02 149 30.33948 0.43783767
lambda fmi
(Intercept) 0.40477265 0.45866597
Wind 0.39838627 0.45159195
Solar.R 0.07402865 0.08975652
Temp 0.30451120 0.34623283
指标解读:
mipo
,一种数据结构,pool用于产生mipo对象;
m
, m=5 多组插补数据;
estimate
,估计值,pool汇总的完整数据估计;
ubar
, 估计的内插方差,std.error的平方的均值,越小越好;
b
,估计之间的插补方差, estimate的方差,越小越好;
t
,估计的总方差,ubar + (1 + 1 / m) * b, 越小越好;
dfcom
,完整数据的自由度;
df
,t统计量的自由度,由Barnard-Rubin提供一种自由度的计算方法,越小越好;
riv
,方差的相对增加,(1 + 1 / m) * b / ubar,越小越好;
lambda
, 缺失值的比例,(1 + 1 / m) * b / t,越小越好;
fmi
, 缺少信息的部分,(riv + 2 / (df + 3)) / (riv + 1)),越小越好;
对插补的结果,再进行R^2检验。
> pool.r.squared(fit)
est lo 95 hi 95 fmi
R^2 0.5630547 0.4404848 0.6677567 NaN
est
, 合并的R^2,估计值;
lo 95
,合并的R^2,95%下限;
hi 95
,合并的R^2,95%上限;
fmi
,缺少信息的部分,越小越好;
pool的过程,主要就是完成F检验和R^2检验。
3.6 最终结果
- 最后,根据检验统计量,我们选择以第2次pmm的结果做为填充,获得填充后的数据集。
> completeData <- complete(imputed_Data,2)
> completeData
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 18 299 14.3 56 5 5
6 28 157 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 30 194 8.6 69 5 10
- 数据和填充过程,如下图所示。
看完如果对你有帮助,感谢点赞支持!
如果你是电脑端,看到右下角的 “一键三连” 了吗,没错点它[哈哈]