首页 > 解决方案 > R:我如何多次使用带有矩阵的滞后命令?

问题描述

我正在使用一个矩阵 (3520 * 10),它代表我对 10 个变量的日常观察。我的目标是获得由我的滞后变量形成的 30 个矩阵,这些矩阵可以定义为:

在此处输入图像描述

其中 p 是滞后顺序,在我的情况下p= 1:30。然后,我的第一个矩阵将由我的十个变量的第一个滞后形成,大小为 (3490*10),第二个矩阵将由我的十个变量的第二个滞后形成,依此类推。

Matrix<-matrix[1:35200, ncol=10]

为了更好地解释我的观点,我将使用以下矩阵:

在此处输入图像描述

在这种情况下,p 将为 3。这意味着我将使用前三个观察值来构建新矩阵。例如,包含滞后变量的矩阵 whenp = 1将是:

在此处输入图像描述

为了p = 2

在此处输入图像描述

为了p = 3

在此处输入图像描述

我试图使用该lag命令,但它不适用于矩阵。有人可以为此任务推荐另一个命令。

标签: rmatrix

解决方案


转换为df。执行lag. 转换回矩阵。也许像这样:

library(dplyr)
library(purrr)
library(tidyr)

mat <- matrix(1:64, nrow = 8)
p <- 3 # number of lags
m <- 5 # values to include
mat_df <- as.data.frame(mat)
# Step 1: Lagged by values by mapping over 1:p
mat_lag <- map(1:p, ~ mutate_all(mat_df, lag, .x)) %>% 
  # Step 2: Drop rows with missing
  map(drop_na) %>% 
  # Step 3: Now slice. Only m values starting from the last row are kept
  map(~ slice(.x, (nrow(.x) - m + 1):nrow(.x)))
# Step 4: Convert to list of matrices
mat_lag %>% 
  map(as.matrix)
#> [[1]]
#>      V1 V2 V3 V4 V5 V6 V7 V8
#> [1,]  3 11 19 27 35 43 51 59
#> [2,]  4 12 20 28 36 44 52 60
#> [3,]  5 13 21 29 37 45 53 61
#> [4,]  6 14 22 30 38 46 54 62
#> [5,]  7 15 23 31 39 47 55 63
#> 
#> [[2]]
#>      V1 V2 V3 V4 V5 V6 V7 V8
#> [1,]  2 10 18 26 34 42 50 58
#> [2,]  3 11 19 27 35 43 51 59
#> [3,]  4 12 20 28 36 44 52 60
#> [4,]  5 13 21 29 37 45 53 61
#> [5,]  6 14 22 30 38 46 54 62
#> 
#> [[3]]
#>      V1 V2 V3 V4 V5 V6 V7 V8
#> [1,]  1  9 17 25 33 41 49 57
#> [2,]  2 10 18 26 34 42 50 58
#> [3,]  3 11 19 27 35 43 51 59
#> [4,]  4 12 20 28 36 44 52 60
#> [5,]  5 13 21 29 37 45 53 61

reprex 包于 2020-03-11 创建(v0.3.0)


推荐阅读