以下数据表来自excel文件
Part A B C D E F G H I J K L
XXX 0 1 1 2 0 1 2 3 1 2 1 0
YYY 0 1 2 2 0 30 1 1 0 1 10 0
....
所以,我想显示那些包含逻辑
的异常值的部分[median – t * MAD, median + t * MAD]
那么如何使用R by by函数对大量数据进行编码呢?
答案 0 :(得分:0)
您可能希望根据中位数和MAD(绝对偏差的中位数)计算稳健的Z分数,而不是非稳健的标准均值和SD。然后使用Z评估您的数据,Z = 0表示中位数,Z = 1表示MAD输出等等。
假设我们有以下数据,其中一组是异常值:
df <- rbind( data.frame(tag='normal', res=rnorm(1000)*2.71), data.frame(tag='outlier', res=rnorm(20)*42))
然后Z:
df$z <- with(df, (res - median(res))/mad(res))
给了我们这样的东西:
> head(df)
tag res z
1 normal -3.097 -1.0532
2 normal -0.650 -0.1890
3 normal 1.200 0.4645
4 normal 1.866 0.6996
5 normal -6.280 -2.1774
6 normal 1.682 0.6346
然后将其切割成Z波段,例如
df$band <- cut(df$z, breaks=c(-99,-3,-1,1,3,99))
可以直接分析:
> addmargins(xtabs(~band+tag, df))
tag
band normal outlier Sum
(-99,-3] 1 9 10
(-3,-1] 137 0 137
(-1,1] 719 2 721
(1,3] 143 1 144
(3,99] 0 8 8
Sum 1000 20 1020
可以看出,显然,具有最大Zs(那些在(-99,-3)和(3,99)Z波段的那些是来自异常社区的那些)。