2017-08-12 95 views
1

我想使用rollapply或rollapplyr將modwt函數應用於我的時間序列數據。使用rollapply輸出到列表清單

我很熟悉rollapply/r是如何工作的,但我需要一些幫助來設置輸出,以便在使用rollapply時能夠正確存儲我的結果。

波浪邊緣包中的modwt函數需要一個時間序列並將其分解爲J個等級,對於我的特殊問題J = 4,這意味着我將從我的單個時間序列中存儲4個系列集合,存儲在5個列表中。在這個列表中,我只關心d1,d2,d3 & d4。

的MODWT函數的輸出如下所示

> str(ar1.modwt) 
List of 5 
$ d1: num [1:200] -0.223 -0.12 0.438 -0.275 0.21 ... 
$ d2: num [1:200] 0.1848 -0.4699 -1.183 -0.9698 -0.0937 ... 
$ d3: num [1:200] 0.5912 0.6997 0.5416 0.0742 -0.4989 ... 
$ d4: num [1:200] 1.78 1.86 1.85 1.78 1.65 ... 
$ s4: num [1:200] 4.64 4.42 4.19 3.94 3.71 ... 
- attr(*, "class")= chr "modwt" 
- attr(*, "wavelet")= chr "la8" 
- attr(*, "boundary")= chr "periodic" 

在上面的例子我已經應用了MODWT功能全長時間序列長度200,但我希望將它應用到一個小軋製窗口30使用rollapply。

我已經嘗試以下但輸出是一個大的矩陣,我無法容易地識別哪個值屬於D1,D2,D3或D4

roller <- rollapplyr(ar1, 30,FUN=modwt,wf="la8",n.levels=4,boundary="periodic") 

的這個輸出是與所述大矩陣結構如下:

> str(roller) 
List of 855 
$ : num [1:30] 0.117 -0.138 0.199 -1.267 1.872 ... 
$ : num [1:30] -0.171 0.453 -0.504 -0.189 0.849 ... 
$ : num [1:30] 0.438 -0.3868 0.1618 -0.0973 -0.0247 ... 
$ : num [1:30] -0.418 0.407 0.639 -2.013 1.349 ... 

...很多省略的行...

$ : num [1:30] 0.307 -0.658 -0.105 1.128 -0.978 ... 
    [list output truncated] 
- attr(*, "dim")= int [1:2] 171 5 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:5] "d1" "d2" "d3" "d4" ... 

^h ow我可以設置一個變量,以便爲每個標度d1,d2,d3和d4存儲帶有列表的(200-30)+1列表嗎?

對於重複的例子,請使用以下:

library(waveslim) 
data(ar1) 
ar1.modwt <- modwt(ar1, "la8", 4) 

回答

3

定義modwt2它調用MODWT,取第一部件4和字符串出來成數值向量。然後使用rollapplyrrollr,其中rollr的每一行是對modwt2的一次調用的結果。最後,重塑的rollr每一行到一個單獨的基質和創建列表,L,那些矩陣:

modwt2 <- function(...) unlist(head(modwt(...), 4)) 
rollr <- rollapplyr(ar1, 30, FUN = modwt2, wf = "la8", n.levels = 4, boundary = "periodic") 
L <- lapply(1:nrow(rollr), function(i) matrix(rollr[i,], , 4)) 

如果30×4×171陣列被期望,則以下將它簡化成3D陣列:

simplify2array(L) 

或作爲一個列表的列表:

lapply(L, function(x) as.list(as.data.frame(x))) 

2)這是一個替代的解決方案第直接使用lapply並返回一個列表,其中的每個組件都是由d1,d2,d3和d4組成的列表。

lapply(1:(200-30+1), function(i, ...) head(modwt(ar1[seq(i, length = 30)], ...), 4), 
    wf = "la8", n.levels = 4, boundary = "periodic") 

更新:代碼的改進,擴大(1),並添加(2)。

+0

你介意如果我在一個基於這個答案的新問題中引用這個問題嗎?我對此深有體會,唯一能達到我需要的地方就是將問題分解成更易於管理的部分。 – TheGoat

+1

一個問題引用另一個問題是相當正常的,因爲這肯定會很好。 –

+0

感謝您對這個問題的幫助,我希望自己像R一樣熟練。我創建了另一個問題[在這裏](https://stackoverflow.com/questions/45673142/wavelet-correlation-using-rolling-window-in-r),我真的需要一些幫助,所以我打算把300指出一個賞金。我不知道你是否看過它,但如果你能,我會非常感激。賞金在23小時內開始。 – TheGoat