Функция Lag в Quantmod может принимать вектор для своих периодов "k" для задержки (и выводить матрицу или массив), но я не могу найти соответствующего способа сделать это с помощью перспективной функции - например, Next () или lead ( ).

Например,

    variable <- runif(5,1,30)
    my.k <- c(2, 3)
    Lag(variable, my.k)
    
returns:
            Lag.2    Lag.3
    [1,]       NA       NA
    [2,]       NA       NA
    [3,] 18.71971       NA
    [4,] 10.98429 18.71971
    [5,] 17.19299 10.98429

Однако команда Lag, обратная команде Quantmod, то есть команда Next (), возвращает следующее:

   > variable <- runif(5,1,30)
   > my.k <- c(2, 3)
   > Next(variable, my.k)
   Error in Next.numeric(variable, my.k) : k must be a non-negative integer

Я попытался включить as.integer (my.k), но получил ту же ошибку. Я также просмотрел справочные заметки через «Отставание» и «Далее».

Я начал с того, что попробовал функции lag () и lead () из пакета dplyr, но обе они требуют «Положительное целое число длины 1» для «количества позиций, на которые нужно опередить или отстать», и при попытке выдают следующую ошибку включить my.k в соответствующие аргументы для n:

Error: `n` must be a nonnegative integer scalar, not a double vector of length 2.

ВОПРОС: Как я могу использовать my.k (мой созданный вектор) в какой-либо перспективной функции - например, Next () или lead () - так же, как я могу использовать его в функции Lag Quantmod? Есть простой способ сделать это?

1
cpanagakos 12 Июн 2021 в 05:44

2 ответа

Лучший ответ

lag.zoo в пакете zoo и flag в пакете свертывания поддерживают как прямую, так и обратную векторизованную задержку. Любой из них может создать все задержки my.k в одной строке кода без повторения.

В первом примере ниже variable преобразуется в класс зоопарка, а затем выполняется задержка с помощью lag.zoo. Объекты zoo обычно не нуждаются в заполнении, но если оно предназначено для использования во фрейме данных, который не может обработать, мы добавляем na.pad = TRUE. Затем при желании преобразовать обратно в простые числа с помощью coredata. Обратите внимание, что dplyr затирает универсальную функцию lag в R, поэтому либо не загружайте dplyr, либо загружайте его с помощью library(dplyr, exclude = c("lag", "filter")), либо используйте stats::lag, чтобы принудительно использовать универсальную функцию lag в базе R который, в свою очередь, отправит lag.zoo. Если у my.k есть имена, которых нет в вопросе, эти имена будут использоваться для именования выходных столбцов.

Во втором примере ниже используется flag в пакете свертывания.

Обратите внимание, что lag базы R определяется таким образом, что ряд, являющийся результатом положительного запаздывания, начинается раньше. lag.zoo соответствует этому соглашению. С другой стороны, в случае коллапса положительное отставание означает, что серия начинается позже. Таким образом, чтобы ссылаться на прошлые значения, серия начинается позже, поэтому используйте отрицательные запаздывания с lag.zoo и положительные запаздывания с flag. Чтобы вывести значения назад из будущего, используйте отрицательное значение этих задержек в обоих случаях.

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

Lag.zoo

library(zoo)
coredata(stats::lag(as.zoo(variable), -my.k, na.pad = TRUE))
##          lag-2     lag-3
## [1,]        NA        NA
## [2,]        NA        NA
## [3,]  9.339748        NA
## [4,] 23.860849  9.339748
## [5,] 12.860331 23.860849

coredata(stats::lag(as.zoo(variable), my.k, na.pad = TRUE))
##          lag2     lag3
## [1,] 12.86033 26.60750
## [2,] 26.60750 28.27355
## [3,] 28.27355       NA
## [4,]       NA       NA
## [5,]       NA       NA

Флаг

library(collapse)
flag(variable, my.k)
##             L2        L3
## [1,]        NA        NA
## [2,]        NA        NA
## [3,]  9.339748        NA
## [4,] 23.860849  9.339748
## [5,] 12.860331 23.860849
## attr(,"class")
## [1] "matrix"

flag(variable, -my.k)
##            F2       F3
## [1,] 12.86033 26.60750
## [2,] 26.60750 28.27355
## [3,] 28.27355       NA
## [4,]       NA       NA
## [5,]       NA       NA
## attr(,"class")
## [1] "matrix"

Заметка

Ввод в воспроизводимой форме (с использованием set.seed):

set.seed(123)

variable <- runif(5,1,30); variable
## [1]  9.339748 23.860849 12.860331 26.607505 28.273551

my.k <- c(2, 3)
0
G. Grothendieck 12 Июн 2021 в 22:05

Похоже, что next() не векторизован. Вот примерный подход:

library(tidyverse)

set.seed(123)

variable <- tibble(values = runif(5,1,30))
my.k <- c(2, 3)

variable
#> # A tibble: 5 x 1
#>   values
#>    <dbl>
#> 1   9.34
#> 2  23.9 
#> 3  12.9 
#> 4  26.6 
#> 5  28.3

#tidyverse easy way
mutate(variable, lead_1 = lead(values, 2),
       lead_2 = lead(values, 3))
#> # A tibble: 5 x 3
#>   values lead_1 lead_2
#>    <dbl>  <dbl>  <dbl>
#> 1   9.34   12.9   26.6
#> 2  23.9    26.6   28.3
#> 3  12.9    28.3   NA  
#> 4  26.6    NA     NA  
#> 5  28.3    NA     NA

#tidyverse when my.k is big
my.k %>% map(~ transmute(variable, lead = dplyr::lead(values, .x))) %>%
    map2_dfc(my.k, ~set_names(.x, paste0('lead_', as.character(.y))))
#> # A tibble: 5 x 2
#>   lead_2 lead_3
#>    <dbl>  <dbl>
#> 1   12.9   26.6
#> 2   26.6   28.3
#> 3   28.3   NA  
#> 4   NA     NA  
#> 5   NA     NA

Создано 12 июня 2021 года пакетом REPEX (v2.0.0)

0
jpdugo17 12 Июн 2021 в 03:19