我有一个包含简单时间序列数据的向量(从 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
关于R - 时间序列的非线性滤波器 - 滤波器,重叠还是循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5135977/