Каков наиболее эффективный способ добавления серии в существующий временной ряд?

#r #time-series

Вопрос:

Я хочу привязать новую серию к существующему временному ряду по столбцам. Вот пример из справки(ts):

 z <- ts(
  matrix(rnorm(300), 100, 3), 
  start = c(1961, 1), 
  frequency = 12
)
 

И вот единственный способ, который я нашел, чтобы добавить в серию, сохранив имена И время:

 z1 <- ts(
  cbind(
    z,
    runif(dim(z)[1])
  ),
  start(z),
  names = c(dimnames(z)[[2]], 'unif')
)
 

Я подозреваю, что есть более чистый способ сделать это (так же, как работают data.frames?).

Комментарии:

1. К сожалению, нет четкого способа обработки имен с временными рядами класса ts. Лично мне не нравится использовать другие классы, потому что я с подозрением отношусь к разделению временных рядов на множество разных стандартов (кроме того, для обычных полных временных рядов я думаю, что ключ/индекс даты и времени является излишним). Но я предполагаю, что оригинальные методы для временных рядов иногда могут быть разочаровывающими. PS : в вашем примере вы забыли частоту = частота(z)

Ответ №1:

Преобразовать в xts и transform (используется R 4.1.0 для оператора |> )

 library(xts)
z1 <- as.xts(z) |> 
          transform(unif = runif(dim(z)[1]))
 

-выход

 > head(z1)
            Series.1   Series.2   Series.3      unif
Jan 1961  0.58124800  0.1510926  1.0826555 0.2552968
Feb 1961  1.15737740  0.8661810  0.3916422 0.5525945
Mar 1961 -0.23185935  0.2858634  0.8118146 0.3055733
Apr 1961 -1.72068316 -0.6347280  0.1287224 0.4017409
May 1961 -2.07815044 -0.5623785 -1.8947997 0.3404939
Jun 1961 -0.09922355 -0.6606838  1.2231682 0.5405788
 

Другой вариант-это as_tsibble

 library(tsibble)
library(dplyr)
library(tidyr)
as_tsibble(z) %>% 
    pivot_wider(names_from = key, values_from = value) %>% 
    mutate(unif = runif(n()))
# A tsibble: 100 x 5 [1M]
      index `Series 1` `Series 2` `Series 3`  unif
      <mth>      <dbl>      <dbl>      <dbl> <dbl>
 1 1961 Jan     0.581      0.151     1.08    0.632
 2 1961 Feb     1.16       0.866     0.392   0.698
 3 1961 Mar    -0.232      0.286     0.812   0.631
 4 1961 Apr    -1.72      -0.635     0.129   0.912
 5 1961 May    -2.08      -0.562    -1.89    0.750
 6 1961 Jun    -0.0992    -0.661     1.22    0.370
 7 1961 Jul     0.450      1.01     -0.0622  0.605
 8 1961 Aug     0.328     -1.28     -0.729   0.221
 9 1961 Sep     0.511     -0.675    -0.387   0.489
10 1961 Oct    -0.943      0.0116    0.00400 0.630
# … with 90 more rows
 

Ответ №2:

На самом деле, когда вы пытаетесь добавить вектор в конце строк или столбцов, для выполнения этой работы R требуется время. самый эффективный способ-создать пустую матрицу M*N, а затем попытаться заполнить ее следующим образом

 dat <- matrix(NA,ncol = 10,nrow = 10000)
## for i'th row
dat[i,] = myVector
 

или для i-го столбца
dat[,i] = мой вектор

Ответ №3:

В данном конкретном случае я думаю, что имеет смысл придерживаться data.frame с (первым) столбцом, зарезервированным для ВРЕМЕНИ, потому что для простого описания и регрессии мне действительно не нужны какие-либо функции объекта временного ряда. Это означает отслеживание строк (т. Е. Когда я различаю () и т. Д.), Но в любом случае это разумно. Спасибо за ваши предложения!