Rollapply 在 R 中扩展 window
Rollapply with expanding window in R
假设我在 R 中有一个简单的玩具矢量,例如:
x = seq(1:10);x
[1] 1 2 3 4 5 6 7 8 9 10
我想使用 zoo 包中的 rollapply 函数,但在不同的 way.Rollapply 中,从向量 x 中计算一个函数,其宽度参数是一个滚动 window.I 想要而不是滚动 expanding.There 是类似的问题 here and here 但他们没有帮助我解决我的问题。
例如,我想计算向量 x 的第一个观测值的总和,然后将 window 扩展 2。
我这样做了:
rollapplyr(x, seq_along(x) ,sum,by=2,partial = 5,fill=NA)
[1] NA NA NA NA 15 21 28 36 45 55
或替换 NA 的
na.locf0(rollapplyr(x, 5 ,sum,by=2,partial = 5,fill=NA))
[1] NA NA NA NA 15 15 25 25 35 35
但我理想中想要的结果是:
[1] NA NA NA NA 15 15 28 28 45 45
假设我的数据集很大(包含 2500 个时间序列观测值)并且函数是一些计量经济学统计模型,而不是像我在这里使用的求和那样简单的模型。
我该怎么做?有帮助吗?
x <- seq(10)
expandapply <- function(x, start, by, FUN){
# set points to apply function up to
checkpoints <- seq(start, length(x), by)
# apply function to all windows
vals <- sapply(checkpoints, function(i) FUN(x[seq(i)]))
# fill in numeric vector at these points (assumes output is numeric)
out <- replace(rep(NA_real_, length(x)), checkpoints, vals)
# forward-fill the gaps
zoo::na.locf(out, na.rm = FALSE)
}
expandapply(x, start = 5, by = 2, FUN = sum)
#> [1] NA NA NA NA 15 15 28 28 45 45
由 reprex package (v2.0.1)
于 2022-03-13 创建
定义nonNA
为不应该为NA的位置。您可以将 x 和 nonNA
更改为您需要的任何值。
然后为 w 分配一个宽度向量,使用零表示那些要为 NA 的分量。最后申请na.locf0.
(两种极端情况是,如果 nonNA
是 seq_along(x)
,那么所有元素都不会被 NA 输出,那么这与 rollapplyr(x, seq_along(x), sum)
相同,如果 nonNA
是 c()
所以没有 non-NAs 那么它 returns 都是 NA。)
library(zoo)
x <- 1:10
nonNA <- seq(5, length(x), 2)
w <- ifelse(seq_along(x) %in% nonNA, seq_along(x), 0)
na.locf0(rollapplyr(x, w, function(x) if (length(x)) sum(x) else NA, fill=NA))
## [1] NA NA NA NA 15 15 28 28 45 45
另一种方法是为 rollapply
的 width=
参数使用一个列表,其组件包含偏移量。 x
和nonNA
来自上面。
L <- lapply(seq_along(x), function(x) if (x %in% nonNA) -seq(x-1, 0))
na.locf0(rollapplyr(x, L, sum, fill = NA))
## [1] NA NA NA NA 15 15 28 28 45 45
更新
简化了解决方案并添加了第二种方法。
假设我在 R 中有一个简单的玩具矢量,例如:
x = seq(1:10);x
[1] 1 2 3 4 5 6 7 8 9 10
我想使用 zoo 包中的 rollapply 函数,但在不同的 way.Rollapply 中,从向量 x 中计算一个函数,其宽度参数是一个滚动 window.I 想要而不是滚动 expanding.There 是类似的问题 here and here 但他们没有帮助我解决我的问题。
例如,我想计算向量 x 的第一个观测值的总和,然后将 window 扩展 2。
我这样做了:
rollapplyr(x, seq_along(x) ,sum,by=2,partial = 5,fill=NA)
[1] NA NA NA NA 15 21 28 36 45 55
或替换 NA 的
na.locf0(rollapplyr(x, 5 ,sum,by=2,partial = 5,fill=NA))
[1] NA NA NA NA 15 15 25 25 35 35
但我理想中想要的结果是:
[1] NA NA NA NA 15 15 28 28 45 45
假设我的数据集很大(包含 2500 个时间序列观测值)并且函数是一些计量经济学统计模型,而不是像我在这里使用的求和那样简单的模型。
我该怎么做?有帮助吗?
x <- seq(10)
expandapply <- function(x, start, by, FUN){
# set points to apply function up to
checkpoints <- seq(start, length(x), by)
# apply function to all windows
vals <- sapply(checkpoints, function(i) FUN(x[seq(i)]))
# fill in numeric vector at these points (assumes output is numeric)
out <- replace(rep(NA_real_, length(x)), checkpoints, vals)
# forward-fill the gaps
zoo::na.locf(out, na.rm = FALSE)
}
expandapply(x, start = 5, by = 2, FUN = sum)
#> [1] NA NA NA NA 15 15 28 28 45 45
由 reprex package (v2.0.1)
于 2022-03-13 创建定义nonNA
为不应该为NA的位置。您可以将 x 和 nonNA
更改为您需要的任何值。
然后为 w 分配一个宽度向量,使用零表示那些要为 NA 的分量。最后申请na.locf0.
(两种极端情况是,如果 nonNA
是 seq_along(x)
,那么所有元素都不会被 NA 输出,那么这与 rollapplyr(x, seq_along(x), sum)
相同,如果 nonNA
是 c()
所以没有 non-NAs 那么它 returns 都是 NA。)
library(zoo)
x <- 1:10
nonNA <- seq(5, length(x), 2)
w <- ifelse(seq_along(x) %in% nonNA, seq_along(x), 0)
na.locf0(rollapplyr(x, w, function(x) if (length(x)) sum(x) else NA, fill=NA))
## [1] NA NA NA NA 15 15 28 28 45 45
另一种方法是为 rollapply
的 width=
参数使用一个列表,其组件包含偏移量。 x
和nonNA
来自上面。
L <- lapply(seq_along(x), function(x) if (x %in% nonNA) -seq(x-1, 0))
na.locf0(rollapplyr(x, L, sum, fill = NA))
## [1] NA NA NA NA 15 15 28 28 45 45
更新
简化了解决方案并添加了第二种方法。