【问题标题】:R - nonlinear filter to a time series - filter, lapply or loop?R - 时间序列的非线性滤波器 - 滤波器,lapply还是循环?
【发布时间】:2011-07-05 09:24:51
【问题描述】:

我有一个包含简单时间序列数据的向量(从 deSolve 矩阵中提取),用于测试目的可以是:

x <- c(1, 2, 3, 4, 5)

并且想应用非线性滤波器

x[n]*x[n]-x[n-1]*x[n+1]

除第一个和最后一个元素之外的向量的所有元素,因为过滤器不能应用于这两个元素(例如,当x[n-1] 术语遇到第一个元素或x[n+1] 术语遇到最后一个元素时)。这就是我的问题。

我尝试过的事情: 1) filter() 命令需要一个线性滤波器(即,没有滤波器系数的乘法)。 2) lapply() 要求该函数适用于列表的所有元素。

循环是唯​​一的选择吗?

感谢您的帮助, 凯莉

【问题讨论】:

    标签: r filter time-series


    【解决方案1】:

    1) 在 zoo 包中尝试rollapply

    > library(zoo)
    > rollapply(zoo(1:5), 3, function(x) x[2] * x[2] - x[1] * x[3])
    2 3 4 
    1 1 1 
    

    coredata(z) 给出数据部分,即c(1, 1, 1)time(z) 给出时间部分,即c(2, 3, 4)

    2) 在动物园做的另一种方法是:

    > z <- zoo(1:5)
    > z*z - lag(z) * lag(z,-1)
    2 3 4 
    1 1 1
    

    3) 最后一种方法也适用于 R 核心中的 ts 类:

    > tt <- ts(1:5)
    > tt * tt - lag(tt) * lag(tt, -1)
    Time Series:
    Start = 2 
    End = 4 
    Frequency = 1 
    [1] 1 1 1
    

    【讨论】:

      【解决方案2】:

      可以通过循环或应用或矢量化来实现。

      > x <- c(1, 2, 3, 4, 5)
      > r <- NA
      > for (n in 2:length(x)) r[n] <- x[n]*x[n]-x[n-1]*x[n+1]
      > (r)
      [1] NA  1  1  1 NA
      > 
      > r <- NA
      > lapply(2:length(x),function(n) r[n] <<- x[n]*x[n]-x[n-1]*x[n+1])
      [[1]]
      [1] 1
      
      [[2]]
      [1] 1
      
      [[3]]
      [1] 1
      
      [[4]]
      [1] NA
      
      > (r)
      [1] NA  1  1  1 NA
      
      > r <- NA
      > r <- x^2 - c(NA,x[1:(length(x)-1)]) * c(x[2:length(x)],NA)
      > (r)
      [1] NA  1  1  1 NA
      

      矢量化是最有效的,但代码更难破译

      > x <- runif(50000)
      > 
      > r <- NA
      > system.time(for (n in 2:length(x)) r[n] <- x[n]*x[n]-x[n-1]*x[n+1])
         user  system elapsed 
         8.55    0.01    8.58 
      > 
      > r <- NA
      > system.time(lapply(2:length(x),function(n) r[n] <<- x[n]*x[n]-x[n-1]*x[n+1]))
         user  system elapsed 
        11.36    0.00   11.39 
      > 
      > r <- NA
      > system.time(r <- x^2 - c(NA,x[1:(length(x)-1)]) * c(x[2:length(x)],NA))
         user  system elapsed 
         0.01    0.00    0.01 
      

      【讨论】:

      • 你最好初始化 R 的完整长度:r
      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2022-01-13
      • 1970-01-01
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2017-09-06
      相关资源
      最近更新 更多