Комбиниране на термините „Тенденция“ и „Разлика“.

📚 Въведение

В предишните статии от тази поредица ние поотделно видяхме въздействието на термините за тенденция и разлика върху изхода на модел ARIMA. Тази статия ще разгледа комбинирания ефект на тези два термина и как са моделирани.

📖 Предложени предишни четива

Предишните статии от тази поредица можете да намерите по-долу. Бих препоръчал на читателите първо да преминат през тях, преди да продължат с тази статия. Тази статия се основава на концепциите, описани в предишните, както и повторно използване на рамката, разработена в тях.

Практическо ръководство за ARIMA модели, използващи PyCaret — Част 2 (термин на тенденцията)

Практическо ръководство за ARIMA модели, използващи PyCaret — Част 3 (Различен термин)

1️⃣ Комбиниране на термина „Разлика — d“ с компонента на тенденцията

Когато се разработи ARIMA модел с тенденция и член на разликата, уравнението на модела се представя по следния начин (за d = 1).

Читателите ще забележат, че това е проста линейна комбинация от термините за разлика и тенденция от предишните статии в тази серия. Както и преди, потребителят има възможност да посочи как се моделира тенденцията. Има 3 начина да го моделирате — (1) като използвате само члена на отсечката „a“, (2) като използвате само члена на дрейфа „b“ или (3) като използвате и термина на пресичане, и термина на дрейфа. Ще видим всичките 3 примера в тази статия.

Друго интересно наблюдение е, че ако уравнението се пренареди, както е показано в уравнение 2, коефициентите на термина на тенденцията („a“ и „b“) могат да бъдат получени чрез монтиране на линейна регресия към първата разлика на данните. Ще използваме това уравнение, за да разработим теоретичната рамка за параметрите на нашия модел „a“ и „b“.

2️⃣️ Разбиране на комбинирания ефект на термина за тенденция и разлика с помощта на PyCaret

👉 Стъпка 1: Настройте експеримента с времеви серии на PyCaret

Настройката е същата като тази в предишната статия (която описва термина за разлика). Подробности могат да бъдат намерени в тетрадката на Jupyter за тази статия (достъпна в края на статията).

#### Get data from data playground ----
y = get_data("1", folder="time_series/random_walk")
exp = TimeSeriesExperiment()
exp.setup(data=y, seasonal_period=1, fh=30, session_id=42)

👉 Стъпка 2: Извършете EDA

Ще пропуснем EDA в тази статия, тъй като вече го направихме в предишната статия от тази серия.

👉 Стъпка 3: Теоретични изчисления

Както е описано по-горе, ще използваме уравнение (2), за да определим коефициентите на модела за този модел ARIMA. Ще моделираме и три различни вариации на модела ARIMA. Всеки модел ще съдържа първия член на разликата и една от опциите за тенденция, описани по-горе. За да подпомогнем теоретичните изчисления, ние използваме отново рамката от предишната статия (която съдържа само първия член на разликата), но в допълнение, ние приспособяваме линейна регресия към нейните остатъци.

# Get Train & Test Data Properties
y_train = exp.get_config("y_train")
y_test = exp.get_config("y_test")
# Compute theoretical prediction for ARIMA(0,1,0)x(0,0,0,0)
train_data = pd.DataFrame({"y":y_train})
train_data['preds'] = y_train.shift(1)
train_data['split'] = "Train"

test_data = pd.DataFrame({'y': y_test})
test_data['preds'] = y_train.iloc[-1]
test_data['split'] = "Test"

data = pd.concat([train_data, test_data])
data['residuals'] = data['y'] - data['preds']

(1) Метод 1: ARIMA модел с d=1 и тенденция = “c”

y_for_lr = data.query("split=='Train'")['residuals'].dropna()
y_for_lr.mean()
>>> 0.020172890811799432

И така, за модела с d=1 и тенденция = "c", очакваме стойността на "c" = 0,02017.

(2) Метод 2: ARIMA модел с d=1 и тенденция = “t”

y_for_lr = data.query("split=='Train'")['residuals'].dropna()
X_train = np.arange(1, len(y_for_lr)+1).reshape(-1, 1)

reg = LinearRegression(fit_intercept=False).fit(X_train, y_for_lr)
print(f"Expected Intercept: {reg.intercept_}")
print(f"Expected Slope: {reg.coef_}")
>>> Expected Intercept: 0.0
>>> Expected Slope: [0.00018524]

За модела с d=1 и тенденция = “t”, очакваме стойността на дрейфа “b” = 0,00018524.

(3) Метод 3: ARIMA модел с d=1 и тенденция = “ct”

y_for_lr = data.query("split=='Train'")['residuals'].dropna()
X_train = np.arange(1, len(y_for_lr)+1).reshape(-1, 1)

reg = LinearRegression(fit_intercept=True).fit(X_train, y_for_lr)
print(f"Expected Intercept: {reg.intercept_}")
print(f"Expected Slope: {reg.coef_}")
>>> Expected Intercept: -0.03432448539897173
>>> Expected Slope: [0.0003516]

За модела с d=1 и тенденция = “ct”, очакваме стойността на константата “a” = -0.0343 и отклонението “b” = 0.0003516.

👉 Стъпка 4: Изградете моделите

Сега, след като покрихме теоретичните изчисления, нека изградим тези модели с помощта на PyCaret и да видим техните резултати на практика.

# Model with d = 1 and Trend = "c" ----
model3b = exp.create_model(
    "arima",
    order=(0, 1, 0),
    trend="c"
)
# Model with d = 1 and Trend = "t" ----
model3c = exp.create_model(
    "arima",
    order=(0, 1, 0),
    with_intercept=True, trend='t'
)
# Model with d = 1 and Trend = "ct" ----
model3d = exp.create_model(
    "arima",
    order=(0, 1, 0),
    trend="ct"
)

👉 Стъпка 5: Анализирайте резултатите

Ще използваме отново същите помощни функции, които създадохме в предишната статия, за да анализираме резултатите.

(1) Метод 1: ARIMA модел с d=1 и тенденция = “c”

summarize_model(model3b)
get_residual_properties(model3b)

Статистическото обобщение показва, че създаденият модел е SARIMAX(0,1,0) модел с термин „прихващане“. Отсечената стойност от 0,0202 от модела съвпада с нашите теоретични изчисления (имайте предвид, че дисплеят по-горе показва закръглени резултати). Остатъчната сигма2 (необяснима дисперсия) е 0,9788 и е представителна за члена epsilon в уравнение 1.

Разглеждайки остатъците на модела, можем да видим, че остатъците наистина имат дисперсия от 0,9788, което съвпада със статистическото обобщение. След това нека начертаем прогнозите и да ги сравним с нашата теоретична рамка.

plot_predictions(model3b)

Тъй като уравнението за изчисляване на прогнозите (уравнение 1) е по-сложно от предишните статии, създадох малък калкулатор на Excel за изчисляване на теоретичните прогнози (колона „Pred (Calc)“) и ги сравних с прогнозите от модела ( колона „Пред“). Съвпадат точно (колона „Съвпадение“). Също така имайте предвид, че калкулаторът по-горе съдържа както точките в извадката (напр. индекс 0, 1, 2, 3, 4, …), така и прогнозите извън извадката (индекс 310, 311, 312 …). Интерактивните диаграми в PyCaret улесняват потребителите да увеличават мащаба и да проверяват стойностите в различни моменти от време, за да проверяват отговорите.

ЗАБЕЛЕЖКА: Показах само малък поднабор от прогнози в извадката и извън извадката. Читателите може да пожелаят да разширят това до повече точки, за да подсилят разбирането си. Excel е достъпен в края на тази статия (в раздела „Ресурси“).

(2) Метод 2: ARIMA модел с d=1 и тенденция = “t”

summarize_model(model3c)
get_residual_properties(model3c)

Статистическото обобщение показва, че създаденият модел е SARIMAX(0,1,0) модел с термин „дрифт“. Стойността на дрейфа от 0,0002 от модела съответства на нашите теоретични изчисления (имайте предвид, че дисплеят по-горе показва закръглени резултати). Остатъчната сигма2 (необяснима дисперсия) е 0,9781 и е представителна за члена epsilon в уравнение 1.

Разглеждайки остатъците на модела, можем да видим, че остатъците наистина имат дисперсия от 0,9781, което съвпада със статистическото обобщение. След това нека начертаем прогнозите и да ги сравним с нашата теоретична рамка.

plot_predictions(model3c)

Отново, калкулаторът на Excel се използва за проверка на теоретичните прогнози спрямо изхода на модела (този път с помощта на термина на наклона „b“, за да съответства на теоретичната стойност на „дрейф“). Още веднъж, теоретичните прогнози (както в извадката, така и извън извадката), представени от колоната „Pred (Calc)“, съвпадат с изхода на модела, представен от колоната „Pred“.

(3) Метод 3: ARIMA модел с d=1 и тенденция = “ct”

summarize_model(model3d)
get_residual_properties(model3d)

Статистическото обобщение показва, че създаденият модел е SARIMAX(0,1,0) модел с термин „прихващане“ и „отклоняване“. Стойностите (отсечка =-0,0343 и дрейф = 0,0004) от модела съответстват на нашите теоретични изчисления (имайте предвид, че дисплеят по-горе показва закръглени резултати). Остатъчната сигма2 (необяснима дисперсия) е 0,9778 и е представителна за члена epsilon в уравнение 1.

Разглеждайки остатъците на модела, можем да видим, че остатъците наистина имат дисперсия от 0,9778, което съвпада със статистическото обобщение. След това нека начертаем прогнозите и да ги сравним с нашата теоретична рамка.

plot_predictions(model3d)

Отново, калкулаторът на Excel се използва за проверка на теоретичните прогнози спрямо изхода на модела (този път като се използва както терминът за пресичане „a“, така и членът на наклона „b“). Още веднъж, теоретичните прогнози (както в извадката, така и извън извадката), представени от колоната „Pred (Calc)“, съвпадат с изхода на модела, представен от колоната „Pred“.

🚀 Заключение

И ето го. Комбинирахме нашите градивни елементи в стил Лего (термини „тенденция и „разлика“) в по-сложен модел. Надяваме се, че тази проста рамка е поставила добра основа, за да разберем как тези термини взаимодействат помежду си в ARIMA модел. В следващата статия ще видим влиянието на сезонния параметър „s“ и сезонната разлика „D“. Дотогава, ако искате да се свържете с мен в моите социални канали (често публикувам за Анализ на времеви серии), можете да ме намерите по-долу. Това е засега. Честита прогноза!

🔗 LinkedIn

🐦 Туитър

📘 GitHub

Харесахте статията? Станете среден член, за да продължите да учите без ограничения. Ще получа част от вашия членски внос, ако използвате следната връзка, без допълнителни разходи за вас.



📗 Ресурси

  1. Бележник на Jupyter, съдържащ кода за тази статия
  2. Калкулатор на Excel за теоретични прогнози.