R: Как я могу использовать лаг команды с матрицей несколько раз? - PullRequest
1 голос
/ 11 марта 2020

Я использую матрицу (3520 * 10), которая представляет ежедневные наблюдения моих 10 переменных. Моя цель состоит в том, чтобы получить 30 матриц, сформированных из моих отстающих переменных, которые могут быть определены как:

enter image description here

Где p - порядок запаздывания, в моем случае p= 1:30. Тогда моя первая матрица будет сформирована по первому лагу из моих десяти переменных, а размер будет (3490 * 10), вторая матрица будет сформирована по второму лагу из моих десяти переменных и т. Д.

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

Для лучшего объяснения моей точки зрения я собираюсь использовать следующую матрицу:

enter image description here

В этом случае р будет 3. Это означает, что я буду использовать три первых наблюдения для построения новых матриц. Например, матрица, которая содержит запаздывающие переменные, когда p = 1 будет:

enter image description here

Для p = 2

enter image description here

Для p = 3

enter image description here

Я пытался использовать команду lag, но это не работает для матриц. Кто-то может порекомендовать другую команду для этой задачи.

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Конвертировать в 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

Создано в 2020-03-11 пакетом Представить (v0.3.0)

0 голосов
/ 12 марта 2020

Лог c, по-видимому, состоит в удалении последних 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),])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...