2017-08-12 8 views
1

rollapplyまたはrollapplyrを使用して、時系列データにmodwt関数を適用したいと考えています。rollapplyを使用してリストのリストに出力する

私はrollapply/rの仕組みに精通していますが、出力を設定してrollapplyを使用して結果を正しく保存できるように助けが必要です。

wavelimパッケージのmodwt関数は、私の特定の問題J = 4のために時系列をとり、それをJレベルに分解します。これは、私が5つのリストに格納された1つの時系列から4セットの係数を持つことを意味します。このリストのうち、私はd1、d2、d3にのみ関係しています& d4。

私は長さ200の全長の時系列に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関数の出力が見えます30のrollapplyを使用しています。

Iはすでに以下を試みたが、出力が大きい行列であり、Iは、簡単、D2がD1と属する値は識別できない、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私はスケールをd1、d2、d3、d4のそれぞれに対してリスト内の(200-30)+1リストを格納するように変数を設定できますか?再現性のある例えば

は以下を使用してください:

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

答えて

3

はmodwtを呼び出すmodwt2を定義し、最初の4つの成分を取り、数値ベクトルに取り出して文字列が含まれます。次に、を与えるrollapplyrを使用し、rollrの各行はmodwt2を1回呼び出した結果です。最後に、これらの行列の、別々のマトリックスに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

1つの質問が関連しているときに別の質問を参照するのは普通ですので、これは確かに問題ありません。 –

+0

この質問で助けてくれてありがとう、私はあなたと同じくらいRに堪能だったらいいと思う。私は別の質問[ここ](https://stackoverflow.com/questions/45673142/wavelet-correlation-using-rolling-window-in-r)を作成しました。そして、私は本当にそれについていくつかの助けが必要なので、私は300賞金のためのポイント。私はあなたがそれを見ているかどうかはわかりませんが、もしできれば、私はとても感謝しています。賞金は23時間後に始まります。 – TheGoat

関連する問題