加载并查看数据基本情况

library(VIM)

data(sleep)

str(sleep)

summary(sleep)

head(sleep)

一、处理缺失值

查看NA的分布情况,有一个直观了解

library('mice')

md.pattern(sleep)

matrixplot(sleep)

NA分布情况

根据NA的分布情况,获取数据子集

#统计每一列NA的数量

na_flag

# na_flag % .[nrow(.),-ncol(.)]#同上

library('dplyr')

#获取含有NA的列和不含NA的列

na_col = na_flag[na_flag > 0] %>% names()

full_col = setdiff(names(sleep),na_col)

# fill_col = names(sleep)[!(names(sleep) %in% na_col)]同上

# 获取所有含有NA的行

na_df = sleep[!complete.cases(sleep),]

#获取所有不含NA的行

full_df = na.omit(sleep)

#fill_df = sleep[complete.cases(sleep),]同上

#对变量进行重新排序

sleep = sleep[,c(na_col,full_col)]

1. 删除法

当缺失值占比不大时,直接删除缺失部分是最简单的办法

1.1 针对特定变量删除NA

sleep_del_Gest = sleep[!is.na(sleep$Gest),]

md.pattern(sleep_del_Gest)

对特定变量删除NA后

1.2 删除所有含NA的行

sleep_del_all = na.omit(sleep)

# sleep_del_all = sleep[complete.cases(sleep),]#同上

md.pattern(sleep_del_all)

删除所有NA

1.3 观察变化前后变量之间的相关性

library(PerformanceAnalytics)

chart.Correlation(sleep,histogram = T)

chart.Correlation(sleep_del_all,histogram = T)

删除前变量相关性

删除后变量相关性

2. 插补法

若缺失值占比过大,直接删除会损失大量的信息。这种情况应该对缺失值进行填补。

若属性是连续的,则使用该属性存在值的均值去插补缺失值;

若属性是离散的,则可取该属性的众数来插补缺失值。

2.1. 使用均值,中值等针对某一个变量填值

#观察数据分布情况

NonD_var = c(var = 'NonD',

mean = mean(sleep$NonD,na.rm = T),

median = median(sleep$NonD,na.rm = T),

quantile(sleep$NonD,c(0,0.01,0.1,0.25,0.5,0.75,0.9,1),na.rm = T),

max = max(sleep$NonD,na.rm = T),

missing = sum(is.na(sleep$NonD)))

View(t(NonD_var))

变量NonD数据分布情况

#简单可视化

op

hist(sleep$NonD,freq = F,col = 'lightblue',main = 'Befor')

#使用该变量现有数据的均值替换缺失值

library('Hmisc')

sleep$NonD = impute(sleep$NonD, fun = mean)#impute(x,2.5), impute(x,mean), impute(x,"random")

hist(NonD,freq = F,col = 'pink',main = 'After')

填值前后变量NonD数据分布变化

2.2. 基于kmeans均值算法填值

只适用于数值型缺失

####重新加载原始数据并对变量进行排序

data("sleep",package = 'VIM')

sleep = sleep[,c(na_col,full_col)]

library('DMwR')

#以距离最近的3个值根据距离进行加权平均来填值

sleep_fill_knn = knnImputation(sleep, k = 10, meth = 'weighAvg')

md.pattern(sleep_fill_knn)

sleep_fill_knn = sleep_fill_knn[,names(sleep)]

#观察变换前后数据的分布情况

op

for(fct in na_col){

hist(sleep[,fct],col = 'lightblue',freq = F,xlab = fct,main = 'Befor')

hist(sleep_fill_knn[,fct],col = 'pink',freq = F,xlab = fct,main = 'After')

}

par(op)

均值填值前后各变量数据分布情况

#观察变换前后变量间的相关性

library(PerformanceAnalytics)

chart.Correlation(sleep,histogram = T)

chart.Correlation(sleep_fill_knn,histogram = T)

before_knnImputation

after_knnImputation

2.3. 基于回归算法填值

f = as.formula(paste(paste(na_col,collapse = ' + '),'~',paste(fill_col,collapse = ' + ')))

sleep_fill_reg = regressionImp(f,data = sleep)

#这里的formular = y ~ .,y是response variable,即要插补的变量。

#我这里使用了所有包含NA的变量来对所有不含NA的变量进行回归,有些极端,仅供参考。

sleep_fill_reg = sleep_fill_reg[,names(sleep)]

md.pattern(sleep_fill_reg)

#观察变换前后数据的分布情况,变量间的相关性

library(PerformanceAnalytics)

chart.Correlation(sleep,histogram = T)

chart.Correlation(sleep_fill_reg,histogram = T)

befor_regressionImp

after_regressionImp

2.4. 基于随机森林替换

if(!require('randomForest'))(

install.packages('randomForest')

)

sleep_fill_rf = rfImpute(Danger ~ .,sleep)

sleep_fill_rf = sleep_fill_rf[,names(sleep)]

#观察变换前后数据的分布情况,变量间的相关性

library(PerformanceAnalytics)

chart.Correlation(sleep,histogram = T)

chart.Correlation(sleep_fill_rf,histogram = T)

befor_rf

after_rf

二、处理异常值

1.1 单变量异常值检测

lb = c('ggplot2','reshape2','dplyr')

lapply(lb,require,character.only = T)

boxplot(sleep_fill_rf,frame = T)

sleep_fill_rf %>% melt() %>%

ggplot(aes(NULL,value)) +

geom_boxplot(aes(fill = variable)) +

facet_wrap(variable ~. , scales = 'free_y')

sigular_boxplot

sigular_ggboxplot

1.2 盖帽法处理异常值

#采用盖帽法,用10%处的数据覆盖分布在10%以下的数据,用90%处的数据覆盖分布在99%以上的数据。

#这里的10%和90%取值有些极端,及供参考。

block

if(lower){

q1

x[x<=q1]

}

if(upper){

q99

x[x>q99]

}

return(x)

}

sleep_fill_rf_blk = sapply(sleep_fill_rf,block)

boxplot(sleep_fill_rf_blk,frame = T)

after_block

r语言插补法_R语言之缺失值和异常值处理相关推荐

  1. r语言插补法_R语言用多重插补法估算相对风险

    在这里,我将用R中的一个小模拟示例进行说明.首先,我们使用X1和X2双变量法线和Y模拟大型数据集,其中Y遵循给定X1和X2的逻辑模型. 首先,我们模拟一个非常大的完整数据集: #simulate完整数 ...

  2. python均值插补法填补缺失值_R语言笔记(四):特殊值处理

    输入数据后,我们就能在 R 中对数据进行一系列的操作了.但现实获得的第一手数据往往都是不完整.不整齐的,比如存在数据本身缺失值.离群值,数据框存在冗余行或列,抑或数据需要进一步加工才能获取有意义的变量 ...

  3. 数据预处理 第3篇:数据预处理(使用插补法处理缺失值)

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  4. python 线性回归回归 缺失值 忽略_机器学习 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  5. python预处理缺失值_数据预处理 第3篇:数据预处理(使用插补法处理缺失值)...

    插补法可以在一定程度上减少偏差,常用的插补法是热卡插补.拟合插补和多重插补.拟合插补,要求变量间存在强的相关性:多重插补(MCMC法),是在高缺失率下的首选插补方法,优点是考虑了缺失值的不确定性. 一 ...

  6. 回归插补法_用均值替换、 回归插补及多重插补进行插补

    ##设置工作空间 #把"数据及程序" 文件夹复制到F盘下, 再用setwd设置工作空间 setwd("F: /数据及程序/chapter4/示例程序") #读取 ...

  7. 回归插补法_没有完美的数据插补法,只有最适合的

    数据缺失是数据科学家在处理数据时经常遇到的问题,本文作者基于不同的情境提供了相应的数据插补解决办法.没有完美的数据插补法,但总有一款更适合当下情况. 我在数据清理与探索性分析中遇到的最常见问题之一就是 ...

  8. DDA插补算法C语言,DDA直线插补算法在单片机上的实现基于C.doc

    DDA直线插补算法在单片机上的实现基于C /*-------------------------------*/ /*时间2011年11月*/ /*功能:DDA 插补算法在单片机上实现*/ /*作者J ...

  9. c程序设计语言如何补零,C语言程序设计(补)-中国大学mooc-题库零氪

    第1章 概述 第1讲 C语言概述随堂测验 1.C语言是面向过程的语言. 第2讲 C语言基本语法成分随堂测验 1.C语言也被称作函数语言. 第3讲 C语言环境介绍随堂测验 1.C常用的环境包括: A.V ...

  10. r语言逻辑向量相加_R语言基础教程——第3章:数据结构——向量

    如果学过像JAVA或者C这样的高级语言,都知道,数据类型的概念,包括,整数型.浮点型.字符串.布尔类型.这些语言中,定义变量需要定义数据类型,而在R中不需要.只需要直接赋值即可.在给变量赋值时,R中可 ...

最新文章

  1. 二叉树层序遍历递归与非递归_总结归纳:二叉树遍历【递归 amp;amp; 非递归】...
  2. 自动驾驶汽车想成为主流?先过了这十二关再说
  3. linux自动锁屏命令_如何冻结和锁定你的Linux系统?
  4. 为什么美国财媒IBD力推网易为第1强股?
  5. ORACLE数据库在导入导出时序列不一致的问题
  6. 【转载】dotnet 线程同步
  7. java 间隔分钟_java 计算两个 日期时间 相间隔多少天小时分钟 等
  8. neo4j︱Cypher 查询语言简单案例(二)
  9. 第二次课动手动脑的问题以及课后实验性的问题
  10. Oracle学习技巧
  11. CAD的菜单栏消失,如何再次调出来
  12. tomcat中的日志配置
  13. 三大条件致病菌|大肠埃希氏菌、血链球菌、李斯特菌
  14. python的环境问题相关
  15. 图像特征提取(纹理特征)
  16. c++虚函数详解(你肯定懂了)
  17. 5500xt挖矿算力_(视频)静态计算 RTX 3080 的以太坊挖矿回本周期 白露矿业报告 (20.09.19)...
  18. h3c路由器和三层交换机之间连接配置
  19. 分享适合女生做的六个兼职项目,在家做副业,看看有没有你感兴趣的
  20. [附源码]计算机毕业设计Python基于微信小程序的网络办公系统(程序+源码+LW文档)

热门文章

  1. 二极管主要特性及伏安特性曲线
  2. 驭电之道-用示波器测量二极管伏安特性曲线 模电实验 示波器 波形
  3. CDR 制作“决战高考”海报
  4. B站的热门视频要怎么同时批量下载保存到本地电脑中
  5. 2018中原工学院网络安全校赛
  6. (第九章)UI--PS 基础 通道抠图
  7. uniapp 地址转换经纬度
  8. python写Bicubic方法,跑数据集Set5和Set14,保存PSNR和SSIM的值
  9. match函数的用法
  10. 问题记录:linux权限不足(Permission denied)