- 推理方法
例如调研性别时,发生很多的姓名是男性,那么当性别有缺失值,但是姓名是一样的,就可以将缺失值填补为男性,等等这种生活中靠数学或者关系逻辑来填补缺失值的方法
- 行删除
a、只要包含一个或多个缺失值的行会被输出,这方法称为行删除法(listwise)、个案删除(case-wise)或剔除
b、 行删除法假定数据是MCAR(即完整的观测只是全数据的一个随机样本)(也就是说数据是MCAR,可使用行删除,因为后续样本量的减少对统计检验效力不会造成严重影响)
#以下两个语句的结果都是一样的:将缺失数据的行删除,然后结果保存到newdata中newdata <- mydata[complete.cases(mydata),]newdata <- na.omit(mydata)
案例
研究寿命和妊娠期对睡眠中做梦时长的影响,可应用行删除法的线性回归
> fit <- lm(Dream ~ Span + Gest,data = na.omit(sleep)) #行删除法时使用42个实例,注意代码cor(sleep,use="complete.obs")可生成同样的结果> summary(fit)Call:lm(formula = Dream ~ Span + Gest, data = na.omit(sleep))Residuals: Min 1Q Median 3Q Max -2.333 -0.915 -0.221 0.382 4.183 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.480122 0.298476 8.31 3.7e-10 ***Span -0.000472 0.013130 -0.04 0.971 Gest -0.004394 0.002081 -2.11 0.041 * ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 1 on 39 degrees of freedomMultiple R-squared: 0.167, Adjusted R-squared: 0.125 F-statistic: 3.92 on 2 and 39 DF, p-value: 0.0282#动物妊娠期越短,做梦时长越长(控制寿命不变),而控制妊娠期不变时,寿命与做梦时长不相关> fit1 <- lm(Dream ~ Span + Gest,data = sleep) #不使用行删除法有 44个实例,和许多的R函数一样,lm()将使用有限的行删除> summary(fit1) #定义会用函数拟合、含缺失值的变量,本例(Dream、Span、Gest)对应的实例才会被删除Call:lm(formula = Dream ~ Span + Gest, data = sleep)Residuals: Min 1Q Median 3Q Max -2.313 -0.858 -0.218 0.408 4.184 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 2.478748 0.290662 8.53 1.3e-10 ***Span -0.000887 0.012310 -0.07 0.943 Gest -0.004319 0.001756 -2.46 0.018 * ---Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 1 on 41 degrees of freedom (18 observations deleted due to missingness)Multiple R-squared: 0.195, Adjusted R-squared: 0.156 F-statistic: 4.98 on 2 and 41 DF, p-value: 0.0116
- 多重插补法(MI)
多重插补(MI)是一种基于重复模拟的处理缺失值的方法,在面对复杂的缺失值问题是,常用该方法
a、它将从一个包含缺失值的数据集中生成一组完整的数据集(通常用3到10个)
b、每个模拟数据集中,缺失数据将用 蒙特卡洛方法来填补
c、此时,标准的统计方法便可应用到每个模拟的数据集上,通过组合输出结果给出估计的结果,以及引入缺失值时的置信区间。
R 中可利用 Amelia,mice和 mi 包来执行这些操作
基于mice包的分析通常符合以下过程
library(mice)imp <- mice(data,m)fit <- with(imp,analysis)pooled <- pool(fit)summary(pooled)
data:是一个包含缺失值的矩阵或者数据框
imp:是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息。默认 m 为 5
analysis:是一个表达式对象,用来设定应用于 m 个插补数据集的统计分析方法。方法包括线性回归模型的lm() 函数、做广义线性模型的glm()函数、以及做负二项模型的 nbrm() 函数。表达式在函数的括号中,~ 的左边是响应变量,右边是预测变量(用 + 符号分隔开)
fit:是一个包含 m 个单独统计分析平均结果的列表对象
pooled:是一个包含这 m 个统计分析平均结果的列表对象
实现原理 P394
> library(mice)> data(sleep,package = "VIM")> imp <- mice(sleep,seed=1234) iter imp variable 1 1 NonD Dream Sleep Span Gest 1 2 NonD Dream Sleep Span Gest#...结果过长,忽略不写...> fit <- with(imp,lm(Dream~Span + Gest))> pooled <- pool(fit)> summary(pooled) est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda(Intercept) 2.546 0.255 10.0 52 1e-13 2.035 3.057 NA 0.09 0.05Span -0.005 0.012 -0.4 52 7e-01 -0.029 0.020 4 0.09 0.05Gest -0.004 0.001 -2.7 56 1e-02 -0.007 -0.001 4 0.05 0.02
可看到Span的回归系数不显著(p≈0.08),Gest的系数在p<0.01的水下很显著,若将结果与上述行删除的对比,会发现背离的结论相同,当控制寿命不变时,妊娠期与做梦时长有一个(统计)显著、负相关的关系
fmi:表示由于引入缺失数据而引起的变异所占整体不确定性的比例
- 其他处理缺失值的方法
软件包 | 描述 |
mvnmle | 对多元正态分布数据中缺失值的最大似然估计 |
cat | 对数线性模型中多元类别型变量的多重插补 |
arrryImpute、arrayMissPattern、SeqKnn | 处理伪阵列数据的使用函数 |
longitudinalData | 相关的函数列表,比如对时间序列缺失值进行插补的一系列函数 |
kmi | 处理生存分析缺失值的Kaplan-Meier多重插补 |
mix | 一般位置模型中混合类型和连续型数据的多重插补 |
pan | 多元面板数据或聚类数据的多重插补 |
- 两种过时(或者说不提倡常用的方法、尽量只作为备选的方法)
- 成对删除
对于成对删除,观测只是当它含缺失数据的变量涉及某个特定分析时才会被删除
> cor(sleep,use = "pairwise.complete.obs") BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp DangerBodyWgt 1.00 0.93 -0.4 -0.1 -0.3 0.30 0.7 0.06 0.3 0.13BrainWgt 0.93 1.00 -0.4 -0.1 -0.4 0.51 0.7 0.03 0.4 0.15NonD -0.38 -0.37 1.0 0.5 1.0 -0.38 -0.6 -0.32 -0.5 -0.48Dream -0.11 -0.11 0.5 1.0 0.7 -0.30 -0.5 -0.45 -0.5 -0.58Sleep -0.31 -0.36 1.0 0.7 1.0 -0.41 -0.6 -0.40 -0.6 -0.59Span 0.30 0.51 -0.4 -0.3 -0.4 1.00 0.6 -0.10 0.4 0.06Gest 0.65 0.75 -0.6 -0.5 -0.6 0.61 1.0 0.20 0.6 0.38Pred 0.06 0.03 -0.3 -0.4 -0.4 -0.10 0.2 1.00 0.6 0.92Exp 0.34 0.37 -0.5 -0.5 -0.6 0.36 0.6 0.62 1.0 0.79Danger 0.13 0.15 -0.5 -0.6 -0.6 0.06 0.4 0.92 0.8 1.00
此例中,任何两个变量的相关系数只利用了仅这两个变量可用的观测(忽略其他变量),比如BodyWgt 和 BrainWgt 基于62种(所有变量下的动物数)动物的数据,而 BodyWgt 和 NonD基于42种动物的数据,每次计算只用了不同的数据子集,这将会导致一些扭曲的、难以解释的结果
- 简单(非随机)插补
所谓简单插补,即用某个值(平均值、中位数、众数)来替换变量中的缺失值。注意这话总替换是非随机的,这意味着不会引入随机误差(与多重插补不同)
优点:不会减少样本量
缺点:对于非MCAR数据会产生有偏的结果,若缺失数据的数目非常大,那么简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验 p值