为滑动编写一个简单的循环 window

Coding a simple loop for a sliding window

我有以下问题。我有一个由 2659 次观察得出的时间序列。我需要对长度为 256 的滑动 window 执行统计测试,每次我想从这些测试中提取 p 值并将它们收集到时间序列向量中。要执行此测试(运行测试),我想要一个随数据和滚动 window 一起移动的移动平均线作为阈值。这是我的尝试(在 R 中)

x<- ts(rnorm(2659, mean = 0.0001, sd = 0.0001))
library(randtests)
for(i in 1:2404){

     runs  <- runs.test(x[i:i+255], threshold = mean(x[i:i+255]))
     ret[i] <- runs$p.value 

}

索引从1开始到2404停止,因为时间window每次必须移动256,所以第一个window从1到256,第二个从2到257。 .. 最后停到 255+2404 = 2659。我希望我说清楚我的问题,我不明白为什么它不起作用。当然,我需要随着时间的推移绘制结果,以便绘制随时间变化的所有 p 值。我希望你能帮助我。

PS: 如果你提出一个例子,请设置种子,以便我可以重现你的结果。

对现有代码进行两处更改应该可以使其正常工作:

set.seed(0)
x <- ts(rnorm(2659, mean = 0.0001, sd = 0.0001))
library(randtests)
ret <- rep(NA, length(x))
for(i in 1:2404){
    runs  <- runs.test(x[i:(i+255)], threshold = mean(x[i:(i+255)]))
    ret[i] <- runs$p.value
}

第一个更改是在循环之前初始化 ret 变量。 ret <- rep(NA, length(x))

第二个变化是添加括号,即x[i:(i+255)]。如果你这样做 x[i:i+255],你将得到一个 return 值,x[i]

rollapplyr 与指示的函数一起使用。

library(zoo)
pv <- function(xx) runs.test(xx, threshold = mean(xx))$p.value
out <- rollapplyr(x, 256, pv, fill = NA)

备注

library(randtests)
set.seed(123)
x <- ts(rnorm(2659, mean = 0.0001, sd = 0.0001))