【问题标题】:How to get the difference between next and previous row in an R time series?如何获得 R 时间序列中下一行和上一行之间的差异?
【发布时间】:2016-04-27 16:21:13
【问题描述】:

我有一个相当大的时间序列,包括对 4 个变量(datexyz)的大约 14k 次观察。

我如何才能(与计算当前值 (t) 与前一个值 (t-1) 之间的差值的函数 diff( df$vector, lag = 1) 相反)为每个值计算下一个值之间的差值 ( t+1) 和之前的值 (t-1)?

【问题讨论】:

    标签: r time-series diff difference


    【解决方案1】:

    所以,要理解请求...生成一些数据:

    set.seed(11)
    a = sample(1:10, 10)
    

    数据如下:

    3  1  5  9  7  8  6  4  2 10
    

    需要T+1 vs. T-1:

    T = 0 => No computation
    T = 1 => 5 - 3 = 2
    T = 2 => 9 - 1 = 8
    ...
    T = 9 => 10 - 4 = 6
    T = 10 => No computation
    

    随着那个被确立...

    #' Future Difference
    #' 
    #' Obtain the lagged difference between X[t+1+lag] - X[t-1-lag]
    #' @param x   A \code{vec}
    #' @param lag A \code{integer} indicating the lag
    #' @return A \code{vec} with differences taken at T+lag v. T-lag
    #' @examples
    #' set.seed(11)
    #' a = sample(1:10, 12)
    #' fdiff(a)
    fdiff = function(x, lag = 1){
      # Number of obs
      n = length(x)
    
      # Trigger error to prevent subset
      if(n < 2+lag){stop("`x` must be greater than `2+lag`")}
    
      # X_(T+1) - X_(T-1)
      x[(2+lag):n] - x[1:(n-lag-1)]
    }
    

    a 上调用它会得到:

    fdiff(a)
    
    2  8  2 -1 -1 -4 -4  6
    

    【讨论】:

      【解决方案2】:

      如果我正确理解您的问题,您只需设置 lag = 2。

      【讨论】:

      • hm 不,lag = 2 计算当前值 t 和 t-2 之间的差。我需要得到 t+1 和 t-1 之间的区别
      【解决方案3】:

      您正在寻找的是diff of 2 ! (您应该使用diff 而不是@Kake_Fisk 建议的lag。)使用来自@Coatless 接受的答案中的数据:

      set.seed(11)
      a = sample(1:10, 10)
      diff(a,2)
      

      给予:

      [1]  2  8  2 -1 -1 -4 -4  6
      

      在 OP 发表评论后编辑:

      如果我正确理解您的评论,您接受的来自@coatless 的回答并没有给您您所要求的。您正在寻找一个系列,它为您提供每个元素与其邻居的前一个和下一个差异。所以这个系列的长度必须是原始系列的 2 倍 - 2(因为第一个元素没有前一个值,最后一个没有下一个值)。 一种可能的解决方案可能是:

      set.seed(11)
      a = sample(1:10, 10)
      a
      [1]  3  1  5  9  7  8  6  4  2 10
      
      prev <- a[1:(length(a)-1)] - a[2:length(a)] # series of previous values
      nxt <- -1 * prev # series of next values
      
      nextPrevValues <- rep(0,2 * (length(a)-1))
      for(i in 1:length(a)-1){
        nextPrevValues[2*i-1] <- nxt[i]
        nextPrevValues[2*i] <- prev[i]
      }
      

      从第一个元素到下一个元素的差异开始,您可以获得每个元素的上一个和下一个差异。最后一个元素只有一个先前的值。

      nextPrevValues
       [1] -2  2  4 -4  4 -4 -2  2  1 -1 -2  2 -2  2 -2  2  8 -8
      

      【讨论】:

      • R 将diff(a,2) 解释为diff(a, lag=2)。我得到相同的结果:set.seed(11) a=sample(1:10, 10) a [1] 3 1 5 9 7 8 6 4 2 10 diff(a, 2) [1] 6 6 3 -3 -3 -6 4 diff(a,lag=2) [1] 6 6 3 -3 -3 -6 4
      • 这就是重点。 Kake_Fisk 建议“滞后”是不正确的,并且接受的答案是正确的,但通过构造一个在基础 R 中已经可用的函数会不必要地复杂化。
      • 好的,我明白了! diff(a, lag=2)并返回tt-2之间的差异,但我可以通过设置偏移量和数组的开头来修复它:c(NA, diff(a,2))
      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多