2011-02-27 108 views
4

我有一个包含简单的时间序列数据(从deSolve矩阵中提取)的载体,其用于测试目的可以是:R - 时间序列的非线性滤波器 - 滤波器,低通滤波器还是回路?

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

并想

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

应用非线性滤波器的所有除了第一个和最后一个元素之外的矢量的元素,因为过滤器不能应用于这两个元素(例如,当术语满足第一个元素或术语满足最后一个元素时)。这就是我的问题。

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

是循环唯一的选择?

感谢您的帮助, 凯里

回答

4

可与循环做,或申请或矢量。

> 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 
+1

您更好地为初始化[R全长:r < - rep(NA,length(x)) – 2011-02-28 15:56:50

3

1)在动物园包尝试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