我有一个数据框(df)如下:
V V1 V2 V3
1 A B 32
1 A C 33
1 A E 43
1 A F 22
1 A T 53
1 A N 54
1 C T 44
1 C G 11
1 C N 31
1 C D 53
1 C U 75
1 A T 53
1 A N 54
2 C T 42
2 C G 14
2 C N 35
2 C D 23
2 C U 56
想要做什么我想得到(V,V1)的每个组合的离群值,这很容易用我的代码实现。
d <- as.data.table(df)
# Add a column to keep track of row numbers
d[, c('row'):= list(seq_len(nrow(d)))]
# For each group (combination of V and V1), perform the outlier test
outliers <- d[, chisq.out.test(V3), list(V, V1)]
主要问题是这个函数会为(V,V1
)的每个组合返回一个带有p值的异常值。我需要的基本上是所有异常值以及它们的p值,即每个异常值(V,V1
)或者换句话说,来自V2
的所有候选者以及它们作为异常值的p值到(V,V1
)。
任何想法如何更改我的代码才能做到这一点?
答案 0 :(得分:1)
我认为这可行。 dropout
函数将执行迭代循环以测试异常值。对于传入的每个元素,如果元素不是异常值,它将返回1,否则它将返回p值&lt; .05用于异常值测试。
library(outliers)
dropout<-function(x) {
if(length(x)<2) return (1)
vals <- rep.int(1, length(x))
r <- chisq.out.test(x)
while (r$p.value<.05 & sum(vals==1)>2) {
if (grepl("lowest", r$alternative)) {
d <- which.min(ifelse(vals==1,x, NA))
} else {
d <- which.max(ifelse(vals==1, x, NA))
}
vals[d] <- r$p.value
r <- chisq.out.test(x[vals==1])
}
vals
}
有了这个帮助函数,我们现在可以将它应用于由V
,V1
定义的每个子组。为此,我们使用ave
函数。
with(dd, ave(V3, V1, V2, FUN = dropout))
在给出chisq.out.test
异常值定义的情况下,您的样本数据似乎在任何子组中都没有异常值。
考虑到一般情况下对于异常值的休息问题以及多个测试问题,这个迭代过程肯定没有统计意义。不过,这个讨论是针对https://stats.stackexchange.com/的,在这里我们只关注代码。