【问题标题】:How to calculate product of lags for an arbitrary number of lags in R (dplyr)如何计算 R 中任意数量滞后的滞后乘积(dplyr)
【发布时间】:2017-08-21 14:26:04
【问题描述】:

这可能是一个非常基本的问题,但我似乎没有让它正常工作。我需要计算一个元素的简单乘积及其在时间序列数据的 R data.frame 中的一定数量的滞后。我试图在dplyr 管道中实现这一点。例如:

require(dplyr)

df <- data.frame(YEAR = c(2010, 2011, 2012, 2013, 2014),
                 x = c(1, 2, 3, 4, 5))

dfFinal <- df %>% mutate(prodLag1 = prod(x, lag(x, 1), na.rm = T),
                         prodLag2 = prod(x, lag(x, 1), lag(x, 2), na.rm = T),
                         prodLag3 = prod(x, lag(x, 1), lag(x, 2), lag(x, 3), na.rm = T))

结果不是我想的那样。例如。使用 prodLag1 生成的数据框应如下所示:

dfFinal <- data.frame(YEAR = c(2010, 2011, 2012, 2013, 2014),
                      x = c(1, 2, 3, 4, 5),
                      prodLag1 = c(NA, 2, 6, 12, 20))

此外,我的目标是 lag = 10,我想找到比仅输入每个 lag 更可行的方法。Reduce 可以解决这个问题吗?

【问题讨论】:

  • df %&gt;% mutate(x*lag(x)) ?
  • prod将向量x的所有元素相乘,所以prodLag1xlag(x)全部相乘,即1*2*3*4*5*1 *2*3*4=2880。只需使用* 将向量逐个元素相乘。
  • 谢谢!当然。我仍然需要考虑如何进行序列化。
  • cumprod 可能有用 - 那么prodLagN 将是cumprod(x)/lag(cumprod(x),N+1)。如果是大数据框,最好使用cumsum(log(x))prodLagN = exp(cumsum(log(x))-lag(cumsum(log(x)),N+1)) 或类似的东西

标签: r dataframe dplyr


【解决方案1】:

prodLag10 的一种方法...

dfFinal <- df %>% mutate(cumlog = cumsum(log(x)),
                         prodLag10 = exp(cumlog-lag(cumlog,11)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多