例如调研性别时,发生不少的姓名是男性,那么当性别有缺失值,可是姓名是同样的,就能够将缺失值填补为男性,等等这种生活中靠数学或者关系逻辑来填补缺失值的方法html
a、只要包含一个或多个缺失值的行会被输出,这方法称为行删除法(listwise)、个案删除(case-wise)或剔除git
b、 行删除法假定数据是MCAR(即完整的观测只是全数据的一个随机样本)(也就是说数据是MCAR,可以使用行删除,由于后续样本量的减小对统计检验效力不会形成严重影响)dom
#如下两个语句的结果都是同样的:将缺失数据的行删除,而后结果保存到newdata中 newdata <- mydata[complete.cases(mydata),] newdata <- na.omit(mydata)
案例函数
研究寿命和妊娠期对睡眠中作梦时长的影响,可应用行删除法的线性回归spa
> 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 ‘ ’ 1 Residual standard error: 1 on 39 degrees of freedom Multiple 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 ‘ ’ 1 Residual 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)是一种基于重复模拟的处理缺失值的方法,在面对复杂的缺失值问题是,经常使用该方法code
a、它将从一个包含缺失值的数据集中生成一组完整的数据集(一般用3到10个)orm
b、每一个模拟数据集中,缺失数据将用 蒙特卡洛方法来填补htm
c、此时,标准的统计方法即可应用到每一个模拟的数据集上,经过组合输出结果给出估计的结果,以及引入缺失值时的置信区间。对象
R 中可利用 Amelia,mice和 mi 包来执行这些操做blog
基于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.05 Span -0.005 0.012 -0.4 52 7e-01 -0.029 0.020 4 0.09 0.05 Gest -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 Danger BodyWgt 1.00 0.93 -0.4 -0.1 -0.3 0.30 0.7 0.06 0.3 0.13 BrainWgt 0.93 1.00 -0.4 -0.1 -0.4 0.51 0.7 0.03 0.4 0.15 NonD -0.38 -0.37 1.0 0.5 1.0 -0.38 -0.6 -0.32 -0.5 -0.48 Dream -0.11 -0.11 0.5 1.0 0.7 -0.30 -0.5 -0.45 -0.5 -0.58 Sleep -0.31 -0.36 1.0 0.7 1.0 -0.41 -0.6 -0.40 -0.6 -0.59 Span 0.30 0.51 -0.4 -0.3 -0.4 1.00 0.6 -0.10 0.4 0.06 Gest 0.65 0.75 -0.6 -0.5 -0.6 0.61 1.0 0.20 0.6 0.38 Pred 0.06 0.03 -0.3 -0.4 -0.4 -0.10 0.2 1.00 0.6 0.92 Exp 0.34 0.37 -0.5 -0.5 -0.6 0.36 0.6 0.62 1.0 0.79 Danger 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值