使用 rollapply 输出到列表列表
Using rollapply to output to lists of lists
我想使用 rollapply 或 rollapplyr 将 modwt 函数应用于我的时间序列数据。
我熟悉 rollapply/r 的工作原理,但我需要一些帮助来设置输出,以便我可以在使用 rollapply 时正确存储我的结果。
waveslim 包中的 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 的全长时间序列,但我希望使用 rollapply 将其应用于 30 的小滚动 window。
我已经尝试过以下方法,但输出是一个大矩阵,我无法轻易识别哪些值属于 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" ...
我如何设置一个变量,使其存储 (200-30)+1 个列表,其中包含每个尺度 d1、d2、d3 和 d4 的列表?
对于可重现的示例,请使用以下内容:
library(waveslim)
data(ar1)
ar1.modwt <- modwt(ar1, "la8", 4)
定义调用 modwt 的 modwt2,获取前 4 个组件并将它们串成一个数字向量。然后将 rollapplyr
与 rollr
一起使用,其中 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 x 4 x 171 的数组,则以下内容会将其简化为 3d 数组:
simplify2array(L)
或作为列表的列表:
lapply(L, function(x) as.list(as.data.frame(x)))
2) 这是一个替代解决方案,直接使用 lapply
和 returns 一个列表,每个组件都是由 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)。
我想使用 rollapply 或 rollapplyr 将 modwt 函数应用于我的时间序列数据。
我熟悉 rollapply/r 的工作原理,但我需要一些帮助来设置输出,以便我可以在使用 rollapply 时正确存储我的结果。
waveslim 包中的 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 的全长时间序列,但我希望使用 rollapply 将其应用于 30 的小滚动 window。
我已经尝试过以下方法,但输出是一个大矩阵,我无法轻易识别哪些值属于 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" ...
我如何设置一个变量,使其存储 (200-30)+1 个列表,其中包含每个尺度 d1、d2、d3 和 d4 的列表?
对于可重现的示例,请使用以下内容:
library(waveslim)
data(ar1)
ar1.modwt <- modwt(ar1, "la8", 4)
定义调用 modwt 的 modwt2,获取前 4 个组件并将它们串成一个数字向量。然后将 rollapplyr
与 rollr
一起使用,其中 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 x 4 x 171 的数组,则以下内容会将其简化为 3d 数组:
simplify2array(L)
或作为列表的列表:
lapply(L, function(x) as.list(as.data.frame(x)))
2) 这是一个替代解决方案,直接使用 lapply
和 returns 一个列表,每个组件都是由 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)。