【发布时间】:2015-07-03 07:15:57
【问题描述】:
我有一个矩阵,其中每一行都是来自分布的样本。我想使用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包中。 -
你是对的!我正在使用 KernSmooth,但不适用于此功能——我正在使用它来生成分布。我会编辑。
标签: r optimization rollapply