R 将xts行前置到子集

R 将xts行前置到子集,r,xts,R,Xts,假设我需要对存储在xts对象中的一批市场数据应用MA(5)。我可以使用xts子集进行平滑处理: x['2013-12-05 17:00:01/2013-12-06 17:00:00'] 然而,在我的子集中的第一个之前,我需要额外的5个观察值来“初始化”过滤器。有没有一个简单的方法可以做到这一点 我唯一能弄明白的是非常难看的行数(这里使用的是xts示例数据): NAs这是我的问题。我想重新计算每周数据的权重,并将这些新权重应用到下一周。冲洗,重复。在现实生活中,我用一些带有行索引的丑陋的东西来替

假设我需要对存储在xts对象中的一批市场数据应用MA(5)。我可以使用xts子集进行平滑处理:

x['2013-12-05 17:00:01/2013-12-06 17:00:00']
然而,在我的子集中的第一个之前,我需要额外的5个观察值来“初始化”过滤器。有没有一个简单的方法可以做到这一点

我唯一能弄明白的是非常难看的行数(这里使用的是xts示例数据):

NAs
这是我的问题。我想重新计算每周数据的权重,并将这些新权重应用到下一周。冲洗,重复。在现实生活中,我用一些带有行索引的丑陋的东西来替换
lappy
,但我相信有更好的方法


为了清楚地定义问题,这似乎是希望在非重叠时间段(本例中为周)上运行分析,但需要重叠数据时间段(本例中为2周)来执行计算之间的冲突。

这里有一种方法可以使用
端点和for循环来实现这一点。您仍然可以在我的评论中使用
which.i=TRUE
建议,但整数子集设置更快

y <- x*NA                   # pre-allocate result
ep <- endpoints(x,"weeks")  # time points where parameters change

set.seed(1.23456789)
for(i in seq_along(ep)[-(1:2)]) {
  rng1 <- ep[i-1]:ep[i]          # obs to calc weights
  rng2 <- ep[i-2]:ep[i]          # "prime" obs
  wgts <- calc_weights(x[rng1])
  # calc smooth_days on rng2, but only keep rng1 results
  y[rng1] <- smooth_days(x[rng2], wgts)[index(x[rng1])]
}

y这里有一种使用
endpoints
和for循环的方法。您仍然可以在我的评论中使用
which.i=TRUE
建议,但整数子集设置更快

y <- x*NA                   # pre-allocate result
ep <- endpoints(x,"weeks")  # time points where parameters change

set.seed(1.23456789)
for(i in seq_along(ep)[-(1:2)]) {
  rng1 <- ep[i-1]:ep[i]          # obs to calc weights
  rng2 <- ep[i-2]:ep[i]          # "prime" obs
  wgts <- calc_weights(x[rng1])
  # calc smooth_days on rng2, but only keep rng1 results
  y[rng1] <- smooth_days(x[rng2], wgts)[index(x[rng1])]
}

y您的用例不清楚。你能提供一份你真正想要做的事情的清单吗?您可以使用
which.i
arg来
[.xts
ans
哪一个。我
正是我想知道的。我相信你是对的,有更好的方法,但至少这给了我牵引力。如果你把那条评论作为一个答案,我会接受。即使有约书亚的评论,我仍然不确定。你的意思是说你的数据来自2013年1月1日,你的问题是你的硕士(15)1月1日至1月14日的数据没有生成?如果您确实有12月15日至12月31日的数据,只需将其预先添加到
x
,进行MA计算,然后将其删除。如果您没有该数据,则很难理解。另一种解释更不寻常:您希望为每个MA(15)批次预先添加一组额外的15个观察值吗?(如果试图在SMA和EMA之间做些什么,我几乎可以理解你为什么要这么做……)大家注意:将讨论示例从MA(15)改为MA(5),并进行了相应的编辑。它使示例权重矩阵变小。您的用例不清楚。能否提供您实际尝试执行的操作的详细信息?您可以使用
which.i
arg to
[.xts
ans
哪一个。我
正是我想知道的。我相信你是对的,有更好的方法,但至少这给了我牵引力。如果你把那条评论作为一个答案,我会接受。即使有约书亚的评论,我仍然不确定。你的意思是说你的数据来自2013年1月1日,你的问题是你的硕士(15)1月1日至1月14日的数据没有生成?如果您确实有12月15日至12月31日的数据,只需将其预先添加到
x
,进行MA计算,然后将其删除。如果您没有该数据,则很难理解。另一种解释更不寻常:您希望为每个MA(15)批次预先添加一组额外的15个观察值吗?(如果试图在SMA和EMA之间做些什么,我几乎可以理解你为什么要这么做……)所有人注意:将讨论示例从MA(15)更改为MA(5),并进行相应编辑。这使示例权重矩阵更小。将滚动窗口问题分解为“输入”窗口和“输出”窗口是一个很好的解决方案。而
for
循环构造使得使用
foreach
重新构造变得很容易,这很好,因为我有一大堆这样的东西要运行。谢谢!将滚动窗口问题分解为“输入”窗口和“输出”窗口是一个很好的解决方案。而
for
循环结构使得使用
foreach
重新构造变得很容易,这很好,因为我有一大堆要运行。谢谢!
[[26]]
                [,1]
2007-06-25        NA
2007-06-26        NA
2007-06-27        NA
2007-06-28        NA
2007-06-29 -9.581503
2007-06-30 -9.581208
y <- x*NA                   # pre-allocate result
ep <- endpoints(x,"weeks")  # time points where parameters change

set.seed(1.23456789)
for(i in seq_along(ep)[-(1:2)]) {
  rng1 <- ep[i-1]:ep[i]          # obs to calc weights
  rng2 <- ep[i-2]:ep[i]          # "prime" obs
  wgts <- calc_weights(x[rng1])
  # calc smooth_days on rng2, but only keep rng1 results
  y[rng1] <- smooth_days(x[rng2], wgts)[index(x[rng1])]
}