R语言-异常数据处理2
在R中进行基于稳健马氏距离的异常检验
前言
我们研究的数据中经常包含着一些不同寻常的样本,这称之为异常值(Outlier)。这些异常值会极大的影响回归或分类的效果。异常值产生的原因有很多,其中可能是人为错误、数据测量误差,或者是实际确实存在这样的异常。为了使模型能够反映大部分数据的规律,所以在数据预处理阶段要进行异常值检测,为下一步分析奠定基础。还有一类情况是,当研究人员希望发现不平凡的事物时,异常值检测本身就是分析的首要目的。例如在信用卡欺诈、计算机入侵检测等问题中。此时由于样本的不平衡性,导致一般的分类方法无法使用,必须转而考虑异常检测方法。
一种常用的异常检验思路是观察各样本点到样本中心的距离。如果某些样本点的距离太大,就可以判断是异常值。这里距离的度量一般使用马氏距离(Mahalanobis Distance)。因为马氏距离不受量纲的影响,而且在多元条件下,马氏距离还考虑了变量之间的相关性,这使得它优于欧氏距离。
但是传统的马氏距离检测方法是不稳定的,因为个别异常值会把均值向量和协方差矩阵向自己方向吸引,这样算出来的样本马氏距离起不了检测异常值的所用。所以首先要利用迭代的思想构造一个稳健的均值和协方差矩阵估计量,然后计算稳健马氏距离(Robust Mahalanobis Distance)。这样使得异常值能够正确地被识别出来。
在mvoutlier包中提供了基于稳健马氏距离的异常值检验方法。我们首先构造一个二维变量的人工数据,其中80个样本是标准正态分布,另一小撮别有用心的样本是均值为5,标准差为1的观测值。我们首先使用uni.plot函数在一维空间中观察这个数据。
library(mvoutlier)set.seed(1234)x <- cbind(rnorm(80), rnorm(80))y <- cbind(rnorm(10, 5, 1), rnorm(10, 5, 1))z <- rbind(x,y)# 一维数据的异常检验res1 <- uni.plot(z)# 返回异常值的编号which(res1$outliers==T)################################> library(mvoutlier)> set.seed(1234)> x <- cbind(rnorm(80), rnorm(80))> y <- cbind(rnorm(10, 5, 1), rnorm(10, 5, 1))> z <- rbind(x,y)> # 一维数据的异常检验> res1 <- uni.plot(z)> # 返回异常值的编号> which(res1$outliers==T)[1] 20 62 81 82 83 84 85 86 87 88 89 90
上图中红色点表示疑似异常值,因为它偏离均值太远。更多时候我们会处理多元异常检测问题,此时用aq.plot函数来实行基于稳健马氏距离的异常值检验方法。下图中左上角图形为原始数据,右上角图形的X轴为各样本的稳健马氏距离排序,Y轴为距离的经验分布,红色曲线为卡方分布,蓝色垂线表示阀值,在阀值右侧的样本判断为异常值。左下和右下两张图均是用不同颜色来表示异常值,只是阀值略有不同。可以观察到那一小撮异常值被正确的判断出来,但也有两个正常值被误判为异常值,此时需要调整参数。
# 基于稳健马氏距离的多元异常值检验res2 <-aq.plot(z)# 返回异常值的编号which(res2$outliers==T)################################> res2 <-aq.plot(z)> which(res2$outliers==T)[1] 20 62 81 82 83 84 85 86 87 88 89 90
如果数据的维数过高,例如基因数据那样几千个变量,数据之间变得稀疏,从而使得距离不再有很大意义。此时可以融合主成分降维的思路来进行异常值检验。mvoutlier包中提供了pcout函数来进行高维空间异常检验。下面是以swiss数据集为例来判断异常值。
# 在高维空间中的异常值检验data(swiss)res3 <- pcout(swiss)# 返回异常值的编号which(res3$wfinal01==0)################################> # 在高维空间中的异常值检验> data(swiss)> res3 <- pcout(swiss)> # 返回异常值的编号> which(res3$wfinal01==0)Delemont Franches-Mnt Porrentruy Broye Glane 2 3 6 7 8 Gruyere Sarine Veveyse La Vallee Conthey 9 10 11 19 31 Entremont Herens Martigwy Monthey St Maurice 32 33 34 35 36 Sierre Sion V. De Geneve 37 38 45
参考资料
R语言:处理异常值1
R语言:处理异常值2
转载于:https://www.cnblogs.com/cloudtj/articles/5520230.html
R语言-异常数据处理2相关推荐
- R语言-异常数据处理3
R语言-异常数据处理3 参考文章: (1)R语言-异常数据处理3 (2)https://www.cnblogs.com/cloudtj/articles/5520450.html (3)https:/ ...
- R语言空间数据处理(part2)--空间数据读写
学习笔记,仅供参考 学习书目:<R语言空间数据处理与分析实践教程>–卢宾宾; 准备工作 设置工作路径,并导包 workL = "F:/MyStudio/Rstudio/RSpac ...
- R语言空间数据处理(part1)--基础数据操作与处理
学习笔记,仅供参考 学习书目:<R语言空间数据处理与分析实践教程>–卢宾宾; 基础数据操作与处理 设置工作路径,并导入包 workL = "F:/MyStudio/Rstudio ...
- R 语言在数据处理上的禀赋之——独特的数据类型
R 语言天生就有数据处理的禀赋,有很重要的一个原因是R有他自己独特的数据类型. 为啥这样说呢? Java中的数据类型 先来看看其他传统编程语言中的数据类型是啥样子.拿java来说,java语言中有基本 ...
- [R语言基础]——数据处理实例
[R语言基础]--数据处理实例 前言 问题 Step1:建立数据框 Step2:计算综合得分 Step3:对学生进行评分 Step4:根据姓氏和名字排序 完整代码 前言 之前我们已经学习了R对数据预处 ...
- R语言之数据处理常用包
dplyr包是Hadley Wickham的新作,主要用于数据清洗和整理,该包专注dataframe数据格式,从而大幅提高了数据处理速度,并且提供了与其它数据库的接口:tidyr包的作者是Hadley ...
- R语言︱噪声数据处理、数据分组——分箱法(离散化、等级化)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 分箱法在实际案例操作过程中较为常见,能够将一些 ...
- R语言tidyverse数据处理建模案例
管道%>% 左连接left_join() 筛选行 filter(条件) 行排序arrange() 选择列select() 修改(计算)列mutate() 分组汇总group_by().%> ...
- R语言微博数据处理(2)
昨天完成了对@User的匹配,今天阅读了<30分钟学习正则表达式>,终于把#Hashtags#的匹配完成了. #拿到所有的hashtag x <- c("#第六期学术人生# ...
最新文章
- linux 调试利器gdb, strace, pstack, pstree, lsof
- Leetcode 95. 不同的二叉搜索树 II 解题思路及C++实现
- Codeforces 987A. Infinity Gauntlet(手速题,map存一下输出即可)
- JDBC连接MySQL数据库代码模板
- 猫哥教你写爬虫 004--数据类型转换-小练习
- HDU 2186--
- Can't connect to X11 window server using 'localhos
- 东鹏特饮占据市场第二的背后:数据让我们比谁都了解消费者!
- 残差网络resnet网络原理详解
- Oracle 日历表详解(含节假日)
- 台式计算机强制关机,台式机如何强制关机
- 企业提供下载链接的安全解决方案
- slurm任务管理相关命令
- Java poi读取Excel表格中公式的计算值
- 11 Animation动画
- Excel数值函数(3):对“自动筛选”的结果求和、平均值、极值等
- linux下文件损坏怎么删除 No such file or directory
- mysql 启动 pid update_MySql服务器启动错误“服务器退出而不更新PID文件”
- 2022年来了,从Python定制一份日历开始吧!
- ocp认证考试报名_OCP最新报名考证流程