【问题标题】:R: How do I use lag comand with a matrix several times?R:我如何多次使用带有矩阵的滞后命令?
【发布时间】:2020-03-11 17:15:38
【问题描述】:

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

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

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

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

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

对于p = 2

对于p = 3

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

【问题讨论】:

  • 滞后是什么意思?你能用一个更小的矩阵来解释你想要什么吗?
  • @DarrenTsai 我编辑了我的原始帖子以便更好地解释这个问题

标签: r matrix


【解决方案1】:

转换为 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 package (v0.3.0) 于 2020-03-11 创建

【讨论】:

  • 我编辑了我的原始帖子以改进我对问题的解释
  • 你好,伊芙。我刚刚编辑和修改了我的代码,将示例数据调整为 8x8 矩阵,...。我的示例数据的第一列与您的 8 x 8 示例中的相同。正如您通过比较结果矩阵的第一列所看到的那样,与您正在寻找的滞后矩阵相同。
【解决方案2】:

逻辑似乎是删除与“滞后”值对应的最后 n 行并保留最后五行(这里的原因不完全清楚)。如果这是正确的,您可以这样做。

Matrix <- matrix(1:64, nrow = 8)
lagvalues <- 1:3
rowwindow <- 5

lapply(lagvalues, function(i) tail(head(Matrix, -i), rowwindow))

[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[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]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[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]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[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

或者更高效:

nr <- nrow(Matrix)
lapply(lagvalues, function(i) Matrix[(nr - (rowwindow - 1) - i):(nr - i),])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    相关资源
    最近更新 更多