Ошибка при попытке использования stl и функции разложения в R

Я сделал простой временной ряд, я добавил немного шума в функцию sin и попытался разложить его, используя функцию "stl" и "разложить" в R, в то время как моя серия определенно имеет более 2 периодов и периодический, R дает мне следующую ошибку для обеих функций:

x
  [1]  1.4537365796  2.7185844368  2.8394728999  3.8926989923  4.3405508086  5.1959080871
  [7]  5.6602505790  5.4829985648  5.6357660330  4.6084976233  4.6617322922  4.0286486832
 [13]  3.3641752333  1.7408063182  0.8815147612  0.2895139342 -0.5402768515 -1.5612641107
 [19] -2.1584502547 -2.9878043526 -3.5545638149 -4.0530074199 -4.0748538612 -4.7581704662
 [25] -4.6555349052 -4.0726206240 -3.1646413472 -2.6934453823 -2.2364605277 -1.2643569882
 [31] -0.1202011946  1.1136371449  2.2504199271  3.0313528996  3.5384449109  4.5176211013
 [37]  5.4013172839  5.4252837451  5.4768196692  5.8979709077  5.6698285659  4.5133489450
 [43]  4.2702602998  3.5180837069  2.2652913344  1.1975595698  0.5412697849 -0.5966162032
 [49] -1.0827728340 -1.8488242277 -3.4118061838 -3.9009752140 -3.9102671954 -4.3486102172
 [55] -4.7481017993 -4.0097598695 -3.9078554267 -3.8070416888 -2.5968567322 -2.2567568949
 [61] -1.1423907008  0.0002492447  0.4338279080  1.2431986797  2.3216397323  3.3235925116
 [67]  4.1591487169  4.9028481873  5.4535861470  5.0579349546  5.1548777627  4.9707124992
 [73]  5.4496833187  4.4563072487  4.1301372986  2.4594352788  1.7253019929  0.6961453965
 [79]  0.4281167695 -1.3152944759 -1.8645880957 -2.5764132038 -3.7681528112 -4.3731672862
 [85] -3.9940201611 -4.5497596299 -4.9496796983 -4.1233093447 -3.7759837204 -3.3359027749
 [91] -2.3518009102 -1.7488933797 -0.7225148838  0.5395759836  1.0496249652  2.0383715782
 [97]  3.2357449979  3.8028316517  5.0346866280  5.2154265148

fit<- stl(x, t.window=15, s.window="per", robust=TRUE)
Error in stl(x, t.window = 15, s.window = "per", robust = TRUE) :series is not periodic or has less      than two periods

fit<- decompose(x,type="multiplicative")
Error in decompose(x, type = "multiplicative") :time series has no or less than 2 periods

Помог бы мне с этой проблемой, пожалуйста?

Ответ 1

Не видно ли из сообщения об ошибке:

time series has no or less than 2 periods

? R, не сообщая вам, что ваши данные не являются периодическими, просто данные, которые вы передали, не имеют указаний на периодичность.

Ваш временной ряд x не имеет периодичности с точки зрения R. Похоже, вы забыли сказать или сделали ошибку, говоря ts(), что такое периодичность. Поскольку вы не показываете, как был создан x, мы ничего не можем сделать, кроме как сказать вам вернуться и создать x, чтобы он имел >= 2 периода.

Дело здесь в том, что R собственная, R не может вывести, что частота наблюдения в единицу времени. Вы должны сообщить ts() эту информацию. Вы можете сделать это несколькими способами:

frequency: количество наблюдений за единицу времени.

deltat: доля периода выборки между последовательными          наблюдения; например, 1/12 для ежемесячных данных. Только один из           frequency или deltat.

Если вы не указали один из них, ts() использует значения по умолчанию frequency = 1, deltat = 1, которые будут указывать временной ряд одного наблюдения за единицу времени (например, один год).

stl() требуется класс "ts" classed object - если вы его не предоставите, он будет принуждать входные данные к объекту "ts" через as.ts(). Эта функция будет использовать значения по умолчанию, описанные выше.

Я думаю, что здесь произошло то, что вы не понимали, что stl() требует объект класса "ts" или что он создал неуместную для ваших данных, когда вы просто передали вектор наблюдений.

Решение состоит в том, чтобы явно создать класс "ts" с помощью ts() и указать один из frequency или deltat.

например.

dat <- cumsum(rnorm(12*4))
x <- ts(dat)
stl(x, "periodic")
xx <- ts(dat, frequency = 12)
stl(xx, "periodic")

Здесь я использовал frequency = 12, чтобы указать, что есть 12 наблюдений за единицу времени - например, с ежемесячными данными.

Приведенное выше дает мне

R> stl(x, "periodic")
Error in stl(x, "periodic") : 
  series is not periodic or has less than two periods

R> stl(xx, "periodic")
 Call:
 stl(x = xx, s.window = "periodic")

Components
       seasonal    trend remainder
Jan 1 -0.103529  0.55245  -0.44301
Feb 1  0.001333  0.56981   0.86135
Mar 1 -0.382075  0.58717   1.11162
Apr 1  0.010552  0.59891  -1.04966
....

Для ваших данных я подозреваю, что вы хотите frequency = 10 указать длину временного ряда; это говорит о том, что у вас есть десять наблюдений в год. Если в серии больше наблюдений в год, скажем, 12 для ежемесячных данных, но вы не имеете последних двух или первых двух месяцев (т.е. Нет данных, NA s), которые вы только что начали (закончили) позже (ранее ) в течение года и, следовательно, не имеют полной стоимости данных на одном или обоих концах серии.