Комбиниране на термините „Тенденция“ и „Разлика“.
📚 Въведение
В предишните статии от тази поредица ние поотделно видяхме въздействието на термините за тенденция и разлика върху изхода на модел 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“. Дотогава, ако искате да се свържете с мен в моите социални канали (често публикувам за Анализ на времеви серии), можете да ме намерите по-долу. Това е засега. Честита прогноза!
🐦 Туитър
📘 GitHub
Харесахте статията? Станете среден член, за да продължите да учите без ограничения. Ще получа част от вашия членски внос, ако използвате следната връзка, без допълнителни разходи за вас.
📗 Ресурси
- Бележник на Jupyter, съдържащ кода за тази статия
- Калкулатор на Excel за теоретични прогнози.