数据分析中缺失值处理

缺失值(NA)是一个非常常见的问题,特别是在大样本的研究中。与其删除整个被试的数据,不如试试插值的方法。本文简单介绍了几种缺失值处理的方法。

数据-Boston Housing

人为引入缺失值,这样就可以比较各种插值方法的结果和实际原始数据的差别。

data ("BostonHousing", package="mlbench")  # initialize the data  # load the data
original <- BostonHousing  # backup original data
# Introduce missing values
set.seed(100)
BostonHousing[sample(1:nrow(BostonHousing), 40), "rad"] <- NA
BostonHousing[sample(1:nrow(BostonHousing), 40), "ptratio"] <- NA
head(BostonHousing)
#>      crim zn indus chas   nox    rm  age    dis rad tax ptratio      b lstat medv
#> 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98 24.0
#> 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14 21.6
#> 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03 34.7
#> 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94 33.4
#> 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33 36.2
#> 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21 28.7

使用mice的md.pattern可以快速获得缺失值的统计

library(mice)
md.pattern(BostonHousing)  # pattern or missing values in data.
#>     crim zn indus chas nox rm age dis tax b lstat medv rad ptratio
#> 431    1  1     1    1   1  1   1   1   1 1     1    1   1       1  0
#>  35    1  1     1    1   1  1   1   1   1 1     1    1   0       1  1
#>  35    1  1     1    1   1  1   1   1   1 1     1    1   1       0  1
#>   5    1  1     1    1   1  1   1   1   1 1     1    1   0       0  2
#>        0  0     0    0   0  0   0   0   0 0     0    0  40      40 80

处理方法

1.删除样本

删除或在模型构建时不包括缺失值,例如通过设置na.action = na.omit)包含缺失值的样本(行)。

2.删除变量

如果某个变量包含过多缺失值并且删除该变量可以保存更多的样本,可以考虑删除该变量。

3.用均值/中位数/众数插值

最简单的方法,容易操作而且结果还不错。

library(Hmisc)
impute(BostonHousing$ptratio, mean)  # replace with mean
impute(BostonHousing$ptratio, median)  # median
impute(BostonHousing$ptratio, 20)  # replace specific number
# or if you want to impute manually
BostonHousing$ptratio[is.na(BostonHousing$ptratio)] <- mean(BostonHousing$ptratio, na.rm = T)  # not run
library(DMwR)
actuals <- original$ptratio[is.na(BostonHousing$ptratio)]
predicteds <- rep(mean(BostonHousing$ptratio, na.rm=T), length(actuals))
regr.eval(actuals, predicteds)
#>        mae        mse       rmse       mape
#> 1.62324034 4.19306071 2.04769644 0.09545664

4.模型插值

4.1. kNN插值

DMwR :: knnImputation使用k-Nearest Neighbours方法来插补缺失值。对于要插值的每个观测值,它基于欧氏距离确定“ k”个最接近的观测值,并计算这些“ k”个观测值的加权平均值(基于距离加权)。简单的理解就是找到最近的几个邻居,使用它们的数据进行插值。

优点:一次插值所有缺失值

缺点:无法处理factor类型的变量

注意:  计算kNN的时候不能包括响应变量(y)

library(DMwR)
knnOutput <- knnImputation(BostonHousing[, !names(BostonHousing) %in% "medv"])  # perform knn imputation.
anyNA(knnOutput)
#> FALSE
actuals <- original$ptratio[is.na(BostonHousing$ptratio)]
predicteds <- knnOutput[is.na(BostonHousing$ptratio), "ptratio"]
regr.eval(actuals, predicteds)
#>        mae        mse       rmse       mape
#> 1.00188715 1.97910183 1.40680554 0.05859526

相较于均值插补,平均绝对百分比误差(mape)提高了约39%

4.2 rpart

rpart和mice都可以处理factor的变量,在调用rpart()时设置method = class。对于numeric,使用method = anova。

注意: 同样的不能在不能在响应变量(例子中的medv)上训练rpart。

library(rpart)
class_mod <- rpart(rad ~ . - medv, data=BostonHousing[!is.na(BostonHousing$rad), ], method="class", na.action=na.omit)  # since rad is a factor
anova_mod <- rpart(ptratio ~ . - medv, data=BostonHousing[!is.na(BostonHousing$ptratio), ], method="anova", na.action=na.omit)  # since ptratio is numeric.
rad_pred <- predict(class_mod, BostonHousing[is.na(BostonHousing$rad), ])
ptratio_pred <- predict(anova_mod, BostonHousing[is.na(BostonHousing$ptratio), ])
actuals <- original$ptratio[is.na(BostonHousing$ptratio)]
predicteds <- ptratio_pred
regr.eval(actuals, predicteds)
#>        mae        mse       rmse       mape
#> 0.71061673 0.99693845 0.99846805 0.04099908

与knImputation相比,平均绝对百分比误差(mape)另外提高了约30%。

actuals <- original$rad[is.na(BostonHousing$rad)]
predicteds <- as.numeric(colnames(rad_pred)[apply(rad_pred, 1, which.max)])
mean(actuals != predicteds)  # compute misclass error.
#> 0.25

这会产生25%的误分类误差。

4.3. mice

Multivariate Imputation by Chained Equations

首先使用mice()构建模型,并使用complete()生成完成的数据。类似于sklearn里的fit + transform的操作。mice(df)函数可产生多组数据每组数据有对缺失数据的不同估算。complete()函数返回一个或多个这些数据集,默认为第一个。

library(mice)
miceMod <- mice(BostonHousing[, !names(BostonHousing) %in% "medv"], method="rf")  # perform mice imputation, based on random forests.
miceOutput <- complete(miceMod)  # generate the completed data.
anyNA(miceOutput)
#> FALSE
actuals <- original$ptratio[is.na(BostonHousing$ptratio)]
predicteds <- miceOutput[is.na(BostonHousing$ptratio), "ptratio"]
regr.eval(actuals, predicteds)
#>        mae        mse       rmse       mape
#> 0.36500000 0.78100000 0.88374204 0.02121326

与rpart相比,平均绝对百分比误差(mape)另外提高了〜48%

actuals <- original$rad[is.na(BostonHousing$rad)]
predicteds <- miceOutput[is.na(BostonHousing$rad), "rad"]
mean(actuals != predicteds)  # compute misclass error.
#> 0.15

错误分类错误减少到15%,与rpart的25%相比,是一个很大的进步。

来源

http://r-statistics.co/Missing-Value-Treatment-With-R.html


R |数据分析中缺失值处理相关推荐

  1. 数据分析中缺失值的处理方法

    1.缺失值的分类 按照数据缺失机制可分为: (1)   完全随机缺失(missing completely at random, MCAR) 所缺失的数据发生的概率既与已观察到的数据无关,也与未观察到 ...

  2. R语言数据分析笔记——t检验(含正态性检验和方差齐性检验在SPSS和R语言中的操作t检验(单样本、双独立样本、配对样本)在Excel、SPSS、R语言中的操作)

    前言:本文为个人学习笔记,为各大网站上的教学内容之综合整理,综合整理了①假设分析的基础知识.②正态性检验和方差齐性检验在SPSS和R语言中的操作.③t检验(单样本.双独立样本.配对样本)在Excel. ...

  3. R语言和Hadoop系统架构在大数据分析中的应用

    也许正在喝着咖啡的你,看着阳光从玻璃窗蹦进来,回忆近日的美好,惬意的享受这个"温暖"的暑假.而SupStat已经为你准备了一份暑期数据盛宴. R是什么?               ...

  4. 在R语言中进行缺失值填充:估算缺失值

    介绍 缺失值被认为是预测建模的首要障碍.因此,掌握克服这些问题的方法很重要.最近我们被客户要求撰写关于缺失值处理的研究报告,包括一些图形和统计输出. 估算缺失值的方法的选择在很大程度上影响了模型的预测 ...

  5. r语言中残差与回归值的残差图_R语言基础-数据分析及常见数据分析方法

    R表达式中常用的符号 残差(Residuals) 残差是真实值与预测值之间的差,五个分位的值越小模型越精确 系数项与截距项(Coefficients & Intercept)和P值指标 残差标 ...

  6. r语言中正定矩阵由于误差不正定_R语言之数据处理(一)

    在上一篇小文中,提到了关于R语言导入数据的一些方法,之后的重点就转向了数据的处理上.数据处理其实在整个数据分析项目中所占用的时间是比较多的,所以根据处理的目的不同,也有不同的处理方法.在R语言中,我通 ...

  7. 数据分析中的统计概率_了解统计和概率:成为专家数据科学家

    数据分析中的统计概率 Data Science is a hot topic nowadays. Organizations consider data scientists to be the Cr ...

  8. 如何利用R语言处理 缺失值 数据

    主要用到VIM和mice包 [plain]  view plain  copy install.packages(c("VIM","mice")) 1.处理缺失 ...

  9. 数据分析之缺失值填充(重点讲解多重插值法Miceforest)

    数据分析之缺失值填充(重点讲解多重插值法Miceforest) 数据分析的第一步--数据预处理,不可缺失的一步.为了得到更好的结果,选择合适的数据处理方法是非常重要的! 数据预处理之缺失值填充 在大数 ...

最新文章

  1. object的实例是 python_Python:type、object、class与内置类型实例
  2. JQuery选择器中的子元素选择器
  3. 在c++代码中关闭和启动另外一个pid进程号,共享内存数据使用
  4. Qt窗口部件——QFrame/QAbstractButton/QLineEdit/QAbstractSpinBox/QAbstractSlider
  5. RHEL7忘记密码:修改root密码
  6. 【Alpha】第八次Scrum meeting
  7. 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
  8. 常用的非线性激励函数
  9. 攻防世界 logmein(重温,重点在于怎么写出脚本)
  10. 1038: 绝对值最大
  11. 如何获取手机的屏幕尺寸
  12. 数据结构期末考试错点汇总
  13. mysql索引与md5_MySQL理解索引、添加索引的原则
  14. 增强型MOS管工作相关问题
  15. SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)
  16. Eigen::常用操作[转]
  17. 【修真院PM小课】什么是消息推送?
  18. 编程乐趣--汉字转拼音
  19. 吴军的《态度》读后感整理
  20. tradeblazer mysql_干货 | 用tradeblazer实现海龟交易法则(附代码)

热门文章

  1. android调用系统相机返回图片模糊
  2. android轮播图简单实现(左右无限滑动,自动轮播)
  3. 销毁一颗二叉树--Destroy(Node* root)
  4. win10系统开机出现grub,一步进入window系统
  5. php开源会员信息系统,poscms会员详情
  6. 是不是不知道用什么命令查看mac系统信息?
  7. 永恒之蓝漏洞攻击完整步骤
  8. mysql中signed是什么类型_mysql|unsigned 与 signed 类型
  9. matlab求梯度的原理,matlab 梯度计算原理
  10. LED数码管段码生成