【问题标题】:Coding a simple loop for a sliding window [closed]为滑动窗口编写一个简单的循环[关闭]
【发布时间】:2019-12-19 02:15:55
【问题描述】:

我有以下问题。我有一个由 2659 次观察得出的时间序列。我需要在长度为 256 的滑动窗口上执行统计测试,并且每次我想从这些测试中提取 p 值并将它们收集到时间序列向量中。为了执行这个测试(运行测试),我想要一个与数据和滚动窗口一起移动的移动平均值作为阈值。这是我的尝试(在 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 停止,因为时间窗口每次都必须移动 256,因此第一个窗口从 1 到 256,第二个从 2 到 257……最后停止到 255+2404 = 2659. 我希望我把我的问题说清楚,我不明白为什么它不起作用。当然,我需要随着时间的推移绘制结果,以便在一段时间内绘制所有 p 值。我希望你能帮助我。

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

【问题讨论】:

  • 使用[i:(i+255)];测试:1:1+51:(1+5)

标签: r loops sliding-window


【解决方案1】:

对现有代码进行两次更改即可使其正常工作:

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 &lt;- rep(NA, length(x))

第二个变化是添加括号,即x[i:(i+255)]。如果您执行x[i:i+255],您将获得一个返回值x[i]

【讨论】:

    【解决方案2】:

    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))
    

    【讨论】:

    • 在我看来这是一个完美的答案,但我只有一个困惑:我们确定 mean(x) 计算的是滑动窗口平均值而不是整个数据集的平均值吗?
    • 参数对其函数是本地的,并覆盖函数外的任何同名对象。我已将 x 更改为 xx 以提供更多清晰度。
    猜你喜欢
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多