哦,走开,你这个可恶的离群值

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))
上一篇下一篇

猜你喜欢

热点阅读