如何在R中对矩阵进行滞后处理

4

我希望了解在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
我想创建 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
4个回答

6
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)
  }
}

或者您可以使用一个执行所期望功能的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

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
更一般地说,如@akrun所指出的那样,head(., -1)适用于任何大小的矩阵:
    rbind(NA, head(x, -1))

2
您可以使用 rbind(NA, head(x, -1))。但是,所使用的方法需要预先知道 nrow - akrun
真的是非常有创意的解决方案。 - catastrophic-failure

3
我们可以使用apply
library(dplyr)
apply(x, 2, lag)
#      [,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

0r

rbind(NA, x[-nrow(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

2
我假设你已经加载了 dplyr,因为你的 apply 代码无法与 stats::lag 一起使用。但是 dplyr::lag 掩盖了 stats::lag 并将所有输入视为向量,这就是为什么你需要使用 apply 循环遍历列的原因。 - Joshua Ulrich
@JoshuaUlrich:谢谢你提到这个。 - user2100721

1
以下是一个纯dplyr解决方案,不需要使用apply。唯一的麻烦之处在于它需要转换为data.frame才能工作。
library(dplyr)
x %>%  as.data.frame %>%  mutate_each( funs(lag))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,