缺失值处理

缺失值概述 缺失数据主要有两种类型: 1.MCAR:完全随机缺失,这是数据缺失的理想状况。 2.MNAR:非随机缺失,在这种情况下,你可能需要去检查数据的收集过程并且试着理解数据为什么会丢失。例如,大多数人在一项调查中不回答某个问题,可能是因为问题敏感而特意回避不回答,就属于非随机缺失。 假设数据缺失的类型是MCAR,过多的数据丢失也是一个问题。通常,一个可靠的最大阈值是数据集总数的5%。如果某些特征或样本缺失的数据超过了5%,你可能需要忽略掉这些特征或样本。

缺失值的查看

我们可以通过mice包中的md.pattern()函数快速查看数据缺失值情况。首先让我们通过R中的airquality空气质量数据集为例,通过OzoneSolar.RWind及时间预测温度水平。并对数据集做填充。
library(mice)
data("airquality")
data1 <- airquality
data1[1:5,5] <- NA
summary(data1)
## Ozone Solar.R Wind Temp
## Min. : 1.00 Min. : 7.0 Min. : 1.700 Min. :56.00
## 1st Qu.: 18.00 1st Qu.:115.8 1st Qu.: 7.400 1st Qu.:72.00
## Median : 31.50 Median :205.0 Median : 9.700 Median :79.00
## Mean : 42.13 Mean :185.9 Mean : 9.958 Mean :77.88
## 3rd Qu.: 63.25 3rd Qu.:258.8 3rd Qu.:11.500 3rd Qu.:85.00
## Max. :168.00 Max. :334.0 Max. :20.700 Max. :97.00
## NA's :37 NA's :7
## Month Day
## Min. :5.000 Min. : 1.0
## 1st Qu.:6.000 1st Qu.: 8.0
## Median :7.000 Median :16.0
## Mean :7.061 Mean :15.8
## 3rd Qu.:8.000 3rd Qu.:23.0
## Max. :9.000 Max. :31.0
## NA's :5
函数来检查下哪些特征(列)和样本(行)的数据缺失超过了5%。可以看到Ozone列的数据点缺失大约25%。因此,我们可能会考虑从分析中剔除它或者是对它做更多的收集。其他变量都低于5%的阈值,我们可以保留它们。
pMiss <- function(x) {sum(is.na(x))/length(x)*100}
apply(data1,2,pMiss)
## Ozone Solar.R Wind Temp Month Day
## 24.183007 4.575163 0.000000 0.000000 3.267974 0.000000
md.pattern()函数快速查看数据缺失值
md.pattern(data1)
## Wind Temp Day Month Solar.R Ozone
## 107 1 1 1 1 1 1 0
## 35 1 1 1 1 1 0 1
## 5 1 1 1 1 0 1 1
## 4 1 1 1 0 1 1 1
## 1 1 1 1 1 0 0 2
## 1 1 1 1 0 0 0 3
## 0 0 0 5 7 37 49
输出结果显示,有107个样本是完整的,35个样本仅缺失Qzone观测值,5个样本样本仅缺失Solar.R值等。

利用VIM包缺失值可视化

VIM包是缺失值填补及可视化的专用包,aggr()函数是计算并绘图每个变量缺失值数目的函数。直方图展示了不同变量缺失值的构成,仍然是Ozone列的数据点缺失大约25%。不含任何缺失值数据约70%
library(VIM)
## Loading required package: colorspace
## Loading required package: grid
## Loading required package: data.table
## VIM is ready to use.
## Since version 4.0.0 the GUI is in its own package VIMGUI.
##
## Please use the package to use the new (and old) GUI.
## Suggestions and bug-reports can be submitted at: https://github.com/alexkowa/VIM/issues
##
## Attaching package: 'VIM'
## The following object is masked from 'package:datasets':
##
## sleep
aggr_plot <- aggr(data1, col = c('navyblue', 'red'), numbers=TRUE, sortVars=TRUE, labels=names(data), cex.axis=.7, gap=3, ylab=c("Histogram of missing data", "Pattern"))
## Warning in plot.aggr(res, ...): not enough horizontal space to display
## frequencies
##
## Variables sorted by number of missings:
## Variable Count
## Ozone 0.24183007
## Solar.R 0.04575163
## Month 0.03267974
## Wind 0.00000000
## Temp 0.00000000
## Day 0.00000000
marginplot(data1[,c(1,2)])
这里限定对两个变量作图,也可以运用marginmatrix()对多个变量作图。左边的红色箱线图展示的是在Qzone值缺失的情况下Solar.R的分布,而蓝色箱线图展示的Qzone值不缺失的情况下Solar.R的分布。同样的,Qzone箱线图在底部。如果对数据缺失假定为MCAR类型正确的话,那么我们预期的红色箱线图和蓝色箱线图应该是非常相似的。

缺失值的填补

运用均值、中位数、众数填补
library(Hmisc)
## Loading required package: lattice
## Loading required package: survival
## Loading required package: Formula
## Loading required package: ggplot2
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, round.POSIXt, trunc.POSIXt, units
#均值填补
impute(data1$Ozone,mean)
## 1 2 3 4 5 6
## 41.00000 36.00000 12.00000 18.00000 42.12931* 28.00000
## 7 8 9 10 11 12
## 23.00000 19.00000 8.00000 42.12931* 7.00000 16.00000
## 13 14 15 16 17 18
## 11.00000 14.00000 18.00000 14.00000 34.00000 6.00000
## 19 20 21 22 23 24
## 30.00000 11.00000 1.00000 11.00000 4.00000 32.00000
## 25 26 27 28 29 30
## 42.12931* 42.12931* 42.12931* 23.00000 45.00000 115.00000
## 31 32 33 34 35 36
## 37.00000 42.12931* 42.12931* 42.12931* 42.12931* 42.12931*
## 37 38 39 40 41 42
## 42.12931* 29.00000 42.12931* 71.00000 39.00000 42.12931*
## 43 44 45 46 47 48
## 42.12931* 23.00000 42.12931* 42.12931* 21.00000 37.00000
## 49 50 51 52 53 54
## 20.00000 12.00000 13.00000 42.12931* 42.12931* 42.12931*
## 55 56 57 58 59 60
## 42.12931* 42.12931* 42.12931* 42.12931* 42.12931* 42.12931*
## 61 62 63 64 65 66
## 42.12931* 135.00000 49.00000 32.00000 42.12931* 64.00000
## 67 68 69 70 71 72
## 40.00000 77.00000 97.00000 97.00000 85.00000 42.12931*
## 73 74 75 76 77 78
## 10.00000 27.00000 42.12931* 7.00000 48.00000 35.00000
## 79 80 81 82 83 84
## 61.00000 79.00000 63.00000 16.00000 42.12931* 42.12931*
## 85 86 87 88 89 90
## 80.00000 108.00000 20.00000 52.00000 82.00000 50.00000
## 91 92 93 94 95 96
## 64.00000 59.00000 39.00000 9.00000 16.00000 78.00000
## 97 98 99 100 101 102
## 35.00000 66.00000 122.00000 89.00000 110.00000 42.12931*
## 103 104 105 106 107 108
## 42.12931* 44.00000 28.00000 65.00000 42.12931* 22.00000
## 109 110 111 112 113 114
## 59.00000 23.00000 31.00000 44.00000 21.00000 9.00000
## 115 116 117 118 119 120
## 42.12931* 45.00000 168.00000 73.00000 42.12931* 76.00000
## 121 122 123 124 125 126
## 118.00000 84.00000 85.00000 96.00000 78.00000 73.00000
## 127 128 129 130 131 132
## 91.00000 47.00000 32.00000 20.00000 23.00000 21.00000
## 133 134 135 136 137 138
## 24.00000 44.00000 21.00000 28.00000 9.00000 13.00000
## 139 140 141 142 143 144
## 46.00000 18.00000 13.00000 24.00000 16.00000 13.00000
## 145 146 147 148 149 150
## 23.00000 36.00000 7.00000 14.00000 30.00000 42.12931*
## 151 152 153
## 14.00000 18.00000 20.00000
#中位数填补
impute(data1$Ozone,median)
## 1 2 3 4 5 6 7 8 9 10
## 41.0 36.0 12.0 18.0 31.5* 28.0 23.0 19.0 8.0 31.5*
## 11 12 13 14 15 16 17 18 19 20
## 7.0 16.0 11.0 14.0 18.0 14.0 34.0 6.0 30.0 11.0
## 21 22 23 24 25 26 27 28 29 30
## 1.0 11.0 4.0 32.0 31.5* 31.5* 31.5* 23.0 45.0 115.0
## 31 32 33 34 35 36 37 38 39 40
## 37.0 31.5* 31.5* 31.5* 31.5* 31.5* 31.5* 29.0 31.5* 71.0
## 41 42 43 44 45 46 47 48 49 50
## 39.0 31.5* 31.5* 23.0 31.5* 31.5* 21.0 37.0 20.0 12.0
## 51 52 53 54 55 56 57 58 59 60
## 13.0 31.5* 31.5* 31.5* 31.5* 31.5* 31.5* 31.5* 31.5* 31.5*
## 61 62 63 64 65 66 67 68 69 70
## 31.5* 135.0 49.0 32.0 31.5* 64.0 40.0 77.0 97.0 97.0
## 71 72 73 74 75 76 77 78 79 80
## 85.0 31.5* 10.0 27.0 31.5* 7.0 48.0 35.0 61.0 79.0
## 81 82 83 84 85 86 87 88 89 90
## 63.0 16.0 31.5* 31.5* 80.0 108.0 20.0 52.0 82.0 50.0
## 91 92 93 94 95 96 97 98 99 100
## 64.0 59.0 39.0 9.0 16.0 78.0 35.0 66.0 122.0 89.0
## 101 102 103 104 105 106 107 108 109 110
## 110.0 31.5* 31.5* 44.0 28.0 65.0 31.5* 22.0 59.0 23.0
## 111 112 113 114 115 116 117 118 119 120
## 31.0 44.0 21.0 9.0 31.5* 45.0 168.0 73.0 31.5* 76.0
## 121 122 123 124 125 126 127 128 129 130
## 118.0 84.0 85.0 96.0 78.0 73.0 91.0 47.0 32.0 20.0
## 131 132 133 134 135 136 137 138 139 140
## 23.0 21.0 24.0 44.0 21.0 28.0 9.0 13.0 46.0 18.0
## 141 142 143 144 145 146 147 148 149 150
## 13.0 24.0 16.0 13.0 23.0 36.0 7.0 14.0 30.0 31.5*
## 151 152 153
## 14.0 18.0 20.0
#具体值填补
impute(data1$Ozone,45)
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
## 41 36 12 18 45* 28 23 19 8 45* 7 16 11 14 18
## 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
## 14 34 6 30 11 1 11 4 32 45* 45* 45* 23 45 115
## 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
## 37 45* 45* 45* 45* 45* 45* 29 45* 71 39 45* 45* 23 45*
## 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
## 45* 21 37 20 12 13 45* 45* 45* 45* 45* 45* 45* 45* 45*
## 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
## 45* 135 49 32 45* 64 40 77 97 97 85 45* 10 27 45*
## 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
## 7 48 35 61 79 63 16 45* 45* 80 108 20 52 82 50
## 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
## 64 59 39 9 16 78 35 66 122 89 110 45* 45* 44 28
## 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
## 65 45* 22 59 23 31 44 21 9 45* 45 168 73 45* 76
## 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
## 118 84 85 96 78 73 91 47 32 20 23 21 24 44 21
## 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
## 28 9 13 46 18 13 24 16 13 23 36 7 14 30 45*
## 151 152 153
## 14 18 20
#手动编辑
data1$Temp[is.na(data1$Ozone)] <- mean(data1$Ozone,na.rm = TRUE)
使用均值、中位数、众数来代替缺失值应该是运用最广泛的方法之一。可以使用Hmisc包中的impute()实现。打*号数据表示填补后数据。

填补准确性计算

DMwR包是“Data Mining with R”一书中的数据及函数包。其中regr.eval()函数可以计算许多回归函数统计评价。最后结果mae为“mean absolute error”mse为“mean squared error”rmse为“ root mean squared error”mape为“sum(|(t_i - p_i) / t_i|)/N”,可用来评价填补的准确性,详情可在SCANhelp查看。在本例中mape0.45,误差还是比较高的。
library(DMwR)
##
## Attaching package: 'DMwR'
## The following object is masked from 'package:VIM':
##
## kNN
actuals <- airquality$Temp[is.na(airquality$Ozone)]
predicteds <- rep(mean(data1$Ozone, na.rm=T), length(actuals))
regr.eval(actuals, predicteds)
## mae mse rmse mape
## 35.7896086 1369.2949132 37.0039851 0.4502027

K最近邻算法(kNN)填补

K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。注意的是,在填补过程中,不能包含应变量即预测变量。
library(DMwR)
knnOutput <- knnImputation(airquality[,-4])
anyNA(knnOutput)
## [1] FALSE

rpart

DMwR::knnImputation一大缺点是无法填补分类变量。rpart可代替kNN预测缺失值。当处理分类变量时,设置method=class,对于数值变量,设置method=anova。同样在填补过程中,不能包含应变量即预测变量。
data1$Month <- factor(data1$Month)
library(rpart)
#Month为分类变量
class_month <- rpart(Month ~ .-Temp,data=data1[!is.na(data1$Month),], method="class", na.action=na.omit)
month_pred <- predict(class_month, data1[is.na(data1$Month), ])
#Ozone为数值变量
anove_Ozone <- rpart(Ozone ~ .-Temp,data=data1[!is.na(data1$Ozone),], method="anova", na.action=na.omit)
Ozone_pred <- predict(anove_Ozone, data1[is.na(data1$Ozone), ])

填补准确性计算

actuals <- airquality$Month[is.na(data1$Month)]
predicteds <- as.numeric(colnames(month_pred)[apply(month_pred, 1, which.max)])
#计算错分率
mean(actuals != predicteds)
## [1] 0.6

运用mice包多重填补

mice函数通过链式方程生成多元插补。参数注解:1. m=5指的是插补数据集的数量,5是默认值。2. meth=’pmm’指的是插补方法。在这里,我们使用预测均值匹配(Predictive mean matching )作为插补方法。其他插补方法可以通过methods(mice)来查看。
library(mice)
tempData <- mice(data1,m=5,maxit=50,meth='pmm',seed=500)
##
## iter imp variable
## 1 1 Ozone Solar.R Month
## 1 2 Ozone Solar.R Month
## 1 3 Ozone Solar.R Month
## 1 4 Ozone Solar.R Month
## 1 5 Ozone Solar.R Month
## 2 1 Ozone Solar.R Month
## 2 2 Ozone Solar.R Month
## 2 3 Ozone Solar.R Month
## 2 4 Ozone Solar.R Month
## 2 5 Ozone Solar.R Month
## 3 1 Ozone Solar.R Month
## 3 2 Ozone Solar.R Month
## 3 3 Ozone Solar.R Month
## 3 4 Ozone Solar.R Month
## 3 5 Ozone Solar.R Month
## 4 1 Ozone Solar.R Month
## 4 2 Ozone Solar.R Month
## 4 3 Ozone Solar.R Month
## 4 4 Ozone Solar.R Month
## 4 5 Ozone Solar.R Month
## 5 1 Ozone Solar.R Month
## 5 2 Ozone Solar.R Month
## 5 3 Ozone Solar.R Month
## 5 4 Ozone Solar.R Month
## 5 5 Ozone Solar.R Month
## 6 1 Ozone Solar.R Month
## 6 2 Ozone Solar.R Month
## 6 3 Ozone Solar.R Month
## 6 4 Ozone Solar.R Month
## 6 5 Ozone Solar.R Month
## 7 1 Ozone Solar.R Month
## 7 2 Ozone Solar.R Month
## 7 3 Ozone Solar.R Month
## 7 4 Ozone Solar.R Month
## 7 5 Ozone Solar.R Month
## 8 1 Ozone Solar.R Month
## 8 2 Ozone Solar.R Month
## 8 3 Ozone Solar.R Month
## 8 4 Ozone Solar.R Month
## 8 5 Ozone Solar.R Month
## 9 1 Ozone Solar.R Month
## 9 2 Ozone Solar.R Month
## 9 3 Ozone Solar.R Month
## 9 4 Ozone Solar.R Month
## 9 5 Ozone Solar.R Month
## 10 1 Ozone Solar.R Month
## 10 2 Ozone Solar.R Month
## 10 3 Ozone Solar.R Month
## 10 4 Ozone Solar.R Month
## 10 5 Ozone Solar.R Month
## 11 1 Ozone Solar.R Month
## 11 2 Ozone Solar.R Month
## 11 3 Ozone Solar.R Month
## 11 4 Ozone Solar.R Month
## 11 5 Ozone Solar.R Month
## 12 1 Ozone Solar.R Month
## 12 2 Ozone Solar.R Month
## 12 3 Ozone Solar.R Month
## 12 4 Ozone Solar.R Month
## 12 5 Ozone Solar.R Month
## 13 1 Ozone Solar.R Month
## 13 2 Ozone Solar.R Month
## 13 3 Ozone Solar.R Month
## 13 4 Ozone Solar.R Month
## 13 5 Ozone Solar.R Month
## 14 1 Ozone Solar.R Month
## 14 2 Ozone Solar.R Month
## 14 3 Ozone Solar.R Month
## 14 4 Ozone Solar.R Month
## 14 5 Ozone Solar.R Month
## 15 1 Ozone Solar.R Month
## 15 2 Ozone Solar.R Month
## 15 3 Ozone Solar.R Month
## 15 4 Ozone Solar.R Month
## 15 5 Ozone Solar.R Month
## 16 1 Ozone Solar.R Month
## 16 2 Ozone Solar.R Month
## 16 3 Ozone Solar.R Month
## 16 4 Ozone Solar.R Month
## 16 5 Ozone Solar.R Month
## 17 1 Ozone Solar.R Month
## 17 2 Ozone Solar.R Month
## 17 3 Ozone Solar.R Month
## 17 4 Ozone Solar.R Month
## 17 5 Ozone Solar.R Month
## 18 1 Ozone Solar.R Month
## 18 2 Ozone Solar.R Month
## 18 3 Ozone Solar.R Month
## 18 4 Ozone Solar.R Month
## 18 5 Ozone Solar.R Month
## 19 1 Ozone Solar.R Month
## 19 2 Ozone Solar.R Month
## 19 3 Ozone Solar.R Month
## 19 4 Ozone Solar.R Month
## 19 5 Ozone Solar.R Month
## 20 1 Ozone Solar.R Month
## 20 2 Ozone Solar.R Month
## 20 3 Ozone Solar.R Month
## 20 4 Ozone Solar.R Month
## 20 5 Ozone Solar.R Month
## 21 1 Ozone Solar.R Month
## 21 2 Ozone Solar.R Month
## 21 3 Ozone Solar.R Month
## 21 4 Ozone Solar.R Month
## 21 5 Ozone Solar.R Month
## 22 1 Ozone Solar.R Month
## 22 2 Ozone Solar.R Month
## 22 3 Ozone Solar.R Month
## 22 4 Ozone Solar.R Month
## 22 5 Ozone Solar.R Month
## 23 1 Ozone Solar.R Month
## 23 2 Ozone Solar.R Month
## 23 3 Ozone Solar.R Month
## 23 4 Ozone Solar.R Month
## 23 5 Ozone Solar.R Month
## 24 1 Ozone Solar.R Month
## 24 2 Ozone Solar.R Month
## 24 3 Ozone Solar.R Month
## 24 4 Ozone Solar.R Month
## 24 5 Ozone Solar.R Month
## 25 1 Ozone Solar.R Month
## 25 2 Ozone Solar.R Month
## 25 3 Ozone Solar.R Month
## 25 4 Ozone Solar.R Month
## 25 5 Ozone Solar.R Month
## 26 1 Ozone Solar.R Month
## 26 2 Ozone Solar.R Month
## 26 3 Ozone Solar.R Month
## 26 4 Ozone Solar.R Month
## 26 5 Ozone Solar.R Month
## 27 1 Ozone Solar.R Month
## 27 2 Ozone Solar.R Month
## 27 3 Ozone Solar.R Month
## 27 4 Ozone Solar.R Month
## 27 5 Ozone Solar.R Month
## 28 1 Ozone Solar.R Month
## 28 2 Ozone Solar.R Month
## 28 3 Ozone Solar.R Month
## 28 4 Ozone Solar.R Month
## 28 5 Ozone Solar.R Month
## 29 1 Ozone Solar.R Month
## 29 2 Ozone Solar.R Month
## 29 3 Ozone Solar.R Month
## 29 4 Ozone Solar.R Month
## 29 5 Ozone Solar.R Month
## 30 1 Ozone Solar.R Month
## 30 2 Ozone Solar.R Month
## 30 3 Ozone Solar.R Month
## 30 4 Ozone Solar.R Month
## 30 5 Ozone Solar.R Month
## 31 1 Ozone Solar.R Month
## 31 2 Ozone Solar.R Month
## 31 3 Ozone Solar.R Month
## 31 4 Ozone Solar.R Month
## 31 5 Ozone Solar.R Month
## 32 1 Ozone Solar.R Month
## 32 2 Ozone Solar.R Month
## 32 3 Ozone Solar.R Month
## 32 4 Ozone Solar.R Month
## 32 5 Ozone Solar.R Month
## 33 1 Ozone Solar.R Month
## 33 2 Ozone Solar.R Month
## 33 3 Ozone Solar.R Month
## 33 4 Ozone Solar.R Month
## 33 5 Ozone Solar.R Month
## 34 1 Ozone Solar.R Month
## 34 2 Ozone Solar.R Month
## 34 3 Ozone Solar.R Month
## 34 4 Ozone Solar.R Month
## 34 5 Ozone Solar.R Month
## 35 1 Ozone Solar.R Month
## 35 2 Ozone Solar.R Month
## 35 3 Ozone Solar.R Month
## 35 4 Ozone Solar.R Month
## 35 5 Ozone Solar.R Month
## 36 1 Ozone Solar.R Month
## 36 2 Ozone Solar.R Month
## 36 3 Ozone Solar.R Month
## 36 4 Ozone Solar.R Month
## 36 5 Ozone Solar.R Month
## 37 1 Ozone Solar.R Month
## 37 2 Ozone Solar.R Month
## 37 3 Ozone Solar.R Month
## 37 4 Ozone Solar.R Month
## 37 5 Ozone Solar.R Month
## 38 1 Ozone Solar.R Month
## 38 2 Ozone Solar.R Month
## 38 3 Ozone Solar.R Month
## 38 4 Ozone Solar.R Month
## 38 5 Ozone Solar.R Month
## 39 1 Ozone Solar.R Month
## 39 2 Ozone Solar.R Month
## 39 3 Ozone Solar.R Month
## 39 4 Ozone Solar.R Month
## 39 5 Ozone Solar.R Month
## 40 1 Ozone Solar.R Month
## 40 2 Ozone Solar.R Month
## 40 3 Ozone Solar.R Month
## 40 4 Ozone Solar.R Month
## 40 5 Ozone Solar.R Month
## 41 1 Ozone Solar.R Month
## 41 2 Ozone Solar.R Month
## 41 3 Ozone Solar.R Month
## 41 4 Ozone Solar.R Month
## 41 5 Ozone Solar.R Month
## 42 1 Ozone Solar.R Month
## 42 2 Ozone Solar.R Month
## 42 3 Ozone Solar.R Month
## 42 4 Ozone Solar.R Month
## 42 5 Ozone Solar.R Month
## 43 1 Ozone Solar.R Month
## 43 2 Ozone Solar.R Month
## 43 3 Ozone Solar.R Month
## 43 4 Ozone Solar.R Month
## 43 5 Ozone Solar.R Month
## 44 1 Ozone Solar.R Month
## 44 2 Ozone Solar.R Month
## 44 3 Ozone Solar.R Month
## 44 4 Ozone Solar.R Month
## 44 5 Ozone Solar.R Month
## 45 1 Ozone Solar.R Month
## 45 2 Ozone Solar.R Month
## 45 3 Ozone Solar.R Month
## 45 4 Ozone Solar.R Month
## 45 5 Ozone Solar.R Month
## 46 1 Ozone Solar.R Month
## 46 2 Ozone Solar.R Month
## 46 3 Ozone Solar.R Month
## 46 4 Ozone Solar.R Month
## 46 5 Ozone Solar.R Month
## 47 1 Ozone Solar.R Month
## 47 2 Ozone Solar.R Month
## 47 3 Ozone Solar.R Month
## 47 4 Ozone Solar.R Month
## 47 5 Ozone Solar.R Month
## 48 1 Ozone Solar.R Month
## 48 2 Ozone Solar.R Month
## 48 3 Ozone Solar.R Month
## 48 4 Ozone Solar.R Month
## 48 5 Ozone Solar.R Month
## 49 1 Ozone Solar.R Month
## 49 2 Ozone Solar.R Month
## 49 3 Ozone Solar.R Month
## 49 4 Ozone Solar.R Month
## 49 5 Ozone Solar.R Month
## 50 1 Ozone Solar.R Month
## 50 2 Ozone Solar.R Month
## 50 3 Ozone Solar.R Month
## 50 4 Ozone Solar.R Month
## 50 5 Ozone Solar.R Month
可以使用complete()函数返回完整的数据集。缺失的值被五个数据集的第一个数据集做了替换。如果希望使用另一个数据集,只需更改complete()函数的第二个参数。
completedData <- complete(tempData,1)

查看初始数据和插补数据的分布情况

利用一些有用的图对初始数据和插补后的数据分布做对比。我们希望看到的是洋红点呈现出的形状(插补值)跟蓝色点(观测值)呈现出的形状是匹配的。从图中可以看到,插补的值的确是“近似于实际值”。洋红线是每个插补数据集的数据密度曲线,蓝色是观测值数据的密度曲线。再次根据我们之前的假定,我们希望这些分布是相似的。
xyplot(tempData,Ozone ~ Wind+Temp+Solar.R,pch=18,cex=1)
densityplot(tempData)
另一个有用的可视化是由stripplot()函数得到的包含个别点的变量分布图。
stripplot(tempData, pch = 20, cex = 1.2)

填补数据的合并

假设我们下一步的分析是对数据拟合一个线性模型。你或许会问应该选择哪个插补数据集。mice包可以轻易的对每个数据集分别拟合一个模型,再把结果合并到一起。
modelFit1 <- with(tempData,lm(Temp~ Ozone+Solar.R+Wind))
summary(pool(modelFit1))
## est se t df Pr(>|t|)
## (Intercept) 53.32314776 4.90845317 10.863534 145.6883 0.0000000
## Ozone 0.40049066 0.04284114 9.348272 143.6714 0.0000000
## Solar.R -0.01918836 0.01287279 -1.490614 138.1747 0.1383421
## Wind 0.52518619 0.36740996 1.429428 139.5733 0.1551156
## lo 95 hi 95 nmis fmi lambda
## (Intercept) 43.62217421 63.024121307 NA 0.02062852 0.007275427
## Ozone 0.31581029 0.485171036 37 0.02840538 0.014973631
## Solar.R -0.04464149 0.006264763 7 0.04378544 0.030044222
## Wind -0.20122241 1.251594786 0 0.04030589 0.026651881

modelFit1变量包含所有插补数据集的拟合结果,pool()函数将结果合并到一起。显然,仅从Qzone变量来看的话,是统计显著的。注意的是这里除了lm()模型给出的结果外还包含其它列:fim指的是各个变量缺失信息的比例,lambda指的是每个变量对缺失数据的贡献大小。

评论

此博客中的热门博文

V2ray websocket(ws)+tls+nginx分流

Rstudio 使用代理