R – 非线性滤波器到时间序列 – 滤波器,lapply还是循环?

我有一个包含简单时间序列数据的向量(从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()要求该函数适用于列表的所有元素.

循环是唯一的选择吗?

谢谢你的帮助,
凯里

可以使用循环或应用或矢量化.

> 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
相关文章
相关标签/搜索