Найдите квартал с наибольшим годовым абсолютным изменением R - PullRequest
0 голосов
/ 10 июля 2020

Учитывая следующие данные временного ряда:

df <- ts(data.frame(x = c(1:16)), start = c(2010, 1), frequency = 4))

Я хотел бы сравнить значения x кварталов за все годы, чтобы узнать, в каком квартале произошло наибольшее изменение по сравнению с тем же кварталом. в предыдущем году?

Другими словами, я хочу знать, в каком квартале наблюдается наибольшее годовое абсолютное изменение x?

Как я могу сделать это в R? Спасибо.

Обновления:

str(df)

Выход:

tibble [19 × 54] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ year: num [1:19] 2001 2002 2003 2004 2005 ...
 $ 1   : num [1:19] 22.1 24.2 29.4 27.7 30.7 ...
 $ 2   : num [1:19] 27.3 36 26.4 27.9 31.1 ...
 $ 3   : num [1:19] 24.8 25.4 15.1 20 15.4 ...
 $ 4   : num [1:19] 22.2 41.1 12.5 15.8 21.8 ...
 $ 5   : num [1:19] 25.9 28.4 30.5 12.6 30 ...
 $ 6   : num [1:19] 29.3 30.9 17.9 24.8 34.6 ...
 $ 7   : num [1:19] 26.3 34.9 22.9 22.4 32.9 ...
 $ 8   : num [1:19] 28.9 39.4 26.7 36.3 31.8 ...
 $ 9   : num [1:19] 29.3 21.1 24.3 41.4 27.8 ...
 $ 10  : num [1:19] 30.5 33.7 21.2 39.1 33.7 ...
 $ 11  : num [1:19] 35.7 41.3 43 32 30.6 ...
 $ 12  : num [1:19] 36 33.2 48.1 39 36.3 ...
 $ 13  : num [1:19] 36 37.4 45.1 52.7 46.8 ...
 $ 14  : num [1:19] 50 37 36.2 44.2 53.2 ...
 $ 15  : num [1:19] 52.1 56.4 50.5 42.1 53.5 ...
 $ 16  : num [1:19] 51 60 50.5 62.9 58.1 ...
 $ 17  : num [1:19] 57 47.1 52.3 50.3 45.9 ...
 $ 18  : num [1:19] 66.4 53.7 51.2 51.9 47.6 ...
 $ 19  : num [1:19] 60.3 53.1 57.4 65.1 59.8 ...
 $ 20  : num [1:19] 67.3 49.4 57.3 59.4 57.2 ...
 $ 21  : num [1:19] 53.6 54.6 55.9 63.5 61.5 ...
 $ 22  : num [1:19] 54.2 70.4 56.2 60.5 62.3 ...
 $ 23  : num [1:19] 59.5 66.1 62.8 69.7 77 ...
 $ 24  : num [1:19] 75.9 65.5 64 70.6 72.1 ...
 $ 25  : num [1:19] 68.7 77.9 69.1 65.9 72.7 ...
 $ 26  : num [1:19] 75.3 78.2 74.1 66.2 80.8 ...
 $ 27  : num [1:19] 70.9 79.8 77.6 71.4 71.7 ...
 $ 28  : num [1:19] 74.4 72.7 70.9 72 77.2 ...
 $ 29  : num [1:19] 78.9 80.6 71.6 73.5 80 ...
 $ 30  : num [1:19] 74.8 76.1 70.8 69.2 75.8 ...
 $ 31  : num [1:19] 79 79.9 71.2 73.7 79.2 ...
 $ 32  : num [1:19] 78.3 73.6 70.9 66.8 77.1 ...
 $ 33  : num [1:19] 68.2 72.5 75.8 64 73.8 ...
 $ 34  : num [1:19] 71.8 72.1 77.4 68 71.4 ...
 $ 35  : num [1:19] 69.4 73.1 71.1 69 73 ...
 $ 36  : num [1:19] 71.3 74.1 68.2 71.6 72.9 ...
 $ 37  : num [1:19] 63 67.5 70 70.2 74 ...
 $ 38  : num [1:19] 62.3 66 63 66.1 69 ...
 $ 39  : num [1:19] 53.5 62.9 53.5 63.1 61.8 ...
 $ 40  : num [1:19] 55.1 61.2 48.2 53.4 67 ...
 $ 41  : num [1:19] 57.1 53.8 61.4 57.7 56.3 ...
 $ 42  : num [1:19] 50.1 44 54.2 48 55.4 ...
 $ 43  : num [1:19] 47.8 43.6 46.1 56.3 44.7 ...
 $ 44  : num [1:19] 54.4 39 51.8 53.9 53.6 ...
 $ 45  : num [1:19] 47.5 47.4 37.9 47.3 49.8 ...
 $ 46  : num [1:19] 52.1 39 44 43.9 39.2 ...
 $ 47  : num [1:19] 47.5 37.4 44.2 47.3 33.9 ...
 $ 48  : num [1:19] 41.3 28 36.4 35.4 34 ...
 $ 49  : num [1:19] 46.9 22.9 36.6 38.1 16.5 ...
 $ 50  : num [1:19] 38 33.9 28.9 33.5 24.9 ...
 $ 51  : num [1:19] 35.9 35.1 29.4 23.6 17.2 ...
 $ 52  : num [1:19] 17.3 29.8 33.5 18.7 35.8 ...
 $ 53  : num [1:19] 13.8 37 39.4 45.6 34.5 ...
 - attr(*, "groups")= tibble [19 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ year : num [1:19] 2001 2002 2003 2004 2005 ...
  ..$ .rows: list<int> [1:19] 
  .. ..$ : int 1
  .. ..$ : int 2
  .. ..$ : int 3
  .. ..$ : int 4
  .. ..$ : int 5
  .. ..$ : int 6
  .. ..$ : int 7
  .. ..$ : int 8
  .. ..$ : int 9
  .. ..$ : int 10
  .. ..$ : int 11
  .. ..$ : int 12
  .. ..$ : int 13
  .. ..$ : int 14
  .. ..$ : int 15
  .. ..$ : int 16
  .. ..$ : int 17
  .. ..$ : int 18
  .. ..$ : int 19
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
Show in New WindowClear OutputExpand/Collapse Output
Error in attr(x, "tsp") <- c(1, NROW(x), 1) : invalid time series parameters specified

1 Ответ

1 голос
/ 10 июля 2020

Вы можете получить матрицу различий между кварталами в годовом исчислении следующим образом:

diffs <- sapply(1:4, function(i) diff(window(df, start = c(2010, i), deltat = 1)))
diffs
#>      [,1] [,2] [,3] [,4]
#> [1,]    4    4    4    4
#> [2,]    4    4    4    4
#> [3,]    4    4    4    4

Конечно, в вашем примере годовые различия одинаковы, поэтому давайте получите лучший пример:

set.seed(69)
df <- ts(data.frame(x = runif(16)), start = c(2010, 1), frequency = 4)

df
#>            Qtr1       Qtr2       Qtr3       Qtr4
#> 2010 0.53075401 0.76880773 0.64591522 0.86526041
#> 2011 0.36888274 0.86876479 0.17108433 0.78769062
#> 2012 0.17355491 0.02207173 0.88290272 0.35687300
#> 2013 0.92564366 0.25978334 0.18301182 0.26407276

diffs <- sapply(1:4, function(i) diff(window(df, start = c(2010, i), deltat = 1)))
diffs
#>            [,1]        [,2]       [,3]        [,4]
#> [1,] -0.1618713  0.09995706 -0.4748309 -0.07756979
#> [2,] -0.1953278 -0.84669305  0.7118184 -0.43081762
#> [3,]  0.7520888  0.23771161 -0.6998909 -0.09280024

Так что это просто случай нахождения индекса наибольшей абсолютной разницы. Мы хотим использовать which вместо which.max, так как это даст нам индексы массива, и, чтобы избежать ада с плавающей запятой, мы будем проверять приблизительное, а не точное равенство

which(abs(abs(diffs) - max(abs(diffs))) < 1e-9, arr.ind = TRUE)
#>      row col
#> [1,]   2   2

Это означает, что наибольшая разница была во втором квартале между вторым и третьим годами, что мы можем подтвердить, посмотрев на df

...