【问题标题】:do.call with cbind and lags of a variabledo.call 与 cbind 和变量的滞后
【发布时间】:2012-08-19 04:30:21
【问题描述】:

我想创建一个函数来生成一个包含多个变量滞后的矩阵。一个简单的例子是

a <- ts(1:10)
cbind(a, lag(a, -1))

要为多个延迟执行此操作,我有

lagger <- function(var, lags) {

  ### Create list of lags
  lagged <- lapply(1:lags, function(x){
    lag(var, -x)
  })

  ### Join lags together
  do.call(cbind, list(var, lagged))
}

使用上面的例子会得到意想不到的结果;

lagger(a, 1)

给出一个长度为 20 的列表,其中原始时间序列被分成单独的列表槽,最后 10 个是滞后序列的复制。

有什么建议可以让它工作吗?谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    这给出了 0 和 1 的滞后。

    library(zoo)
    a <- ts(11:13)
    lags <- -(0:1)
    
    a.lag <- as.ts(lag(as.zoo(a), lags))
    

    现在a.lag 是这样的:

    > a.lag
    Time Series:
    Start = 1 
    End = 4 
    Frequency = 1 
      lag0 lag-1
    1   11    NA
    2   12    11
    3   13    12
    4   NA    13
    

    如果您不想要 NA 条目,请使用:as.ts(na.omit(lag(as.zoo(a), lags)))

    【讨论】:

    • 好吧,我想我现在可以停止攻击embed 代码了。这就是我认为 OP 想要的。
    【解决方案2】:

    基于@Joshua Ulrich 的回答。

    我认为 embed 是正确的答案,但你会以相反的方式得到向量。我的意思是使用embed 你会得到顺序不正确的滞后系列,请参阅以下内容

    lagged <- embed(a,4)
    colnames(lagged) <- paste('t', 3:0, sep='-')
    lagged 
        t-3 t-2 t-1 t-0
    [1,]   4   3   2   1
    [2,]   5   4   3   2
    [3,]   6   5   4   3
    [4,]   7   6   5   4
    [5,]   8   7   6   5
    [6,]   9   8   7   6
    [7,]  10   9   8   7
    

    这会为您提供正确的答案,但顺序不正确,因为滞后是按降序排列的。

    但你可以像这样重新排序:

    lagged_OK <- lagged[,ncol(lagged):1]
    colnames(lagged_OK) <- paste('t', 0:3, sep='-')
    lagged_OK  
        lag.0 lag.1 lag.2 lag.3
    [1,]     1     2     3     4
    [2,]     2     3     4     5
    [3,]     3     4     5     6
    [4,]     4     5     6     7
    [5,]     5     6     7     8
    [6,]     6     7     8     9
    [7,]     7     8     9    10
    

    然后,你得到正确的滞后矩阵。

    我添加colnames只是为了解释,你可以这样做:

    embed(a,4)[ ,4:1] 
    

    如果你真的想要 lagger 函数,试试这个

    lagger <- function(x, lag=1){
          lag <- lag+1
          Lagged <- embed(x,lag)[ ,lag:1]
          colnames(Lagged) <- paste('lag', 0:(lag-1), sep='.')
          return(Lagged)
            }
    
    
    lagger(a, 4)
         lag.0 lag.1 lag.2 lag.3 lag.4
    [1,]     1     2     3     4     5
    [2,]     2     3     4     5     6
    [3,]     3     4     5     6     7
    [4,]     4     5     6     7     8
    [5,]     5     6     7     8     9
    [6,]     6     7     8     9    10
    
    lagger(a, 1)
          lag.0 lag.1
     [1,]     1     2
     [2,]     2     3
     [3,]     3     4
     [4,]     4     5
     [5,]     5     6
     [6,]     6     7
     [7,]     7     8
     [8,]     8     9
     [9,]     9    10
    

    【讨论】:

      【解决方案3】:

      我不确定你的函数有什么问题,但你可以改用embed

      > embed(a,4)
           [,1] [,2] [,3] [,4]
      [1,]    4    3    2    1
      [2,]    5    4    3    2
      [3,]    6    5    4    3
      [4,]    7    6    5    4
      [5,]    8    7    6    5
      [6,]    9    8    7    6
      [7,]   10    9    8    7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多