首页 > 解决方案 > 迭代计算 - 矢量化

问题描述

我试图找到一种方法如何在 R 中实现一个相当简单的东西。我有一个可以按多个变量分组的输入表。基本上,我想要的是根据这个方程计算一列

y[n+1] = ( 1 + a[n] ) * y[n] + b[n]

ab是已知的,初始y[1]. 我试图做这样的事情

table %>% mutate(y = cumsum(y + lag(y*a + b,default = 0)))

(y、a、b 是表中的列)但它不起作用 - 主要问题是 y 和 a 列之间的乘法。我试图让它与reduce函数一起工作,但因为我需要两列(a,b)作为计算参数,所以它不起作用。我想将此代码包含在管道中。否则,我将设置一个 for 循环以使其正常工作,但我认为必须有一种方法可以以一种不错的矢量化方式执行此类操作。

谢谢。

标签: rdplyr

解决方案


鉴于:

y[n+1] = ( 1 + a[n] ) * y[n] + b[n]

table %>% 
  mutate(y = (1 + lag(a)) * lag(y) + lag(b))

或更明确地只是为了更加确定操作顺序

table %>% 
  mutate(y = ((1 + lag(a)) * lag(y)) + lag(b))

请注意,第一个值将是 NA,因为 (1 + NA) * NA + NA = NA

使用 y[n] 覆盖 y[n+1] 应该没有任何问题,但万一你有 y 问题,你可以这样做:

table %>% 
  mutate(y1 = (1 + lag(a)) * lag(y) + lag(b))

更新

我注意到我可能误解了可用的输入信息。如果只有 y 的第一个值可用,则需要使用不同的方法。不可能使用滞后,因为我们没有预先填充的向量(所有初始 y 值都可用)。然后我们只需要做一个“快速”循环。

# If you only have y[1] and no other Y then you can't really do this as a
# vector operation because there is no complete initial vector. 
# Use a fast loop by declaring memory one time only before the loop
table$y <- NA_real_ # initialize all the memory for y column at one time
table$y[1] <- init_y_val # set the initial value of y
for(idx in 2:nrow(table)){
  table$y[idx] <- ((1 + a[idx - 1]) * y[idx -1]) + b[idx -1]
}

推荐阅读