【发布时间】:2021-09-11 12:42:15
【问题描述】:
我正在管理一个股票每日数据集。这是示例代码:
A <- cumsum(rnorm(200))
Date <- Sys.Date() + cumsum(sample(1:5, 200, replace = TRUE)) # unequaly spaced time series
data<-data.frame(Date,A)
data<-data%>%
mutate(Year_Month=as.yearmon(Date))
我的目标是计算一个名为 B 的新月度变量。它是根据以月结束的 12 个月期间的每日数据 A 计算的平均值。 例如,2021-07-03 属于 2021 年 7 月,我需要设置过去 12 个月的窗口,从 2020 年 7 月到 2021 年 6 月,并使用此窗口内的所有每日数据 A 计算平均值。 因此,对于 [2021-07-03,2021-07-31],结果 B 是相同的。
我尝试使用rollapply 和runner 函数,但困难在于窗口不是恒定的,因为每个月的天数不是恒定的。我想在 dplyr 上下文中实现这个目标。
预期的示例输出如下所示:
Date Year_Month A B
2021-07-03 July 2021 3.3 2.3
2021-07-08 July 2021 1.5 2.3
2021-07-11 July 2021 4.3 2.3
...
2021-08-04 Aug 2021 2.2 3.2
2021-08-07 Aug 2021 5.7 3.2
2021-08-09 Aug 2021 4.2 3.2
我的新数据集是一个纯时间序列,每月有 348 次观察:
Date A
2021-07-01 3.1
2021-08-01 4.5
2021-09-01 5.5
...
2021-10-01 4.4
2021-11-01 2.4
2021-12-01 5.5
我通过在以月份结束的 60 个月的滚动窗口上做 AR(2) 模型来计算冲击。第 n+1 个月的冲击是该系列的实际值与其预测值(残差)之间的差,使用过去 60 个月估计的斜率系数。
我正在编写一个函数并在滑块中调用它。
AR_2<-function(x){
arima(x,order=c(1,0,0))$residuals
}
MILIQ_unexpected<-MILIQ%>%
mutate(Shock= slide_index_dbl(A, Date, AR_2, .before = months(60), .after = months(-1), .complete = T))
我收到以下错误:
Problem with `mutate()` input `B`.
x In iteration 61, the result of `.f` had size 59, not 1.
i Input `B` is `slide_index_dbl(...)`.
Backtrace:
1. `%>%`(...)
11. slider:::stop_not_all_size_one(61L, 59L)
12. slider:::glubort("In iteration {iteration}, the result of `.f` had size {size}, not 1.")
【问题讨论】:
-
我使用
slider包来执行此操作:davisvaughan.github.io/slider。您可能想检查一下。 -
你又犯错了。对于滚动计算,即根据先前的 n 个变量(大小为 n 的向量)为每个日期分配一个值,您需要一个返回标量(大小为 1 的向量)的函数,例如均值,总和等,因此是rollmean,rollsum等。但是
arima(rnorm(50), order = c(1,0,0))$residuals返回一个长度为50的向量。因此,除非您进一步总结,否则如何将大小为n> 1的向量分配给单个值。想一想,你的问题就迎刃而解了。 -
这样想,
rollingsum或cumsum可能有,rolling-cumsum没有。
标签: r rolling-computation