哦,走开,你这个可恶的离群值
2020-12-04 本文已影响0人
小洁忘了怎么分身
1.离群值是啥子
这个帖子里有张图,画得非常清楚:https://www.jianshu.com/p/ec3802b490ed
2.如何找出离群值
大概搜了一下,找到了好多种办法,其中有一个基于箱线图的,一看就爱了
2.1先画个热图看看
一个正常的热图长这样:
rm(list = ls())
library(pheatmap)
set.seed(10086)
n = matrix(rnorm(80),nrow = 5)
pheatmap(n)
一个有离群值的热图长这样:
n2 = n
n2[1,2:3] = n2[1,2:3] +7
pheatmap(n2)
2.2箱线图会画出离群值
直接拿矩阵画图,那就一列是一个箱线,那么图上的离群值就是每一列的离群值;也可以拿全部数据来画,图上的离群值就是全部数据的离群值咯
boxplot(n2)
boxplot(as.numeric(n2))
2.3明确找出离群值是哪几个
箱线图里藏着答案:找整个矩阵的和每一列的离群值,都可以。
boxplot(n2,plot = F)$out
## [1] -2.744959 7.254794 9.105554 -1.023663 2.171476 -2.003527 1.595089
## [8] -2.264267 1.432397 -1.627069 1.074236 -1.580355
outlier = boxplot(as.numeric(n2),plot = F)$out;outlier
## [1] -2.744959 7.254794 9.105554 2.491033
3.知道谁是离群值,能让热图活起来
在这一篇里,我们已经知道可以用breaks参数来设置热图颜色分配范围。
可以计算除了离群值之外的最大最小值,将这两个值作为颜色分配范围;这样,离群值只会被标记成最深的颜色,不会影响其他数据的颜色分配了。
r = range(n[! n %in% outlier]);r
## [1] -2.264267 2.171476
pheatmap(n,breaks = seq(r[1],r[2],length.out = 100))
也可以给range的值取个整,作为颜色分配范围;再调一调,也没问题。
r2 = c(floor(r[1]),ceiling(r[2]))
pheatmap(n,breaks = seq(r2[1],r2[2],length.out = 100))