2011-02-27 113 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