我想将Grubbs测试重复应用于一组数据,直到不再发现异常值为止。我希望标记而不是离群值,以便可以将数据绘制为直方图,而离群值具有不同的颜色。我已使用离群值软件包中的grubbs.test手动识别离群值,但无法弄清楚如何循环遍历并成功标记它们。我想要的输出类似于以下内容:
X Outlier
152.36 Yes
130.38 Yes
101.54 No
96.26 No
88.03 No
85.66 No
83.62 No
76.53 No
74.36 No
73.87 No
73.36 No
73.35 No
68.26 No
65.25 No
63.68 No
63.05 No
57.53 No
最佳答案
看起来您需要一个简短的函数才能执行所需的操作:
library(outliers)
library(ggplot2)
X <- c(152.36,130.38,101.54,96.26,88.03,85.66,83.62,76.53,
74.36,73.87,73.36,73.35,68.26,65.25,63.68,63.05,57.53)
grubbs.flag <- function(x) {
outliers <- NULL
test <- x
grubbs.result <- grubbs.test(test)
pv <- grubbs.result$p.value
while(pv < 0.05) {
outliers <- c(outliers,as.numeric(strsplit(grubbs.result$alternative," ")[[1]][3]))
test <- x[!x %in% outliers]
grubbs.result <- grubbs.test(test)
pv <- grubbs.result$p.value
}
return(data.frame(X=x,Outlier=(x %in% outliers)))
}
这是输出:
grubbs.flag(X)
X Outlier
1 152.36 TRUE
2 130.38 TRUE
3 101.54 FALSE
4 96.26 FALSE
5 88.03 FALSE
6 85.66 FALSE
7 83.62 FALSE
8 76.53 FALSE
9 74.36 FALSE
10 73.87 FALSE
11 73.36 FALSE
12 73.35 FALSE
13 68.26 FALSE
14 65.25 FALSE
15 63.68 FALSE
16 63.05 FALSE
17 57.53 FALSE
如果要使用不同颜色的直方图,则可以使用以下方法:
ggplot(grubbs.flag(X),aes(x=X,color=Outlier,fill=Outlier))+
geom_histogram(binwidth=diff(range(X))/30)+
theme_bw()
关于r - 如何重复进行Grubbs测试并标记异常值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22837099/