我有一个矩阵,其中每一行是从分布中抽取的样本。我想使用ks.test
进行分布的滚动比较,并在每种情况下保存测试统计量。从概念上实现这个最简单的方式是通过循环:
set.seed(1942)
mt <- rbind(rnorm(5), rnorm(5), rnorm(5), rnorm(5))
results <- matrix(as.numeric(rep(NA, nrow(mt))))
for (i in 2 : nrow(mt)) {
results[i] <- ks.test(x = mt[i - 1, ], y = mt[i, ])$statistic
}
然而,我的真实数据有大约400列和300,000行的单个示例,而且我有很多这样的示例。因此,我想让它变快一些。Kolmogorov-Smirnov检验在数学上并不是很复杂,所以如果答案是“用
Rcpp
实现它”,那么我会勉强接受,但我会感到有些惊讶——在R中,对于单个对,计算速度已经非常快了。我尝试过的方法,但无法使其正常工作:
dplyr
使用rowwise/do/lag
、zoo
使用rollapply
(这是我用来生成分布的方法),以及在循环中填充data.table
(编辑:这个方法可以运行,但仍然很慢)。
KernSmooth
包?ks.test
函数在stats
包中。 - davechilders