53-R语言中缺失值处理方法

作者: wonphen | 来源:发表于2020-03-21 10:33 被阅读0次

    1、概览

    缺失值被认为是预测建模的首要障碍,尽管一些机器学习算法声称能够从根本上解决这个问题,但是谁又能知道究竟在“黑盒子”里能解决得多好。
    缺失值填补方法的选择,在很大程度上影响了模型的预测能力。一般处理方法是直接删除相关行,但这样并不好,因为会造成信息丢失。

    2、Hmice包

    Hmice是一个多用途的软件包,可用于数据分析、高级图形、缺失值处理、高级表格制作、模型拟合和诊断(线性回归、 Logit模型和cox回归)等。 该软件包包含的功能范围广泛,它提供了两个强大的函数,用于处理缺失值。分别为 impute ()和 aregImpute ()。
    impute()函数使用用户定义的统计方法(中间值,最大值,平均值等)来估算缺失值。 默认是使用中位数。另一方面,aregImpute()允许使用加性回归、自举和预测平均匹配进行填补(additive regression, bootstrapping, and predictive mean matching)。
    bootstrapping对替代原始数据的样本拟合了一个柔性可加模型(非参数回归方法) ,并利用非缺失值(自变量)对缺失值(因变量)进行了预测。然后,使用预测均值匹配(缺省值)来估算缺失值。

    > library(pacman)
    > p_load(Hmisc)
    > data(iris)
    > 
    > # 制造10%的缺失值
    > iris.mis <- missForest::prodNA(iris, noNA = 0.1)
    > sum(is.na(iris.mis))/(dim(iris)[1] * dim(iris)[2])
    
    ## [1] 0.1
    

    使用平均值填充:

    > iris.mis$imputed.1 <- with(iris.mis, impute(Sepal.Length, mean))
    

    使用随机值填充:

    > iris.mis$imputed.2 <- with(iris.mis, impute(Sepal.Length, "random"))
    
    > head(iris.mis,1)
    
    ## Sepal.Length Sepal.Width Petal.Length Petal.Width Species imputed.1 imputed.2
    ## 1           NA         3.5          1.4         0.2  setosa  5.836364       6.0
    
    > summary(iris.mis$Sepal.Length)
    
    ## Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
    ## 4.300   5.100   5.800   5.836   6.400   7.900      18 
    

    同样,还可以使用min,max,median来估算缺失值。

    aregImpute ()自动识别变量类型并相应地处理它们:

    > impute.arg <- aregImpute(~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width + 
    +     Species, data = iris.mis, n.impute = 6)
    
    > impute.arg
    
    ## 
    ## Multiple Imputation using Bootstrap and PMM
    ## 
    ## aregImpute(formula = ~Sepal.Length + Sepal.Width + Petal.Length + 
    ##     Petal.Width + Species, data = iris.mis, n.impute = 6)
    ## 
    ## n: 150   p: 5    Imputations: 6      nk: 3 
    ## 
    ## Number of NAs:
    ## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
    ##           14           14           19           13           15 
    ## 
    ##              type d.f.
    ## Sepal.Length    s    2
    ## Sepal.Width     s    2
    ## Petal.Length    s    2
    ## Petal.Width     s    2
    ## Species         c    2
    ## 
    ## Transformation of Target Variables Forced to be Linear
    ## 
    ## R-squares for Predicting Non-Missing Values for Each Variable
    ## Using Last Imputations of Predictors
    ## Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
    ##        0.897        0.754        0.980        0.956        0.991
    

    输出显示预测缺失值的 R2值, 数值越高,预测的数值越好。还可以使用以下命令查看估算值:

    > impute.arg$imputed$Sepal.Length
    
    ##     [,1] [,2] [,3] [,4] [,5] [,6]
    ## 12   4.9  5.0  5.1  4.9  5.1  4.9
    ## 24   4.7  5.2  5.0  5.3  5.0  5.2
    ## 34   5.1  4.8  5.7  5.4  5.2  5.6
    ## 37   4.6  5.0  5.3  4.5  5.1  5.0
    ## 39   4.4  5.0  4.8  5.0  4.4  4.4
    ## 56   6.4  5.8  5.9  6.1  5.6  5.7
    ## 57   6.4  6.3  6.5  6.3  6.4  6.7
    ## 80   5.8  5.4  5.5  5.2  5.1  5.1
    ## 90   5.5  5.8  5.6  5.8  5.8  5.8
    ## 92   6.7  6.3  6.5  6.3  6.0  6.6
    ## 98   5.7  6.4  6.3  5.6  6.0  6.0
    ## 115  7.0  6.7  6.5  5.4  5.7  6.5
    ## 148  6.7  6.3  7.0  6.3  6.4  6.1
    ## 150  5.7  6.3  6.3  6.8  5.8  6.9
    

    3、mice包

    > p_load(mice)
    > iris.mis2 <- missForest::prodNA(iris, noNA = 0.1)
    > iris.mis2 <- iris.mis2[, -5]
    > 
    > # 查看缺失值分布
    > mis.tab <- md.pattern(iris.mis2, rotate.names = T, plot = T)
    
    缺失值分布
    > mis.tab
    
    ##     Sepal.Length Petal.Width Sepal.Width Petal.Length   
    ## 100            1           1           1            1  0
    ## 12             1           1           1            0  1
    ## 14             1           1           0            1  1
    ## 1              1           1           0            0  2
    ## 10             1           0           1            1  1
    ## 2              1           0           1            0  2
    ## 1              1           0           0            1  2
    ## 6              0           1           1            1  1
    ## 3              0           1           1            0  2
    ## 1              0           0           1            1  2
    ##               10          14          16           18 58
    

    画个好看一点的图:

    > mice.plot <- VIM::aggr(iris.mis2, col = c("navyblue", "yellow"), 
    +     numbers = TRUE, sortVars = TRUE, 
    +     labels = names(iris.mis), cex.axis = 0.7, gap = 3, 
    +     ylab = c("Missing data", "Pattern"))
    
    缺失值分布
    ## 
    ##  Variables sorted by number of missings: 
    ##      Variable      Count
    ##  Petal.Length 0.12000000
    ##   Sepal.Width 0.10666667
    ##   Petal.Width 0.09333333
    ##  Sepal.Length 0.06666667
    

    估算缺失值:

    > impute.data <- mice(iris.mis2, 
    +                     # 生成的数据集数量
    +                     m=5, 
    +                     # 估算缺失值的迭代次数
    +                     maxit = 50, 
    +                     # 估算方法pmm,logreg,polyreg,polr
    +                     method = 'pmm', 
    +                     # 随机数种子
    +                     seed = 500)
    
    > summary(impute.data)
    
    ## Class: mids
    ## Number of multiple imputations:  5 
    ## Imputation methods:
    ## Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
    ##        "pmm"        "pmm"        "pmm"        "pmm" 
    ## PredictorMatrix:
    ##              Sepal.Length Sepal.Width Petal.Length Petal.Width
    ## Sepal.Length            0           1            1           1
    ## Sepal.Width             1           0            1           1
    ## Petal.Length            1           1            0           1
    ## Petal.Width             1           1            1           0
    

    pmm:预测均值匹配(PMM)-用于数值变量
    logreg: (Logit模型)-二元变量
    polyreg(Bayesian polytomous regression):因子变量(>=2个水平)
    polr:Proportional odds model(ordered, >= 2 levels)

    查看估算的缺失值

    > impute.data$imp$Sepal.Length
    
    ##       1   2   3   4   5
    ## 2   4.7 4.8 4.4 4.4 4.8
    ## 28  4.8 5.0 5.1 4.9 5.1
    ## 37  4.7 5.0 5.0 5.4 5.1
    ## 75  6.0 5.7 5.5 5.5 5.9
    ## 76  6.0 6.4 6.7 5.8 5.9
    ## 104 5.4 6.9 6.0 6.4 6.3
    ## 131 6.7 6.7 6.5 6.5 6.8
    ## 134 5.4 5.6 6.2 6.4 6.3
    ## 142 5.8 5.4 6.1 6.1 5.8
    ## 147 6.3 5.5 5.7 5.9 5.6
    

    由于生成有5个输入数据集,您可以使用 complete ()函数选择任何数据集:

    > complete.data <- complete(impute.data, 2)
    > dim(iris)
    
    ## [1] 150   5
    
    > dim(complete.data)
    
    ## [1] 150   4
    

    还可以使用5个数据集构建模型,最后将结果合并:

    > fit <- with(data = impute.data, expr = lm(Sepal.Width ~ Sepal.Length + Petal.Width))
    > combine <- pool(fit)
    > summary(combine)
    
    ##           term   estimate  std.error statistic       df      p.value
    ## 1  (Intercept)  1.9718135 0.33748673  5.842640 101.9862 6.184242e-08
    ## 2 Sepal.Length  0.2821694 0.06911890  4.082377 109.4387 8.504625e-05
    ## 3  Petal.Width -0.4655174 0.07232868 -6.436138 133.8076 2.017213e-09
    
    > # 选取其中一个估算数据集回归
    > fit2 <- with(data = complete(impute.data, 3), expr = lm(Sepal.Width ~ Sepal.Length + 
    +     Petal.Width))
    > summary(fit2)
    
    ## 
    ## Call:
    ## lm(formula = Sepal.Width ~ Sepal.Length + Petal.Width)
    ## 
    ## Residuals:
    ##      Min       1Q   Median       3Q      Max 
    ## -1.01692 -0.21227  0.01469  0.25813  1.00384 
    ## 
    ## Coefficients:
    ##              Estimate Std. Error t value Pr(>|t|)    
    ## (Intercept)   1.83945    0.32187   5.715 5.90e-08 ***
    ## Sepal.Length  0.30724    0.06633   4.632 7.91e-06 ***
    ## Petal.Width  -0.48635    0.07116  -6.835 2.04e-10 ***
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    ## 
    ## Residual standard error: 0.3888 on 147 degrees of freedom
    ## Multiple R-squared:  0.2505, Adjusted R-squared:  0.2403 
    ## F-statistic: 24.57 on 2 and 147 DF,  p-value: 6.228e-10
    
    > # 使用原始数据回归
    > fit3 <- with(data = iris, expr = lm(Sepal.Width ~ Sepal.Length + Petal.Width))
    > summary(fit3)
    
    ## 
    ## Call:
    ## lm(formula = Sepal.Width ~ Sepal.Length + Petal.Width)
    ## 
    ## Residuals:
    ##      Min       1Q   Median       3Q      Max 
    ## -0.99563 -0.24690 -0.00503  0.23354  1.01131 
    ## 
    ## Coefficients:
    ##              Estimate Std. Error t value Pr(>|t|)    
    ## (Intercept)   1.92632    0.32094   6.002 1.45e-08 ***
    ## Sepal.Length  0.28929    0.06605   4.380 2.24e-05 ***
    ## Petal.Width  -0.46641    0.07175  -6.501 1.17e-09 ***
    ## ---
    ## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
    ## 
    ## Residual standard error: 0.3841 on 147 degrees of freedom
    ## Multiple R-squared:  0.234,  Adjusted R-squared:  0.2236 
    ## F-statistic: 22.46 on 2 and 147 DF,  p-value: 3.091e-09
    

    对比一下:

    > df <- data.frame(fit.pool = combine$pooled$estimate, fit.2 = coef(fit2), fit = coef(fit3))
    > 
    > df
    
    ##                fit.pool      fit.2        fit
    ## (Intercept)   1.9718135  1.8394542  1.9263208
    ## Sepal.Length  0.2821694  0.3072358  0.2892867
    ## Petal.Width  -0.4655174 -0.4863496 -0.4664143
    

    使用生成的6个数据集合并后的回归系数与原始数据的回归系数还是非常接近的。

    相关文章

      网友评论

        本文标题:53-R语言中缺失值处理方法

        本文链接:https://www.haomeiwen.com/subject/xyfjyhtx.html