如何在 R 中滞后矩阵

Mat*_*ini 4 r matrix lag

我想知道 R 中滞后矩阵的命令。我定义x为:

> (x <- matrix(1:50, 10, 5))
       [,1] [,2] [,3] [,4] [,5]
 [1,]    1   11   21   31   41
 [2,]    2   12   22   32   42
 [3,]    3   13   23   33   43
 [4,]    4   14   24   34   44
 [5,]    5   15   25   35   45
 [6,]    6   16   26   36   46
 [7,]    7   17   27   37   47
 [8,]    8   18   28   38   48
 [9,]    9   19   29   39   49
[10,]   10   20   30   40   50
Run Code Online (Sandbox Code Playgroud)

我想创建l.x

       [,1] [,2] [,3] [,4] [,5]
 [1,]    NA  NA   NA   NA   NA
 [2,]    1   11   21   31   41
 [3,]    2   12   22   32   42
 [4,]    3   13   23   33   43
 [5,]    4   14   24   34   44
 [6,]    5   15   25   35   45
 [7,]    6   16   26   36   46
 [8,]    7   17   27   37   47
 [9,]    8   18   28   38   48
[10,]    9   19   29   39   49
Run Code Online (Sandbox Code Playgroud)

Jos*_*ich 5

lag将您的对象强制转换为时间序列(ts特定于类)并且只移动时间索引。它不会更改基础数据。

您需要通过NA在开头添加行并在末尾删除相同数量的行来手动滞后矩阵。这是一个执行此操作的函数示例:

lagmatrix <- function(x, k) {
  # ensure 'x' is a matrix
  stopifnot(is.matrix(x))
  if (k == 0)
    return(x)
  na <- matrix(NA, nrow=abs(k), ncol=ncol(x))
  if (k > 0) {
    nr <- nrow(x)
    # prepend NA and remove rows from end
    rbind(na, x[-((nr-k):nr),])
  } else {
    # append NA and remove rows from beginning
    rbind(x[-1:k,], na)
  }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用一个lag可以满足您期望的函数。例如,xts::lag.xts

> xts::lag.xts(x)
      [,1] [,2] [,3] [,4] [,5]
 [1,]   NA   NA   NA   NA   NA
 [2,]    1   11   21   31   41
 [3,]    2   12   22   32   42
 [4,]    3   13   23   33   43
 [5,]    4   14   24   34   44
 [6,]    5   15   25   35   45
 [7,]    6   16   26   36   46
 [8,]    7   17   27   37   47
 [9,]    8   18   28   38   48
[10,]    9   19   29   39   49
> is.matrix(xts::lag.xts(x))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)


lmo*_*lmo 5

这是基本 R 中的一种手动方法,使用headrbind

rbind(NA, head(x, 9))

    [,1] [,2] [,3] [,4] [,5]
 [1,]   NA   NA   NA   NA   NA
 [2,]    1   11   21   31   41
 [3,]    2   12   22   32   42
 [4,]    3   13   23   33   43
 [5,]    4   14   24   34   44
 [6,]    5   15   25   35   45
 [7,]    6   16   26   36   46
 [8,]    7   17   27   37   47
 [9,]    8   18   28   38   48
[10,]    9   19   29   39   49
Run Code Online (Sandbox Code Playgroud)

更一般地,正如@akrun 所指出的,head(., -1)适用于任何大小的矩阵:

    rbind(NA, head(x, -1))
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`rbind(NA, head(x, -1))`。使用的方法需要事先知道nrow。 (2认同)