Ответ 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), которые вы только что начали (закончили) позже (ранее ) в течение года и, следовательно, не имеют полной стоимости данных на одном или обоих концах серии.