R |数据分析中缺失值处理
数据分析中缺失值处理
缺失值(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) 完全随机缺失(missing completely at random, MCAR) 所缺失的数据发生的概率既与已观察到的数据无关,也与未观察到 ...
- R语言数据分析笔记——t检验(含正态性检验和方差齐性检验在SPSS和R语言中的操作t检验(单样本、双独立样本、配对样本)在Excel、SPSS、R语言中的操作)
前言:本文为个人学习笔记,为各大网站上的教学内容之综合整理,综合整理了①假设分析的基础知识.②正态性检验和方差齐性检验在SPSS和R语言中的操作.③t检验(单样本.双独立样本.配对样本)在Excel. ...
- R语言和Hadoop系统架构在大数据分析中的应用
也许正在喝着咖啡的你,看着阳光从玻璃窗蹦进来,回忆近日的美好,惬意的享受这个"温暖"的暑假.而SupStat已经为你准备了一份暑期数据盛宴. R是什么? ...
- 在R语言中进行缺失值填充:估算缺失值
介绍 缺失值被认为是预测建模的首要障碍.因此,掌握克服这些问题的方法很重要.最近我们被客户要求撰写关于缺失值处理的研究报告,包括一些图形和统计输出. 估算缺失值的方法的选择在很大程度上影响了模型的预测 ...
- r语言中残差与回归值的残差图_R语言基础-数据分析及常见数据分析方法
R表达式中常用的符号 残差(Residuals) 残差是真实值与预测值之间的差,五个分位的值越小模型越精确 系数项与截距项(Coefficients & Intercept)和P值指标 残差标 ...
- r语言中正定矩阵由于误差不正定_R语言之数据处理(一)
在上一篇小文中,提到了关于R语言导入数据的一些方法,之后的重点就转向了数据的处理上.数据处理其实在整个数据分析项目中所占用的时间是比较多的,所以根据处理的目的不同,也有不同的处理方法.在R语言中,我通 ...
- 数据分析中的统计概率_了解统计和概率:成为专家数据科学家
数据分析中的统计概率 Data Science is a hot topic nowadays. Organizations consider data scientists to be the Cr ...
- 如何利用R语言处理 缺失值 数据
主要用到VIM和mice包 [plain] view plain copy install.packages(c("VIM","mice")) 1.处理缺失 ...
- 数据分析之缺失值填充(重点讲解多重插值法Miceforest)
数据分析之缺失值填充(重点讲解多重插值法Miceforest) 数据分析的第一步--数据预处理,不可缺失的一步.为了得到更好的结果,选择合适的数据处理方法是非常重要的! 数据预处理之缺失值填充 在大数 ...
最新文章
- object的实例是 python_Python:type、object、class与内置类型实例
- JQuery选择器中的子元素选择器
- 在c++代码中关闭和启动另外一个pid进程号,共享内存数据使用
- Qt窗口部件——QFrame/QAbstractButton/QLineEdit/QAbstractSpinBox/QAbstractSlider
- RHEL7忘记密码:修改root密码
- 【Alpha】第八次Scrum meeting
- 区块链Hyperledger Fabric背书过程中链码是并行还是串行?
- 常用的非线性激励函数
- 攻防世界 logmein(重温,重点在于怎么写出脚本)
- 1038: 绝对值最大
- 如何获取手机的屏幕尺寸
- 数据结构期末考试错点汇总
- mysql索引与md5_MySQL理解索引、添加索引的原则
- 增强型MOS管工作相关问题
- SPI的模拟应用——OLED以及时钟模块的应用(一)SPI协议介绍及利用协议实现两机通信(51单片机)
- Eigen::常用操作[转]
- 【修真院PM小课】什么是消息推送?
- 编程乐趣--汉字转拼音
- 吴军的《态度》读后感整理
- tradeblazer mysql_干货 | 用tradeblazer实现海龟交易法则(附代码)