R - 时间序列的非线性滤波器 - 滤波器,重叠还是循环?

标签 r filter time-series

我有一个包含简单时间序列数据的向量(从 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/

相关文章:

python - 过滤Python字典的键以查找列表中的所有项目

HTML5 拖放 - 在 Safari 中检测文件夹(FileList、File)

python - 如何并排绘制 statsmodels 时间序列图并在 Python 中自定义 x 轴

r - 如何使用 R 格子 xyplot 根据数值阈值对点进行着色

r - R 中字符串位置的频率

R:有条件地删除重复行

r - 如何在ARIMA预测模型中指定newxreg?

R 使用which()条件获得正确的索引

java - 找不到过滤器类

R : Tick data adding value when tick data is missing