<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Архивы Прикладное прогнозирование - Open Forecasting</title>
	<atom:link href="https://openforecast.org/ru/category/prikladnoe-prognozirovanie/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/ru/category/prikladnoe-prognozirovanie/</link>
	<description>О том как смотреть в будущее</description>
	<lastBuildDate>Mon, 23 Mar 2020 23:25:32 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/cropped-usd-05-32x32.png&amp;nocache=1</url>
	<title>Архивы Прикладное прогнозирование - Open Forecasting</title>
	<link>https://openforecast.org/ru/category/prikladnoe-prognozirovanie/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Прогнозирование как самоцель</title>
		<link>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/</link>
					<comments>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 23 Mar 2020 22:24:19 +0000</pubDate>
				<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[Хайп]]></category>
		<category><![CDATA[бла-бла-бла]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2389</guid>

					<description><![CDATA[<p>Вы возможно слышали что-то о пандемии COVID-19 (последние новости из Великобритании: несколько часов назад правительство объявило о введении ограничений на перемещение людей в связи с виросом. Теперь можно только ходить в магазин за продуктами и то 1 раз в 3 дня). Число новостей, мемов и просто шума по этому поводу давно перевалило за разумный уровень. [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/">Прогнозирование как самоцель</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Вы возможно слышали что-то о пандемии COVID-19 (последние новости из Великобритании: несколько часов назад правительство объявило о введении ограничений на перемещение людей в связи с виросом. Теперь можно только ходить в магазин за продуктами и то 1 раз в 3 дня). Число новостей, мемов и просто шума по этому поводу давно перевалило за разумный уровень. Но что меня поражает больше всего, так это количество ненаучных статей на тему анализа и прогнозирования пандемии. Многие экономисты, аналитики, прогнозисты, специалисты в области машинного (и не очень) обучения, да и просто неравнодушные люди, кинулись проводить анализ и прогнозирование в этой области. Неожиданно все вокруг стали экспертами и могут с лёгкостью рассуждать о том, чего ждать, сколько случаев заражения будет на следующей наделе, сколько людей умрёт, сколько случаев заражения будет в США к 31 Марта 2021 года и так далее. Эти эксперты используют симуляции, экспоненциальное сглаживание, ARIMA, Байесовские методы, нейронные сети, экспертные методы и вообще всё, что знают для того, чтобы провести свою аналитику / построить прогнозы. У меня уже голова болит от всего этого шума, и я не считаю, что то, что делают эти люди &#8212; полезно и нужно. И вот почему.</p>
<h3>Почему?</h3>
<p>Во-первых, без знания конкретной предметной области, вся аналитика и всё прогнозирование просто сводятся к управжнениям по построению моделей. Это весело, но это не делает вас экспертами в этой области. Если вы считаете, что можно просто построить красочный график или отфильтровать шум и дать прогноз, для того, чтобы получить какой-то разумный результат, то вы серьёзно ошибаетесь. Любая аналитика должна делаться с учётом природной специфичности области, а не в вакууме. Не стоит просто так применять какую-нибудь ARIMA к ряду данных и считать, что вы сделали что-то полезное. Без понимания проблемы, это превращается просто в упражнения по работе в Excel / R / Python. Кстати, <a href="https://robjhyndman.com/hyndsight/forecasting-covid19/" rel="noopener noreferrer" target="_blank">Роб Хайндман написал по этой же теме пост</a> пару дней назад.</p>
<p>Во-вторых, мы на самом деле не знаем настоящую ситуацию. Данные, с которыми мы работаем, скорее всего, некорректные и неполные. Например, страны в эти дни перестают делать тесты всем подряд, боясь ещё большего распространения вируса. Но даже делая тесты, мы не можем точно сказать, сколько у нас заражённых на самом деле по многим разным причинам. Строя модели по неправильным данным, вы, конечно же, получите неправильные выводы. Есть одно исключение &#8212; это если вы используете специальные модели из данной области при поддержке экспертов (см. &#171;во-первых&#187; и ссылку на блог Роба).</p>
<p>В-третьих, все эти упражнения по анализу и прогнозированию совершенно не помогают в принятии каких-либо осмысленных решений. Они делаются чисто для любопытства, без особых целей. Например, какой-нибудь эксперт спрогнозировал, что число заразившихся вирусом во всём мире к 31 марта 2021 года будет от 53 до 530 миллионов человек. Ну, и что? Какое решение можно принять на основе такого прогноза? Никакое. Что могут сделать люди с этим прогнозом? Ничего. Это просто прогноз для самого себя (и возможно для самопиара). COVID-19 &#8212; это сейчас хайповая тема в аналитике, и можно заработать себе баллы и привлечь к себе внимание просто делая что-то в этой области. Но вклад в функционирование общества подобные аналитика и прогнозирование не вносят практически никакого.</p>
<h3>Что делать?</h3>
<p>Вместо того, чтобы делать подобные бессмысленные прогнозы, можно сфокусироваться, например, на том, чего ожидать в экономике из-за вируса. Карантин, само-изоляция и закрытие общественных пространств серьёзно бьют по экономике. К сожалению, судя по всему, эпидемию в отдельной взятой стране без этого не остановить. Перед нами встаёт делема: закрывать и вредить экономике или же не закрывать и вредить здоровью общества. В связи с этим можно попробовать найти ответы на следующие вопросы:</p>
<ul>
<li>Как вирус будет распространятся в разных сценариях (полное закрытие страны / частичное закрытие / никакого закрытия)?</li>
<li>Что будет с экономикой в этих сценариях?</li>
<li>Что произойдёт с бизнесом во время изоляции?</li>
<li>Как много компаний обанкротится из-за вируса?</li>
<li>Какие типы компаний обанкротятся первыми?</li>
<li>Как вся эта ситуация повлияет на цены на продукты?</li>
<li>Как много людей потеряет работу из-за удара по экономике?</li>
</ul>
<p>Ответы на эти и другие вопросы значительно более полезны и выжны. Они могут помочь принять решения прямо здесь и сейчас, пока не поздно. Скорее всего, всякие ARIMA и экспоненциальное сглаживание не помогут в ответах на эти вопросы. Судя по всему, нужно использовать экспертные методы, обращаясь за помощью к специалистам в области эпидемиологии и экономики.</p>
<p>Другой интересный пример &#8212; это панические покупки, которые уже повредили цепям поставок во многих странах. Люди неожиданно стали покупать в среднем на 200% больше, чем обычно. В связи с этим можно задать ряд вопросов, связанных с исследованием операций:</p>
<ul>
<li>Как цепь поставок отреагирует на это в краткосрочной перспективе?</li>
<li>Каков будет эффект этих панических покупок в долгосрочной перспективе?</li>
<li>Когда это закончится и когда спрос вернётся к своему нормальному уровню?</li>
<li>Что будет со спросом по окончанию паники?</li>
</ul>
<p>Ответы на эти вопросы тоже важны и помогают в принятии решений разным группам людей. Да, найти правильные ответы сложно, но они могут принести реальную пользу.</p>
<h3>Резюмируя</h3>
<p>Я не дам вам никаких прогнозов по COVID-19, просто потому что я не эксперт. Но я могу точно сказать, что по этому поводу слишком много хайпа, паники и шума. Мы (прогнозисты, экономисты, аналитик и пр.) должны помогать обществу, а не создавать ещё больше шума и паники. Поэтому, если вы хотите что-то поанализировать и попрогнозировать на тему COVID-19, а потом выложить это на всеобщее обозрение, подумайте по поводу того, как это поможет людям. Если не поможет, то просто не делайте этого.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/">Прогнозирование как самоцель</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2020/03/23/prognozirovanie-kak-samocel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет greybox для R</title>
		<link>https://openforecast.org/ru/2018/05/04/greybox-for-r/</link>
					<comments>https://openforecast.org/ru/2018/05/04/greybox-for-r/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 04 May 2018 12:22:35 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Пакет greybox для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[greybox]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1737</guid>

					<description><![CDATA[<p>На днях я разместил в CRAN новый пакет &#8212; greybox (серый ящик). Идея названия произрастает из принципов моделирования, в соответствии с которыми все модели могут быть условно разделены на три типа: Чёрный ящик &#8212; модель, в которой неизвестны ни структура, ни параметры. Мы видим только входной и выходной сигналы Белый ящик &#8212; модель, в которой [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/05/04/greybox-for-r/">Пакет greybox для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2.png&amp;nocache=1"><img fetchpriority="high" decoding="async" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2-260x300.png&amp;nocache=1" alt="Hexagon for greybox" width="260" height="300" class="size-medium wp-image-1719" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2-260x300.png&amp;nocache=1 260w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2-768x888.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2-886x1024.png&amp;nocache=1 886w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/05/greybox2.png&amp;nocache=1 1206w" sizes="(max-width: 260px) 100vw, 260px" /></a></p>
<p>На днях я разместил в <a href="https://cran.r-project.org/" rel="noopener" target="_blank">CRAN</a> новый пакет &#8212; <a href="https://cran.r-project.org/package=greybox" rel="noopener" target="_blank">greybox</a> (серый ящик). Идея названия произрастает из принципов моделирования, в соответствии с которыми все модели могут быть условно разделены на три типа:</p>
<ol>
<li><strong>Чёрный ящик</strong> &#8212; модель, в которой неизвестны ни структура, ни параметры. Мы видим только входной и выходной сигналы</li>
<li><strong>Белый ящик</strong> &#8212; модель, в которой известно всё. Можно сказать, что это <a href="/about/systems-models/">детерминированная модель</a>, в ней нет никакой случайности, и всё предопределено.</li>
<li><strong>Серый ящик</strong> &#8212; нечто среднее, между предыдущими двумя. Фактически это и есть та самая <a href="/about/systems-models/">стохастическая модель</a>, с которой мы обычно имеем дело в прогнозировании.</li>
</ol>
<p>Так что пакет greybox, фактически может включать в себя всё, что угодно, связанное с моделированием. Однако акцент в нём будет сделан на процессе построении регрессионных моделей и выборе объясняющих переменных.</p>
<p>Этот пакет мне оказался нужным по нескольким причинам:</p>
<ol>
<li>У меня накопилось несколько функций, которые не подходили к другим пакетам (в т.ч. к пакету <a href="/tag/smooth-ru/">smooth</a>). Они все так или иначе относятся к регрессиям и к построению моделей;</li>
<li>Мои исследования и работа в университете в последнее время оказываются связанными с регрессиями и выбором наилучшей модели. Для этого нужны разные функции (например, для комбинирования моделей), и мне оказалось проще написать одну свою, нежели использовать несколько из разных пакетов.</li>
<li>В CRAN не нашлось пакетов для выбора моделей и последующего использования их в прогнозировании, которые полностью меня бы устраивали. Кроме того, мне не нравится тяга многих пакетов к <a href="/forecasting_toolbox/statistics-and-hypothesis/">p-values и проверке статистических гипотез</a>. Мы живём в 21 веке, и уже существуют другие инструменты для выбора моделей и анализа результатов.</li>
</ol>
<p>Поэтому я решил, что надо сделать свой пакет с теми функциями, которые нужны мне, реализованными в том виде, в каком я считаю их необходимыми.</p>
<p>На данный момент в пакет перекочевали функции <span class="lang:r decode:true crayon-inline">xregExpander()</span> и <span class="lang:r decode:true crayon-inline">stepwise()</span> из пакета <span class="lang:r decode:true crayon-inline">smooth</span>, а так же функция <span class="lang:r decode:true crayon-inline">ro()</span> из пакета <a href="https://github.com/trnnick/TStools" rel="noopener" target="_blank">TStools</a>. На тему первых двух на сайте <a href="/2018/02/10/xreg-advanced/">уже была отдельная статья</a>, а по поводу работы третьей можно почитать в <a href="https://cran.r-project.org/web/packages/greybox/vignettes/ro.html" rel="noopener" target="_blank">виньетах</a> пакета (к сожалению, только на английском).</p>
<p>Пакет будет развиваться и обновляться, а я буду периодически писать о том, как всё это движется.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/05/04/greybox-for-r/">Пакет greybox для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2018/05/04/greybox-for-r/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Общие параметры. Часть 1. Прогнозные интервалы</title>
		<link>https://openforecast.org/ru/2017/06/11/prediction-intervals/</link>
					<comments>https://openforecast.org/ru/2017/06/11/prediction-intervals/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sun, 11 Jun 2017 13:23:40 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Общая информация]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[CES]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1266</guid>

					<description><![CDATA[<p>Предыдущие 6 статей мы обсуждали основные свойства функции es(). Пришло время двигаться дальше. Начиная с этой статьи мы обсудим параметры, общие для всех функций, реализованных в пакете smooth. К таким функциям относятся: es(), ssarima(), ces(), ges() и sma(). Однако, беря во внимание, что на данный момент мы обсудили только экспоненциальное сглаживанием, все примеры мы будем [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/06/11/prediction-intervals/">Пакет «smooth» для R. Общие параметры. Часть 1. Прогнозные интервалы</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Предыдущие 6 статей мы обсуждали основные свойства функции <code>es()</code>. Пришло время двигаться дальше. Начиная с этой статьи мы обсудим параметры, общие для всех функций, реализованных в пакете <code>smooth</code>. К таким функциям относятся: <code>es()</code>, <code>ssarima()</code>, <code>ces()</code>, <code>ges()</code> и <code>sma()</code>. Однако, беря во внимание, что на данный момент мы обсудили только экспоненциальное сглаживанием, все примеры мы будем рассматривать на основе <code>es()</code>.</p>
<p>Начнём с прогнозных интервалов.</p>
<h3>Прогнозные интервалы функций пакета smooth</h3>
<p>Одна из особенностей пакета <code>smooth</code> &#8212; это возможность конструировать разные типы прогнозных интервалов. Самый простой из них — это параметрические (включаются командой <code>interval="p"</code>, <code>interval="parametric"</code> или <span class="lang:r decode:true  crayon-inline " >interval=TRUE</code>). Эти интервалы выводятся аналитически из свойств аддитивных и мультипликативных моделей. На данный момент (<code>smooth</code> v2.0.0) только в функции <code>es()</code> реализованы мультипликативные компоненты. Все остальные функции используют аддитивную модель. Это делает функцию <code>es()</code> этакой уникальной снежинкой. И если с чистыми аддитивными или мультипликативными моделями особых проблем нет, то со смешанными начинается головная боль.</p>
<p>В случае с моделями ETS с мультипликативной ошибкой, немультипликативными трендом и сезонностью и низкой дисперсией ошибок (ниже 0.1), интервалы аппроксимируются соответствующими моделями с аддитивной ошибкой. Например, интервалы для модели ETS(M,A,N) могут быть успешно аппроксимированы интервалами модели ETS(A,A,N), так как в случае с низкой дисперсией лог-нормальное распределение оказывается очень близким к нормальному. Все остальные смешанные модели используют симуляции для построения интервалов (с помощью функции <code>sim.es()</code>). Данные генерируются с заданными параметрами модели на \(h\) наблюдений. Процесс симуляции повторяется 10000 раз, так что в нашем распоряжении оказывается 10000 возможных дальнейших траекторий фактических значений. После этого вычисляются нужные квантили для каждого шага прогноза (с помощью функции <code>quantile()</code> из пакета <code>stats</code>) и возвращаются прогнозные интервалы. Конечно, такой метод нельзя считать чистым параметрическим, но в случае со смешанными моделями по другому либо просто нельзя, либо крайне сложно.</p>
<p>В функции <code>es()</code> так же доступны полупараметрические (semiparametric) и непараметрические (nonparametric) прогнозные интервалы. Оба типа этих интервалов основаны на <a href="/forecasting_toolbox/estimation-advanced-methods/">траекторных прогнозных ошибках</a>, которые получаются за счёт построения прогнозов на период от 1 до \(h\) шагов вперёд из каждого наблюдения в обучающей выборке. В результате этого в нашем распоряжении оказывается матрица с \(h\) столбцами и  \(T-h\) строками. В случае с полупараметрическими интервалами (вызываются с помощью <code>interval="sp"</code> или <code>interval="semiparametric"</code>) на основе этой матрицы рассчитывается \(h\) дисперсий, которые затем используются при построении интервалов на основе либо нормального, либо лог-нормального распределения (в зависимости от типа модели). Такие интервалы могут быть полезны в случае, если нарушаются базовые предпосылки о гомоскедастичности и не автокоррелированности остатков модели. Тем не менее мы всё ещё предполагаем, что у остатков есть какое-то параметрическое распределение (нормальное / лог-нормальное). </p>
<p>В случае с непараметрическими интервалами (вызываются в R через <code>interval="np"</code> или <span class="lang:r decode:true  crayon-inline " >interval=&#187;nonparametric&#187;</code>) предпосылка о параметрическом распределении может быть опущена. В этом случае мы используем <a href="/forecasting_toolbox/estimation-simple-methods/">квантильные регрессии</a> (аналогично тому, как это было сделано в <a href="https://www.jstor.org/stable/2634872?seq=1#page_scan_tab_contents" target="_blank" rel="noopener noreferrer">Taylor and Bunn, 1999</a>). В основе этих моделей лежит следующая степенная функция:<br />
\begin{equation} \label{eq:ssTaylorPIs}<br />
	\hat{e}_{j} = a_0 j ^ {a_{1}},<br />
\end{equation}<br />
где \(j = 1, .., h\) &#8212; это горизонт прогнозирования. Преимуществом модели \eqref{eq:ssTaylorPIs} является отсутствие экстремумов для любых \(j>0\). Это означает, что прогнозные интервалы будут вести себя монотонно и не поменяют направление (в случае с полиномами мы можем получить очень странные интервалы с расширением, а затем — с сужением). Одновременно с этим, степенные функции позволяют аппроксимировать большой спектр возможных траекторий (в зависимости от параметров \(a_0\) и \(a_1\)), включая рост с замедлением, линейный рост или рост с ускорением.</p>
<p>Главная проблема непараметрических интервалов из пакета <code>smooth</code> заключается в том, что квантильные регрессии, лежащие в их основе, плохо себя ведут на малых выборках. Так для того, чтобы построить регрессию для 0.95 квантиля, нам нужно иметь как минимум 20 наблюдений. А для 0.99 квантиль &#8212; хотя бы 100. В случае, если в нашем распоряжении недостаточно наблюдений, прогнозные интервалы могут быть неточными и не соответствовать указанному номинальному уровню.</p>
<p>Заметим, что если пользователь строит прогноз на один шаг вперёд, то полупараметрические интервалы будут соответствовать параметрическим (так как в этом случае интервалы строятся на основе дисперсии на один шаг вперёд), а непараметрические интервалы конструируются с помощью функции <code>quantile()</code> пакета <code>stats</code>.</p>
<p>Ну, и последнее. Ширина прогнозных интервалов регулируется с помощью параметра <code>level</code>, который может быть задан как дробное число (<code>level=0.95</code>) либо как число в пределах от 0 до 100 (<code>level=95</code>). Я лично предпочитаю первый метод &#8212; второй нужен в основном для того, чтобы сделать функцию совместимой с функциями из пакета <code>forecast</code>. По умолчанию все прогнозные функции пакета <code>smooth</code> конструируют 95% прогнозные интервалы.</p>
<p>Существует ещё ряд особенностей при построении прогнозных интервалов для целочисленных моделей и кумулятивных прогнозов, но их мы пока касаться не будем.</p>
<h3>Примеры в R</h3>
<p>Рассмотрим построение интервалов на примере ряда N1241. Построим модель ETS(A,Ad,N) следующим образом:</p>
<pre class="decode" title="Пример использования">
ourModel1 <- es(M3$N1241$x, "AAdN", h=8, holdout=TRUE, interval="p")
ourModel2 <- es(M3$N1241$x, "AAdN", h=8, holdout=TRUE, interval="sp")
ourModel3 <- es(M3$N1241$x, "AAdN", h=8, holdout=TRUE, interval="np")</pre>
<p>В результате мы должны получить следующие графики:</p>
<div id="attachment_991" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric.png"><img decoding="async" aria-describedby="caption-attachment-991" src="/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-991" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-parametric.png&amp;nocache=1 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-991" class="wp-caption-text">Ряд N1241 из базы M3, прогноз с помощью es(), фактические значения из проверочной выборки и параметрические прогнозные интервалы</p></div>
<div id="attachment_990" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric.png"><img decoding="async" aria-describedby="caption-attachment-990" src="/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-990" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-semiparametric.png&amp;nocache=1 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-990" class="wp-caption-text">Ряд N1241 из базы M3, прогноз с помощью es(), фактические значения из проверочной выборки и полупараметрические прогнозные интервалы</p></div>
<div id="attachment_989" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-989" src="/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-989" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1241-AAdN-PI-nonparametric.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-989" class="wp-caption-text">Ряд N1241 из базы M3, прогноз с помощью es(), фактические значения из проверочной выборки и непараметрические прогнозные интервалы</p></div>
<p>Как видим, во всех случаях интервалы накрыли все фактически значения из тестовой выборки. В первую очередь это из-за того, что были построены широкие интервалы. В этих условиях совершенно непонятно, какому из методов отдать предпочтение. Для получения дополнительной информации об интервалах можно рассчитать их ширину в единицах следующим образом:</p>
<pre class="decode" title="Ширина интервалов">
mean(ourModel1$upper-ourModel1$lower)
mean(ourModel2$upper-ourModel2$lower)
mean(ourModel3$upper-ourModel3$lower)
</pre>
<p>Получим:</p>
<pre>950.4171
955.0831
850.614</pre>
<p>В этом конкретном примере непараметрические интервалы оказались самыми узкими, что в сочетании с покрытием всех фактических значений в тестовой выборке, указывает на то, что это наилучший метод построения интервалов в данном случае. Это, впрочем, не означает, что всегда и везде надо строить непараметрические интервалы. Выбор метода должен быть продиктован тем, какие именно предпосылки нарушены в модели. Если бы мы не знали значения из тестовой выборки, мы могли бы провести элементарный анализ остатков. Например:</p>
<pre class="decode" title="Анализ остатков">
forecast::tsdisplay(ourModel1$residuals)

hist(ourModel1$residuals)

qqnorm(ourModel3$residuals)
qqline(ourModel3$residuals)</pre>
<div id="attachment_1270" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/05/N1241-residuals-plot.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1270" src="/wp-content/uploads/2017/05/N1241-residuals-plot-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1270" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-plot-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-plot-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-plot-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-plot.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1270" class="wp-caption-text">Линейный график и коррелограмма по остаткам модели ETS(A,Ad,N)</p></div>
<div id="attachment_1267" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/05/N1241-residuals-histogram.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1267" src="/wp-content/uploads/2017/05/N1241-residuals-histogram-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1267" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-histogram-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-histogram-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-histogram-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-histogram.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1267" class="wp-caption-text">Гистограмма остатков модели ETS(A,Ad,N)</p></div>
<div id="attachment_1268" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/05/N1241-residuals-qqplot.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1268" src="/wp-content/uploads/2017/05/N1241-residuals-qqplot-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1268" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-qqplot-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-qqplot-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-qqplot-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/05/N1241-residuals-qqplot.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1268" class="wp-caption-text">Графи квантиль-квантиль по остаткам модели ETS(A,Ad,N)</p></div>
<p>Первый график показывает, как остатки меняются во времени и что собой представляют коррелограммы остатков. Как видим, никакой очевидной автокорреляции и гетероскедастичности в остатках не наблюдается. Это означает, что мы можем предположить, что эти предпосылки не наршаются. То есть нет никакой надобности в полупараметрических интервалах. Однако второй и третий графики показывают, что остатки не распределены нормально (как предполагает модель ETS(A,Ad,N)). А значит параметрические интервалы могут быт неточными. Это мотивирует построение непараметрических интервалов в случае использования модели ETS(A,Ad,N) по ряду N1241.</p>
<p>На сегодня всё. До новых встреч!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/06/11/prediction-intervals/">Пакет «smooth» для R. Общие параметры. Часть 1. Прогнозные интервалы</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/06/11/prediction-intervals/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Функция es(). Часть 6. О том, как происходит оптимизация параметров</title>
		<link>https://openforecast.org/ru/2017/04/29/smooth-es-parameters-optimisation/</link>
					<comments>https://openforecast.org/ru/2017/04/29/smooth-es-parameters-optimisation/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sat, 29 Apr 2017 18:56:21 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1198</guid>

					<description><![CDATA[<p>Теперь, когда мы обсудили основные черты функции es(), мы можем перейти к тому, как оптимизационный механизм работает, как параметры ограничиваются и как задаются стартовые значения при оптимизации функции es(). Эта статья написана для тех исследователей, которым важно знать, как работает тёмная сторона es(). Заметим, что в этой статье, мы будем обсуждать стартовые значения параметров. Не [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/04/29/smooth-es-parameters-optimisation/">Пакет «smooth» для R. Функция es(). Часть 6. О том, как происходит оптимизация параметров</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Теперь, когда мы обсудили основные черты функции <span class="lang:r decode:true crayon-inline">es()</span>, мы можем перейти к тому, как оптимизационный механизм работает, как параметры ограничиваются и как задаются стартовые значения при оптимизации функции <span class="lang:r decode:true crayon-inline">es()</span>. Эта статья написана для тех исследователей, которым важно знать, как работает тёмная сторона <span class="lang:r decode:true crayon-inline">es()</span>.</p>
<p>Заметим, что в этой статье, мы будем обсуждать стартовые значения параметров. Не перепутайте со стартовыми значениями компонент экспоненциального сглаживания. Последние — это всего лишь часть первого.</p>
<p>Что ж, начнём.</p>
<p>Перед запуском оптимизации, нам нужно каким-то образом задать стартовые значения параметров. Число параметров и тип инициализации зависит от выбранной модели. Рассмотрим, последовательно, как каждый из них задаётся.</p>
<p>Постоянные сглаживания \(\alpha\), \(\beta\) и \(\gamma\) (для уровня ряда, тренда и сезонности) для аддитивной модели задаются равными 0.3, 0.2 и 0.1 соответственно. В случае с мультипликативной моделью они равны 0.1, 0.05 и 0.01. В общем случае мы стараемся найти параметры близкие к нулю, так как они позволяют сгладить ряд. Впрочем, это не всегда удаётся сделать, иногда ряд имеет более реактивные компоненты. Что касается мультипликативных моделей, стартовые значения там должны быть достаточно близкими к нулю, иначе модель может стать излишне чувствительной к шуму.</p>
<p>Следующий важный параметр — это параметр демпфирования тренда \(\phi\). Его стартовое значение задаётся в функции равным 0.95. В случае, когда он равен единице, мы получаем модель обычного тренда, из которой оптимизатору может быть затруднительно выбраться. Если же задать его слишком маленьким, то тренд может оказаться «передемпфированным», в результате чего траектория будет напоминать простую прямую горизонтальную линию.</p>
<p>Стартовые значения вектора состояний задаются в зависимости от типа модели. Вначале задаются значения для уровня и тренда. Происходит это путём оценки параметров следующей простой регрессионной модели по первым 12 наблюдениям (ну, или по все выборке, если в нашем распоряжении меньше 12 наблюдений):<br />
\begin{equation} \label{eq:simpleregressionAdditive}<br />
	y_t = a_0 + a_1 t + e_t .<br />
\end{equation}</p>
<p>В случае с мультипликативным трендом модель имеет следующий вид:<br />
\begin{equation} \label{eq:simpleregressionMulti}<br />
	\log(y_t) = a_0 + a_1 t + e_t .<br />
\end{equation}</p>
<p>В обоих случаях константа \(a_0\) используется в качестве стартового значения для уровня, а угол наклона \(a_1\) используется для тренда. В ситуации с мультипликативной моделью параметры экспонируются. В случае, если компонента тренда в модели отсутствует, вместо \(a_0\) для уровня используется средняя по той же части ряда.</p>
<p>В случае с сезонной моделью, проводится классическая декомпозиция с помощью функции <span class="lang:r decode:true crayon-inline">decompose()</span>, в которой тип сезонности соответствует выбранному пользователем. В итоге полученные сезонные коэффициенты используются для стартовых значений сезонной компоненты.</p>
<p>Все значения затем собираются в один вектор под названием <span class="lang:r decode:true crayon-inline">C</span> (да, я знаю, что это плохое название для вектора параметров, но так уж тут повелось) в следующем порядке:</p>
<ol>
<li>Вектор постоянных сглаживания \(\mathbf{g}\) (<span class="lang:r decode:true crayon-inline">persistence</span>);</li>
<li>Параметр демпфирования \(\phi\) (<span class="lang:r decode:true crayon-inline">phi</span>);</li>
<li>Стартовые значения не сезонной части вектора состояний \(\mathbf{v}_t\) (<span class="lang:r decode:true crayon-inline">initial</span>);</li>
<li>Стартовые значения сезонной части вектора состояний \(\mathbf{v}_t\) (<span class="lang:r decode:true crayon-inline">initialSeason</span>);</li>
<p>После этого в вектор добавляются параметры для экзогенных переменных, которые мы тут пока обсуждать пока не будем:</p>
<li>Вектор параметров экзогенных переменных \(\mathbf{a}_t\) (<span class="lang:r decode:true crayon-inline">initialX</span>);</li>
<li>Матрица переходов экзогенных переменных (<span class="lang:r decode:true crayon-inline">transitionX</span>);</li>
<li>Вектор постоянных сглаживания для экзогенных переменных (<span class="lang:r decode:true crayon-inline">persistenceX</span>).</li>
</ol>
<p>Если пользователь задаст в функции какие-то из упомянутых выше параметров (например, параметр <span class="lang:r decode:true crayon-inline">initial</span>), то этот шаг в формировании вектора <span class="lang:r decode:true crayon-inline">C</span> будет пропущен.</p>
<p>Помимо этого при оптимизации задаются границы для каждого из параметров. Это делается посредством двух векторов: <span class="lang:r decode:true crayon-inline">CLower</span> и <span class="lang:r decode:true crayon-inline">CUpper</span>, длина которых соответствует длине <span class="lang:r decode:true crayon-inline">C</span>. Эти ограничения зависят от того, какие значения принимает параметр bounds в функции <span class="lang:r decode:true crayon-inline">es()</span> и позволяют ускорить процесс нахождения оптимальных значений. Большая часть элементов <span class="lang:r decode:true crayon-inline">CLower</span> и <span class="lang:r decode:true crayon-inline">CUpper</span> носят чисто технический характер и нужны для того, чтобы полученная модель имела смысл (например, чтобы мультипликативные компоненты не были отрицательными). Единственный параметр, которые стоит упомянуть &#8212; это параметр демпфирования \(\phi\). Область его значений &#8212; это от нуля до единицы (включая границы). В этом случае прогнозные траектории не будут иметь взрывной харакетер.</p>
<p>В то время как вектора <span class="lang:r decode:true crayon-inline">CLower</span> и <span class="lang:r decode:true crayon-inline">CUpper</span> ограничивают более широкую область значений для всех параметров, значения постоянных сглаживания должны регулироваться более филигранно, так как они обычно влияют друг на друга. Поэтому эта регуляция происходит в самой целевой функции.</p>
<p>Если пользователь выбрал <span class="lang:r decode:true crayon-inline">bounds=&#187;usual&#187;</span>, то границы задаются следующим образом:<br />
\begin{equation} \label{eq:boundsUsual}<br />
	\alpha \in [0, 1]; \beta \in [0, \alpha]; \gamma \in [0, 1-\alpha]
\end{equation}</p>
<p>В этом случае экспоненциальное сглаживание сохраняет свойство средне-взвешенной модели: веса между наблюдениями распределяются так, что более новые наблюдения имеют больший вес, каждый вес лежит в пределах от нуля до единицы, а сумма весов оказывается равной единице.</p>
<p>В случае, если пользователь задаст <span class="lang:r decode:true crayon-inline">bounds=&#187;admissible&#187;</span> (расширенные границы), то ограничения выводятся на основе собственных чисел матрицы дисконтирования. Функция проверяет, все ли модули собственных чисел лежат в пределах от нуля до единицы. Это гарантирует то, что веса убывают экспоненциально и их сумма равна единице. Однако в этом случае каждый отдельный вес может выходить за рамки промежутка (0, 1). В этом случае модель теряет свойство усредняющей, но не теряет свой фундаментальный смысл.</p>
<p>В экстремальном случае пользователь может и вовсе отказаться от границ постоянных сглаживания, задав <span class="lang:r decode:true crayon-inline">bounds=&#187;none&#187;</span>.</p>
<p>Если во время оптимизации постоянные сглаживания выходят за заданные границы, то целевая функция возвращает очень большое число (\(10^{300}\)),а оптимизатор пытается подобрать следующие значения для постоянных сглаживания.</p>
<p>Для того, чтобы оптимизировать модель экспоненциального сглаживания, я использую функцию <span class="lang:r decode:true crayon-inline">nloptr()</span> из пакета <span class="lang:r decode:true crayon-inline">nloptr</span>. Это функция <a href="http://ab-initio.mit.edu/wiki/index.php/NLopt" target="_blank">нелинейной оптимизации</a>, написанная в C. Функции пакета <span class="lang:r decode:true crayon-inline">smooth</span> используют два алгоритма: BOBYQA и Nelder-Mead. Это делается в два шага: на первом параметры оцениваются с помощью BOBYQA, полученные оптимизированные параметры используются далее на втором шаге и подтягиваются ближе к оптимальным значениям с помощью Nelder-Mead. В случае со смешанными моделями, после первого шага, мы так же проверяем, отличаются ли полученные параметры от заданных перед оптимизацией. Если нет, то это означает, что оптимизация не удалась и BOBYQA используется повторно, но уже с другими значениями вектора <span class="lang:r decode:true crayon-inline">C</span> (постоянные сглаживания, которые не удалось оптимизировать обнуляются). Если оптимизировать модель не удаётся, вы можете передать оптимизатору параметры, контролирующие максимальное число итераций (<span class="lang:r decode:true crayon-inline">maxeval</span>) и относительную величину схождения (<span class="lang:r decode:true crayon-inline">xtol_rel</span>). Из стандартные значения и общий смысл кратко рассмотрены в документации к функциям.</p>
<p>В целом, такой механизм оптимизации гарантирует, что параметры будут близки к оптимальным значениям, будут лежать в разумных пределах и соответствовать требованиям выбранной модели.<br />
Рассмотрим несколько примеров использования функции <span class="lang:r decode:true crayon-inline">es()</span>. Возьмём для этого ряд N41 из базы M3.</p>
<p>ETS(A,A,N) со стандартными границами в этом случае выглядит так:</p>
<pre class="decode">es(M3$N0041$x,"AAN",bounds="u",h=6)</pre>
<pre>Time elapsed: 0.1 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
    0     0 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 397.628
Cost function type: MSE; Cost function value: 101640.73

Information criteria:
     AIC     AICc      BIC 
211.1391 218.6391 214.3344</pre>
<p>Как видим, обе постоянные сглаживания оказались равными нулю. Это означает, что мы совсем не используем новую поступающую информацию, а для прогноза используем лишь детерминистский тренд:</p>
<div id="attachment_1202" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/04/N0041-ETS-AAN-usual.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1202" src="/wp-content/uploads/2017/04/N0041-ETS-AAN-usual-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1202" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-usual-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-usual-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-usual-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-usual.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1202" class="wp-caption-text">Ряд №41 и ETS(A,A,N) с традиционными границами</p></div>
<p>А вот, что произойдёт, если мы обратимся к расширенным границам:</p>
<pre class="decode">es(M3$N0041$x,"AAN",bounds="a",h=6)</pre>
<pre>Time elapsed: 0.11 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
1.990 0.018 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 327.758
Cost function type: MSE; Cost function value: 69059.107

Information criteria:
     AIC     AICc      BIC 
205.7283 213.2283 208.9236</pre>
<p>Как видим, постоянная сглаживания уровня ряда \(\alpha\) оказалась выше единицы. Она вообще почти равна двум. Это означает, что ETS потеряла свойство усредняющей модели. Тем не менее с такими значениями веса всё равно убывают во времени. Такое высокое значение параметра говорит о том, что уровень претерпевает существенные изменения. Это нестандартное поведение экспоненциального сглаживания и обычно не то, чего мы хотели бы получить от модели. Но такое случается.</p>
<p>А вот как это всё выглядит графически:<br />
<div id="attachment_1199" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1199" src="/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1199" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-admissible.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1199" class="wp-caption-text">Ряд №41 и ETS(A,A,N) с расширенными границами</p></div>
<p>Хотелось бы заметить, что модель может быть стабильной даже в случае, если постоянные сглаживания оказались отрицательными. Так что не пугайтесь. И имейте в виду, что в случае нарушения свойства стабильности, функция вас об этом предупредит.</p>
<p>Помимо этого, пользователь может сам регулировать, какие стартовые значения использовать для векторов <span class="lang:r decode:true crayon-inline">C</span>, <span class="lang:r decode:true crayon-inline">CLower</span> и <span class="lang:r decode:true crayon-inline">CUpper</span> на первом шаге оптимизации. Выбор модели в этом случае невозможен, так как длина векторов в каждой модели будет разной. Пользователь так же должен удостовериться, что он передаёт вектора правильной длины (соответствующей выбранной модели). Эти значения можно передать с помощью <span class="lang:r decode:true crayon-inline">&#8230;</span> следующим образом:</p>
<pre class="decode">Cvalues <- c(0.2, 0.1, M3$N0041$x[1], diff(M3$N0041$x)[1])
es(M3$N0041$x,"AAN",C=Cvalues,h=6,bounds="u")</pre>
<pre>
Time elapsed: 0.1 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
    1     0 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 429.923
Cost function type: MSE; Cost function value: 118821.938

Information criteria:
     AIC     AICc      BIC 
213.3256 220.8256 216.5209</pre>
<p>В этом случае мы получили граничные значения для обеих постоянных сглаживания. В результате этого получилась модель, в которой уровень имеет форму «случайного блуждания», а тренд не меняется во времени. Это несколько странное, но вполне возможное сочетание компонент. Аппроксимация и прогноз по модели оказываются похожими на то, что мы получили, когда использовали расширенные границы:<br />
<div id="attachment_1201" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1201" src="/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1201" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-tuned.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1201" class="wp-caption-text">Ряд №41 и ETS(A,A,N) с традиционными границами и нестандартными стартовыми значениями</p></div>
<p>С помощью всего этого можно ненароком получить бессмысленную модель, так что будьте осторожны с тем, что задаёте и как. Например, следующие параметры приводят к тому, что в нашем распоряжении оказывается нечто невразумительное (с точки зрения прогнозирования):</p>
<pre class="decode">Cvalues <- c(2.5, 1.1, M3$N0041$x[1], diff(M3$N0041$x)[1])
CLower <- c(1,1, 0, -Inf)
CUpper <- c(3,3, Inf, Inf)
es(M3$N0041$x,"AAN",C=Cvalues, CLower=CLower, CUpper=CUpper, bounds="none",h=6)</pre>
<pre>
Time elapsed: 0.12 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
2.483 1.093 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 193.328
Cost function type: MSE; Cost function value: 24027.222

Information criteria:
     AIC     AICc      BIC 
190.9475 198.4475 194.1428 
Warning message:
Model ETS(AAN) is unstable! Use a different value of 'bounds' parameter to address this issue!</pre>
<p>Несмотря на то, что такая модель лучше всех остальных аппроксимирует временной ряд (MSE оказалась равной 24027 против 70000 — 120000 в других моделях), она оказалась нестабильной, что означает, что старая информация имеет больший вес, чем новая. Прогноз в этом случае получился неразумным и, скорее всего, смещённым и неточным:<br />
<div id="attachment_1200" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1200" src="/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1200" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/04/N0041-ETS-AAN-crazy.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1200" class="wp-caption-text">Ряд №41 и ETS(A,A,N) с безумными границами</p></div>
<p>Так что будьте осторожны во время ручного задания параметров моделей.</p>
<p>Всем всех благ!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/04/29/smooth-es-parameters-optimisation/">Пакет «smooth» для R. Функция es(). Часть 6. О том, как происходит оптимизация параметров</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/04/29/smooth-es-parameters-optimisation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Презентация в Университете города Bath</title>
		<link>https://openforecast.org/ru/2017/04/05/presentation-in-bath/</link>
					<comments>https://openforecast.org/ru/2017/04/05/presentation-in-bath/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 05 Apr 2017 21:20:08 +0000</pubDate>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[презентация]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<category><![CDATA[экстраполяция]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1183</guid>

					<description><![CDATA[<p>На прошлой неделе я посетил университет города Bath, в котором по случаю визита сделал презентацию на научном семинаре, организованном Фотиосом Петропулосом, на тему &#171;Одна за всех: прогнозирование целочисленного и не целочисленного спроса с помощью одной модели&#171;. Презентация была принята хорошо, хотя и вызвала острые вопросы со стороны участников семинара. После презентации прошла сессия мозгового штурма [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/04/05/presentation-in-bath/">Презентация в Университете города Bath</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>На прошлой неделе я посетил университет города Bath, в котором по случаю визита сделал презентацию на научном семинаре, организованном <a href="http://t.co/IQzPjkCJ4L" target="_blank">Фотиосом Петропулосом</a>, на тему &#171;<a href="/wp-content/uploads/2017/04/2017-Bath-Presentation-1.pdf">Одна за всех: прогнозирование целочисленного и не целочисленного спроса с помощью одной модели</a>&#171;. Презентация была принята хорошо, хотя и вызвала острые вопросы со стороны участников семинара. После презентации прошла сессия мозгового штурма в группе из 12 прогнозистов из разных вузов Англии, а за ней &#8212; ужин в непалийском ресторане. В общем, большое спасибо Фотиосу за прекрасно организованный день!</p>
<p>Фотографий с места события, к сожалению нет.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/04/05/presentation-in-bath/">Презентация в Университете города Bath</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/04/05/presentation-in-bath/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Функция es(). Часть 5. Важные параметры</title>
		<link>https://openforecast.org/ru/2017/03/05/part-5-essential-parameters/</link>
					<comments>https://openforecast.org/ru/2017/03/05/part-5-essential-parameters/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sun, 05 Mar 2017 00:00:58 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1135</guid>

					<description><![CDATA[<p>В предыдущих статьях мы рассматривали обычно два аспекта функции es(): теорию, лежащую в основе, а затем практику. Однако в этой статье первую часть мы опустим, потому что рассказывать тут не о чем. Данная статья по большей части посвящена тому, что же ещё можно натворить с помощью параметров функции es(). Начнём с инициализации экспоненциального сглаживания. История [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/03/05/part-5-essential-parameters/">Пакет «smooth» для R. Функция es(). Часть 5. Важные параметры</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В предыдущих статьях мы рассматривали обычно два аспекта функции <span class="lang:r decode:true  crayon-inline">es()</span>: теорию, лежащую в основе, а затем практику. Однако в этой статье первую часть мы опустим, потому что рассказывать тут не о чем. Данная статья по большей части посвящена тому, что же ещё можно натворить с помощью параметров функции <span class="lang:r decode:true  crayon-inline">es()</span>.</p>
<p>Начнём с инициализации экспоненциального сглаживания.</p>
<p>История экспоненциального сглаживания насчитывает дюжины методов задания стартовых значений. Некоторые работают вполне себе неплохо, другие в корне неправильны. Некоторые из них позволяют сохранять данные, в то время как другие уменьшают размер выборки, с которой работает исследователь. В <span class="lang:r decode:true  crayon-inline">es()</span> инициализация экспоненциального сглаживания сделана до начала выборки. То есть вектор \(v_t\), к которому который мы обращались в <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">предыдущих</a> <a href="/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/">статьях</a>, задаётся в функции до первого наблюдения \(y_1\). Это вполне себе согласуется с подходом <a href="http://www.springer.com/gp/book/9783540719168">Hyndman et al. 2008</a>, и в этом случае мы не теряем наблюдения. Тем не менее, само стартовое значение может быть задано в функции по-разному.</p>
<ol>
<li><strong>Оптимизация</strong>. Этот метод означает, что стартовое значение будет подобрано с помощью оптимизатора во время поиска постоянной сглаживания. То есть число параметров, которые нужно оценить, в этом случае увеличивается. Это стандартный метод инициализации в <span class="lang:r decode:true crayon-inline">es()</span> и задаётся он параметром <span class="lang:r decode:true  crayon-inline">initial=&#187;optimal&#187;</span>.</li>
<p>Если оптимизация работает вполне хорошо на месячных данных, то это, к сожалению, не означает, что она так же будет хорошо работать и на данных с более высокой частотностью (например, недельных или дневных). Причиной тому высокое число параметров для подбора. Например, для построения какой-нибудь модели ETS(M,N,M) на недельных данных нужно оценить 52 + 1 + 2 + 1 = 56 параметров (52 сезонных коэффициента, 1 значение для компоненты уровня ряда, 2 постоянных сглаживания и 1 дисперсию остатков). Это непростая задача, и не всегда удаётся её эффективно решить. Поэтому нам могут пригодиться другие методы инициализации ETS.</p>
<p>Посмотрим, что получается, когда мы сталкиваемся с этой проблемой на каком-нибудь примере. Вот, например, ряд <span class="lang:r decode:true  crayon-inline">taylor</span> из пакета <span class="lang:r decode:true crayon-inline">forecast</span>. Это получасовые данные по спросу на электроэнергию. Частота этих данных — 336 (7 дней недели * 48 получасов в сутках). Оценить такое количество параметров достаточно сложно. Тем не менее, посмотрим, что получится, если мы используем стандартную оптимизацию в функции <span class="lang:r decode:true  crayon-inline">es()</span> с автоматическим выбором моделей:</p>
<pre class="decode">es(taylor,"ZZZ",h=336,holdout=TRUE)</pre>
<pre>Forming the pool of models based on... ANN, ANA, ANM, AAA, Estimation progress: 100%... Done!
Time elapsed: 18.47 seconds
Model estimated: ETS(ANA)
Persistence vector g:
alpha gamma 
0.850 0.001 
Initial values were optimised.
340 parameters were estimated in the process
Residuals standard deviation: 250.546
Cost function type: MSE; Cost function value: 56999

Information criteria:
     AIC     AICc      BIC 
51642.90 51712.02 53756.01 
Forecast errors:
MPE: 1%; Bias: 50%; MAPE: 1.8%; SMAPE: 1.8%
MASE: 0.798; sMAE: 1.8%; RelMAE: 0.078; sMSE: 0.1%</pre>
<p>Как говорит нам функция, нам пришлось оценить 340 параметров, а выбор модели занял 18 секунд (при этом было проверено только 5 моделей). В итоге у нас получилось что-то вот такое:</p>
<div id="attachment_1142" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/taylor-es-ANA-optimal.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1142" src="/wp-content/uploads/2017/03/taylor-es-ANA-optimal-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1142" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-ANA-optimal-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-ANA-optimal-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-ANA-optimal-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-ANA-optimal.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1142" class="wp-caption-text">Спрос на электроэнергию и модель ETS(A,N,A), инициализированная с помощью оптимизации</p></div>
<p>Первое, что обращает на себя внимание, это те самые стартовые значения из-за которых первые расчётные значения оказались совершенно неадекватными. Это как раз из-за высокого числа параметров. Неточные стартовые значения &#8212; это плохо, потому что в итоге мы можем выбрать не ту модель (так как все остальны будут инициализированы ещё хуже). Поэтому стоит обратиться к другим методам инициализации.</p>
<li>«<strong>Backcasting</strong>», что-то типа прогноза назад. Это второй метод задания стартовых значения для компонент ETS. В этом случае модель строится несколько раз, используя следующую формулу для построения вперёд:</li>
<p>\begin{equation} \label{eq:ETSANN_Forward}<br />
\begin{matrix}<br />
	y_t = l_{t-1} + \epsilon_t \\<br />
	l_t = l_{t-1} + \alpha \epsilon_t<br />
\end{matrix}<br />
\end{equation}<br />
и вот такую, когда получен финальный прогноз:<br />
\begin{equation} \label{eq:ETSANN_Backward}<br />
\begin{matrix}<br />
	y_t = l_{t+1} + \epsilon_t \\<br />
	l_t = l_{t+1} + \alpha \epsilon_t<br />
\end{matrix}<br />
\end{equation}</p>
<p>То есть в формуле \eqref{eq:ETSANN_Forward} для расчёта следующего значения мы используем предыдущее, в то время как в формуле \eqref{eq:ETSANN_Backward} мы рассчитываем предыдущее на основе следующего. Первую мы используем при расчёте значение с начала выборки до самого её конца, затем разворачиваемся и используем вторую, с конца в начало. Это позволяет уточнить стартовое значение и сделать его близким к самой модели. В функции <span class="lang:r decode:true crayon-inline">es()</span> эта процедура повторяется три раза и может быть вызвана параметром <span class="lang:r decode:true crayon-inline">initial=&#187;backcasting&#187;</span>. Как и упомянуто ранее, эта процедура рекомендуется при работе с недельными, дневными, часовыми и прочими видами сезонности.</p>
<p>Для примера возьмём всё тот же ряд из пакета <span class="lang:r decode:true crayon-inline">forecast</span>:</p>
<pre class="decode">es(taylor,"ZZZ",h=336,holdout=TRUE,initial="b")</pre>
<p>В этот раз процедура заняла около семи секунд:</p>
<pre>Forming the pool of models based on... ANN, ANA, ANM, AAA, Estimation progress: 100%... Done! 
Time elapsed: 6.81 seconds
Model estimated: ETS(MNA)
Persistence vector g:
alpha gamma 
    1     0 
Initial values were produced using backcasting.
3 parameters were estimated in the process
Residuals standard deviation: 0.007
Cost function type: MSE; Cost function value: 38238

Information criteria:
     AIC     AICc      BIC 
49493.46 49493.47 49512.11 
Forecast errors:
MPE: 0.8%; Bias: 40.6%; MAPE: 1.7%; SMAPE: 1.8%
MASE: 0.784; sMAE: 1.7%; RelMAE: 0.076; sMSE: 0.1%</pre>
<p>Функция проверила всё тот же пул моделей и выбрала ETS(M,N,A), оценив всего три параметра вместо 340. Мы в итоге получили странную модель, в которой постоянная сглаживания уровня ряда оказалась равной единице (что соответствует процессу случайного блуждания для уровня), а постоянная сглаживания для сезонности &#8212; равной нулю (что означает, что мы имеем дело с детерминированной сезонной компонентой).</p>
<p>В итоге выглядит это всё вот так:</p>
<div id="attachment_1143" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/taylor-es-MNA-backcasting.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1143" src="/wp-content/uploads/2017/03/taylor-es-MNA-backcasting-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1143" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-MNA-backcasting-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-MNA-backcasting-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-MNA-backcasting-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/taylor-es-MNA-backcasting.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1143" class="wp-caption-text">Спрос на электроэнергию и модель ETS(M,N,A), инициализированная с помощью backcasting</p></div>
<p>Как видим, «backcasting» &#8212; это неплохой метод инициализации, который может быть полезен в тех случаях, когда мы имеем дело с высокочастотными данными. Более того, где-то в глубине этих ваших интернетов есть доказательство того, что эта техника асимптотически даёт такие же значения, как и метод наименьших квадратов. Это по сути означает, что метод (1) и метод (2) по мере увеличения числа наблюдений сходятся друг с другом в оценках парметров.</p>
<li><strong>Произвольные значения</strong>. Если по какой-то причине нам известны стартовые значения (либо из предыдущих экспериментов, либо из похожих данных), то мы можем передать их функции <span class="lang:r decode:true crayon-inline">es()</span> в виде вектора. В этом случае нам помогут параметры <span class="lang:r decode:true crayon-inline">initial</span> и <span class="lang:r decode:true crayon-inline">initialSeason</span>. Функция в этом случае использует эти значения и построит модель, оценивая только постоянные сглаживания. Мы можем предоставить как оба параметра, так и только один из них — в зависимости от стоящей перед нами задачи, функция оценит всё недостающее сама. В случае, если мы работаем с несезонной моделью предоставлять <span class="lang:r decode:true crayon-inline">initialSeason</span> ненужно. Заметим, что использовать backcasting в случае с заданием произвольных значений не получится, функция всегда будет использовать оптимизацию, если что-то ей недодали. Ещё одно важное замечание — <a href="/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/">выбор модели и комбинирование</a> прогнозов не работает с этим методом инициализации.</li>
</ol>
<p>Продолжая наши пример, мы используем классическую декомпозицию для построения модели ETS(M,N,M) по ряду taylor:</p>
<pre class="decode">ourFigure <- decompose(taylor,type="m")$figure
es(taylor,"MNM",h=336,holdout=TRUE,initial=mean(taylor),initialSeason=ourFigure)</pre>
<p>Можно даже сравнить этот метод с двумя другими:</p>
<pre class="decode">es(taylor,"MNM",h=336,holdout=TRUE,initial="o")
es(taylor,"MNM",h=336,holdout=TRUE,initial="b")</pre>
<p>Построение модели в этом случае у меня занимает что-то порядка четырёх секунд, в то время как на <span class="lang:r decode:true crayon-inline">initial="o"</span> нужно потратить 13, а для <span class="lang:r decode:true crayon-inline">initial="b"</span> — около семи. Итоговые модели выглядят очень похоже.</p>
<p>Этот, третий, метод инициализации может быть полезен, если по какой-то причине предыдущие два недоступны (например, нам нужно что-то посчитать быстро и на большом числе рядов данных) и в нашем распоряжении уже имеются стартовые значения. Его можно также использовать для научных экспериментов. Во всех остальных случаях я бы его не рекомендовал к использованию.</p>
<p>В функции <span class="lang:r decode:true crayon-inline">es()</span> есть и другие увлекательные параметры. Например, параметр <span class="lang:r decode:true crayon-inline">persistence</span> позволяет задавать вектор с постоянными сглаживаниями, которые должны по длине соответствовать числу компонент модели (они иду в порядке: уровень, тренд, сезонность), а параметр <span class="lang:r decode:true crayon-inline">phi</span> позволяет задавать значения для параметра демпфирования тренда. Так, например, модель ETS(A,Ad,N), может быть построена по какому-нибудь ряду N1234 из M3 с произвольными заданными значениями:</p>
<pre class="decode">es(M3$N1234$x,"AAdN",h=8,persistence=c(0.2,0.1),phi=0.95)</pre>
<p>Сравнить этот график:</p>
<div id="attachment_1138" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1138" src="/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1138" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-predefined-parameters.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1138" class="wp-caption-text">Ряд N1234 и модель ETS(A,Ad,N) с заданными параметрами</p></div>
<p>с полученным, если эти значения не задавать:</p>
<pre class="decode">es(M3$N1234$x,"AAdN",h=8)</pre>
<div id="attachment_1139" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/N1234-AAdN-optimal.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1139" src="/wp-content/uploads/2017/03/N1234-AAdN-optimal-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1139" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-optimal-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-optimal-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-optimal-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-AAdN-optimal.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1139" class="wp-caption-text">Ряд N1234 и модель ETS(A,Ad,N) с оптимизированными параметрами</p></div>
<p>Естественно, задавать параметры вручную стоит только в том случае, если вам уж невтерпёж, и у вас есть какие-то основания для этого. В противном случае используйте оптимизацию и <del datetime="2017-03-04T23:34:49+00:00">не выпендривайтесь</del> не задумывайтесь об этом.</p>
<p>Ещё одна крутая вещь в функции <span class="lang:r decode:true crayon-inline">es()</span> - это то, что она сохраняет все упомянутые выше значения и возвращает их в виде списка вместе со многими другими полезными параметрами. Например, выберем наилучшую модель по ряду N1234 и сохраним её:</p>
<pre class="decode" >ourModel <- es(M3$N1234$x,"ZZZ",h=8,holdout=TRUE)</pre>
<p>Получиться должен вот такой график:</p>
<div id="attachment_1140" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/N1234-MAN-optimal.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1140" src="/wp-content/uploads/2017/03/N1234-MAN-optimal-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1140" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-optimal-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-optimal-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-optimal-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-optimal.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1140" class="wp-caption-text">Ряд N1234 и модель ETS(M,A,N) с оптимизированными параметрами</p></div>
<p>А теперь используем маленькую, но гордую функцию <span class="lang:r decode:true crayon-inline">model.type()</span> (которая вытаскивает тип модели из сохранённых объектов) и используем точно такую же модель, с теми же параметрами, но уже с большим числом наблюдений в выборке:</p>
<pre class="decode" >es(M3$N1234$x,model.type(ourModel),h=8,holdout=FALSE,initial=ourModel$initial,persistence=ourModel$persistence,phi=ourModel$phi)</pre>
<p>Теперь мы получим ту же самую модель, но с обновлёнными значениями компонент на основе последних восьми наблюдений:</p>
<div id="attachment_1141" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/03/N1234-MAN-predefined.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1141" src="/wp-content/uploads/2017/03/N1234-MAN-predefined-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1141" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-predefined-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-predefined-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-predefined-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/03/N1234-MAN-predefined.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1141" class="wp-caption-text">Ряд N1234 и та же самая модель ETS(M,A,N) построенная по большей выборке</p></div>
<p>На самом деле существует и более простой способ сделать то же самое - для этого достаточно в параметр <span class="lang:r decode:true crayon-inline">model</span> передать нашу модель <span class="lang:r decode:true crayon-inline">ourModel</span> следующим образом:</p>
<pre class="decode">es(M3$N1234$x,model=ourModel,h=8,holdout=FALSE)</pre>
<p>Таким образом мы, например, можем произвести прогнозы методом <a href="/forecasting_toolbox/model-selection/">сдвигающейся точки</a> для выбора наиболее точной прогнозной модели.</p>
<p>Функция <span class="lang:r decode:true crayon-inline">model.type()</span> также работает с функцией <span class="lang:r decode:true crayon-inline">ets()</span> из пакета <span class="lang:r decode:true crayon-inline">forecast</span>. Так что вы можете, например, использовать функцию <span class="lang:r decode:true crayon-inline">ets()</span>, а после сконструировать модель того же типа с помощью <span class="lang:r decode:true crayon-inline">es()</span>:</p>
<pre class="decode" >etsModel <- ets(M3$N1234$x)
es(M3$N1234$x,model=model.type(etsModel),h=8,holdout=TRUE)</pre>
<p>Фух! На сегодня всё. Надеюсь, эта статья помогла вам узнать функцию <span class="lang:r decode:true crayon-inline">es()</span> получше, и теперь вам будет чем заняться, когда нечем заняться… До новых встреч!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/03/05/part-5-essential-parameters/">Пакет «smooth» для R. Функция es(). Часть 5. Важные параметры</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/03/05/part-5-essential-parameters/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Функция es(). Часть 4. Выбор моделей и комбинирование прогнозов</title>
		<link>https://openforecast.org/ru/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/</link>
					<comments>https://openforecast.org/ru/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 24 Jan 2017 20:54:38 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1082</guid>

					<description><![CDATA[<p>Смешенные модели экспоненциального сглаживания В прошлых статьях мы обсудили чистые аддитивные и мультипликативные модели экспоненциального сглаживания. Логичным продолжением было бы обсуждение смешанных моделей, в которых некоторые компоненты имеют аддитивный характер, в то время как другие — мультипликативный. Однако я не хочу тратить на таких моделях много времени и решил упомянуть о них лишь вскользь. А [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/">Пакет «smooth» для R. Функция es(). Часть 4. Выбор моделей и комбинирование прогнозов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Смешенные модели экспоненциального сглаживания</h3>
<p>В прошлых статьях мы обсудили чистые <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">аддитивные</a> и <a href="/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/">мультипликативные</a> модели экспоненциального сглаживания. Логичным продолжением было бы обсуждение смешанных моделей, в которых некоторые компоненты имеют аддитивный характер, в то время как другие — мультипликативный. Однако я не хочу тратить на таких моделях много времени и решил упомянуть о них лишь вскользь. А всё потому, что я считаю, что такие модели не имеют особого смысла. Дело в том, что они противоречат логике моделирования. Ну, возьмём вот, например, какой-нибудь метод экспоненциального сглаживания Хольта-Уинтерса. Он соответствует статистической модели обозначаемой как ETS(A,A,M), в которой ошибка и тренд имеют аддитивный характер, а сезонность мультипликативная. Казалось бы, ничто не предвещает беды. Модель как модель. Однако первые две компоненты подразумевают, что ряд данных может иметь как положительные, так и отрицательные значения (ошибка так вообще считается распределённой нормально), а вот сезонность будет работать только, если мы имеем дело с положительными значениями. Если в ряде данных по какой-то причине будет отрицательное значение или, не дай бог, ноль, то быть беде! Это противоречие в рамках такой модели не разрешимо и является следствием смешения компонент.</p>
<p>Несмотря на это, некоторые смешанные модели работают вполне себе хорошо, когда мы имеем дело с положительными значениями и высоким уровнем ряда. Но не дай бог вам применить такую модель к ряду данных, в которых значения уменьшаются во времени. Например, прогнозировать продажи умирающего товара я бы с помощью таких моделей не стал, так как можно столкнуться с очень странным поведением и совершенно неадекватными прогнозами.</p>
<p>На этом краткое упоминание смешанных моделей можно считать законченным. Перейдём к более интересным вопросам.</p>
<h3>Немного теории о выборе моделей и комбинировании</h3>
<p>Теперь, когда мы так или иначе обсудили все возможные типы моделей экспоненциального сглаживания, время перейти к вопросу о том, как же выбрать из них наиболее подходящую. <a href="http://kourentzes.com/forecasting/2015/07/24/diy-forecasting-judgment-models-and-judgmental-model-selection/" target="_blank">Фотиос Петропулос и Никос Курентзес</a> показали в своём исследовании, что люди способны выбирать наилучшую модель вручную на основе визуального анализа временного ряда. Однако такой метод выбора моделей не всегда приемлем. Компаниям иногда бывает нужно, например, быстро получить прогнозы продаж своей продукции по всем магазинам страны. Это означает, что нужно выбрать наилучшую модель для каждого ряда из огромного массива данных (10000 рядов, например). Делать это вручную каждый раз, когда нужно получить прогноз — сродни сумасшествию. Именно поэтому существуют методы, позволяющие автоматизировать выбор моделей для прогнозирования.</p>
<p>Один из таких методов основан на информационных критериях. Именно он и реализован в функции <span class="lang:r decode:true  crayon-inline">es()</span>. <a href="https://www.researchgate.net/publication/222552350_A_State_Space_Framework_for_Automatic_Forecasting_Using_Exponential_Smoothing_Methods" target="_blank">Роб Хайндман и компания показали в 2002 году</a>, что этот метод работает достаточно хорошо. В <a href="https://www.researchgate.net/publication/223458328_Exponential_smoothing_model_selection_for_forecasting" target="_blank">2006 году Бэкки Билла и др.</a> показали, что метод работает одинаково хорошо с использованием разных информационных критериев. Функция <span class="lang:r decode:true  crayon-inline">es()</span> позволяет осуществлять выбор с помощью AIC, AICc или BIC. Подробней на каждом из критериев мы тут останавливаться не будем, так как они уже были <a href="/forecasting_toolbox/model-selection/">рассмотрены в электронном учебнике</a>. Напомню лишь, что для того, чтобы выбрать наилучшую модель, нужно вначале построить все модели, которые хочется, затем рассчитать информационный критерий для каждой из них, после чего — выбрать ту, у которой критерий имеет наименьшее значение. В природе существует 30 моделей экспоненциального сглаживания, поэтому оценить все 30 из них — это непростая задача, требующая время. Чтобы ускорить этот процесс, я разработал алгоритм, с помощью которого можно из пула моделей выкинуть те, которые к данному временному ряду подходят заведомо плохо. Рассмотрим этот алгоритм подробней.</p>
<ol>
<li>Оценивается модель ETS(A,N,N).</li>
<li>Оценивается модель ETS(A,N,A).</li>
<ul>
<li>Если информационный критерий модели (2) ниже критерия модели (1), значит в ряде данных есть какая-то сезонность. Это значит, что несезонные модели можно исключить, а пул моделей уменьшить с 30 до 20. После этого мы переходим к шагу (3).</li>
<li>В противном случае в ряде данных нет сезонности, все сезонные модели можно убрать из рассмотрения, сократив таким образом пул моделей с 30 до 10. После этого мы переходим к шагу (4) алгоритма.</li>
</ul>
<p>Эти два шага требуют небольшого пояснения. На данном этапе мы не оцениваем наличие тренда в ряде данных, так как ETS(A,N,N) является вполне неплохим аппроксиматором тренда. Безусловно прогноз по такой модели будет некорректным и неточным, но нас это пока не интересует, ряд она будет описывать хорошо. Постоянная сглаживания в этом случае будет близка к единице (а оптимальная и вовсе может быть больше), но это неважно, так как нас интересует на данном шаге определение сезонности. Если ряд сезонный (какой бы ни была сезонность: аддитивной или мультипликативной), то модель ETS(A,N,A) аппроксимирует его лучше, чем ETS(A,N,N). А значит и информационный критерий у неё будет ниже.</p>
<li>Оценивается модель ETS(A,N,M) и сравнивается с предыдущей.</li>
<ul>
<li>Если информационный критерий модели (3) ниже критерия модели (2), значит сезонность носит мультипликативный характер. Это сокращает пул моделей с 20 до 10. Можно переходить к шагу (4).</li>
<li>Иначе сезонность можно считать аддитивной. Это также приводит к сокращению пула моделей с 20 до 10. После этого с чистой совестью можно переходить к шагу (4).</li>
</ul>
<li>Оценивается модель с аддитивным трендом и либо без сезонности, либо с аддитивной или мультипликативной, в зависимости от результатов на шагах (2) и (3). Модель может быть соответственно: ETS(A,A,N), ETS(A,A,A) или ETS(A,A,M).</li>
<ul>
<li>Если информационный критерий на этом шаге ниже критерия на предыдущем, то в ряде данных есть тренд, значит пул моделей сокращается до восьми.</li>
<li>В противоположном случае жизнь становится ещё проще, так как можно сказать, что тренда в данных нет, а значит нужно проверить всего одну модель — с мультипликативной ошибкой. Например, если мы до этого выяснили, что модель ETS(A,N,M) подходит к ряду данных лучше остальных, то нам остаётся только проверить модель ETS(M,N,M).</li>
</ul>
<p>Аддитивный тренд на последнем шаге можно считать хорошей аппроксимацией всех остальных типов трендов. Если такая модель лучше модели без тренда, то далее можно попробовать определить тип тренда.
</ol>
<p>Описанный выше алгоритм позволяет вместо того, чтобы оценивать все 30 моделей, оценить только 4 или 12 из них (в зависимости от того, есть ли в ряде данных тренд или нет). Мои эксперименты показывают, что в большинстве случаев этот алгоритм гарантирует, что у полученной модели будет наименьшее значение информационного критерия. Впрочем, это не означает, что полученная модель будет давать самые точные прогнозы. Из-за разных случайных неучтённых факторов мы могли выбрать не ту модель. Для того, чтобы как-то учесть этот возможный провал, можно вместо того, чтобы выбирать только одну, скомбинировать несколько. Впрочем, нам сами модели менее интересны, чем прогнозы, которые они дают, так что будем комбинировать прогнозы. Тем более, что литература по прогнозированию говорит нам о том, что комбинированный прогноз оказывается в среднем точнее индивидуальных прогнозов моделей.</p>
<p>Очевидно, что вариантов комбинирования существует несчётное множество. Одно дело выбрать модели, чьи прогнозы скомбинировать, совсем другое — распределить веса между ними. Понятно, что веса надо распределять как-то неравномерно, а то модель ETS(A,N,N) будет иметь такой же вес, как и модель ETS(A,N,A) на сезонных данных, а это будет приводить к заведомо плохим результатам. Один из методов распределения весов, показавший свою эффективность — это метод на основе информационных критериев, рассмотренный в книге <a href="https://books.google.co.uk/books/about/Model_Selection_and_Multimodel_Inference.html?id=BQYR6js0CC8C" target="_blank">Burnham and Anderson</a>. В соответствии с этим методом, веса для каждой из моделей в пуле рассчитываются по формуле:</p>
<p>\begin{equation} \label{eq:statLikelihoodAICweights}<br />
	w_j = \frac{ \exp \left(-\frac{1}{2}  \left(\text{IC}_j -\min(\text{IC}) \right) \right)}{\sum_{i=1}^m \exp \left(-\frac{1}{2}  \left(\text{IC}_i -\min(\text{IC}) \right) \right)},<br />
\end{equation}<br />
где \(m\) &#8212; это число моделей в пуле, IC\(_j\) &#8212; значение информационного критерия для модели номер \(j\), а \(\min(\text{IC})\) &#8212; это минимальное значение информационного критерия среди моделей в пуле. Модели с меньшими информационными критериями будут иметь больший вес, чем модели с большими значениями. Причём любой информационный критериq может быть использован вместо IC. К слову, <a href="https://www.researchgate.net/publication/223315940_Combining_exponential_smoothing_forecasts_using_Akaike_weights" target="_blank">Стефан Коласса</a> показал, что при использовании этого метода комбинирования точность прогнозов ETS увеличивается. Этот метод реализован в функции <span class="lang:r decode:true  crayon-inline">es()</span>. О том, как с ним работать в R, мы обсудим в следующем параграфе.</p>
<h3>О том, как с этим работать в R</h3>
<p>Ну что же, посмотрим, как это всё реализовано в функции <span class="lang:r decode:true  crayon-inline">es()</span>? Начнём с простого.</p>
<p>Если мы не очень себе представляем, что делать с данными и надо ли как-то ограничивать пул моделей, то можно попросить функцию выбрать наилучшую из всех возможных 30 моделей. Это делается путём задания параметра <span class="lang:r decode:true  crayon-inline">model=&#187;ZZZ&#187;</span>. Точно так же включается выбор наилучшей модели в функции <span class="lang:r decode:true  crayon-inline">ets()</span> пакета <span class="lang:r decode:true  crayon-inline">forecast</span> (правда в ней происходит выбор из значительно меньшего числа моделей, из 16 вместо 30). В этом случае для выбора модели будет использован алгоритм описанные в предыдущем параграфе.</p>
<p>Например, для ряда N2568 из базы M3 у нас получится вот что:</p>
<pre class="decode">es(M3$N2568$x, "ZZZ", h=18)</pre>
<p>Это даст нам следующее:</p>
<pre>Forming the pool of models based on... ANN, ANA, ANM, AAM, Estimation progress: 100%... Done! 
Time elapsed: 2.6 seconds
Model estimated: ETS(MMdM)
Persistence vector g:
alpha  beta gamma 
0.020 0.020 0.001 
Damping parameter: 0.965
Initial values were optimised.
19 parameters were estimated in the process
Residuals standard deviation: 0.065
Cost function type: MSE; Cost function value: 169626

Information criteria:
     AIC     AICc      BIC 
1763.990 1771.907 1816.309</pre>
<div id="attachment_1079" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/01/N2568-es-MMdM.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1079" src="/wp-content/uploads/2017/01/N2568-es-MMdM-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1079" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-MMdM-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-MMdM-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-MMdM-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-MMdM.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1079" class="wp-caption-text">ETS(MMdM) и ряд N2568 из базы M3</p></div>
<p>Во время выбора модели функция будет сообщать нам, какие модели проверила: вначале это была ETS(A,N,N), затем — ETS(A,N,A), после неё — ETS(ANM) (это говорит о том, что в данных есть сезонность и функция пытается определить её тип), ну и, наконец, &#8212; ETS(A,A,M) (проверяется наличие тренда). Если нам всё это видеть ненужно, мы можем попросить функцию делать всё это про себя путём задания параметра <span class="lang:r decode:true  crayon-inline">silent=&#187;all&#187;</span>. Как видим, в результате этой процедуры наилучшей оказалась модель ETS(M,Md,M).</p>
<p>Заметим, что рассмотренный выше алгоритм выбора модели будет использован функцией только если хотя бы одна из компонент задана как &#171;Z&#187;, а все остальные — как &#171;Z&#187;, &#171;A&#187;, &#171;M&#187; или &#171;N&#187;. Если какие-то компоненты задать вручную (&#171;A&#187;, &#171;M&#187; или &#171;N&#187;), то процесс выбора пройдёт быстрее, так как пул моделей в этом случае уменьшится.</p>
<p>По умолчанию для выбора функция использует AICc, но пользователю так же доступны AIC и BIC:</p>
<pre class="decode">es(M3$N2568$x, "ZZM", h=18, ic="BIC")</pre>
<p>Что же, давайте теперь допустим, что по какой-то причине нас интересуют только аддитивные модели. Как нам выбрать наилучшую из них? Очень просто! Для этого используется значение &#171;X&#187; в компонентах. Например, таким вот образом мы проверим все возможные аддитивные модели экспоненциального сглаживания:</p>
<pre class="decode">es(M3$N2568$x, "XXX", h=18)</pre>
<p>В результате этого получим вот что:</p>
<pre>Estimation progress: 100%... Done! 
Time elapsed: 0.72 seconds
Model estimated: ETS(ANA)
Persistence vector g:
alpha gamma 
0.174 0.695 
Initial values were optimised.
16 parameters were estimated in the process
Residuals standard deviation: 609.711
Cost function type: MSE; Cost function value: 320472

Information criteria:
     AIC     AICc      BIC 
1831.789 1837.284 1875.847</pre>
<div id="attachment_1081" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/01/N2568-es-ANA.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1081" src="/wp-content/uploads/2017/01/N2568-es-ANA-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1081" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-ANA-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-ANA-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-ANA-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-ANA.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1081" class="wp-caption-text">ETS(ANA) и ряда N2568 из базы M3</p></div>
<p>В этом примере функция проверит подряд шесть моделей и выберет наилучшую из них. Пул чистых аддитивных моделей включает: <span class="lang:r decode:true  crayon-inline">ANN</span>, <span class="lang:r decode:true  crayon-inline">AAN</span>, <span class="lang:r decode:true  crayon-inline">AAdN</span>, <span class="lang:r decode:true  crayon-inline">ANA</span>, <span class="lang:r decode:true  crayon-inline">AAA</span> и <span class="lang:r decode:true  crayon-inline">AAdA</span>. Для этого ряда данных наилучшей оказалась ETS(A,N,A).</p>
<p>Похожим образом мы можем выбрать наилучшую модель из чистых мультипликативных. Для этого вместо &#171;X&#187; надо использовать &#171;Y&#187;:</p>
<pre class="decode">es(M3$N2568$x, "YYY", h=18)</pre>
<p>Функция так же проверит все шесть мультипликативных моделей и выберет наилучшую. В этот раз это будет ETS(M,Md,M). Модель <span class="lang:r decode:true  crayon-inline">YYY</span> может быть особенно полезной в случае со значениями ряда, близкими к нулю.</p>
<p>Теперь, зная эти базовые черты, мы можем формировать произвольные пулы моделей, используя &#171;X&#187;, &#171;Y&#187; и &#171;Z&#187;. Например, мы можем составить такой пул моделей: <span class="lang:r decode:true  crayon-inline">MNN</span>, <span class="lang:r decode:true  crayon-inline">MAN</span>, <span class="lang:r decode:true  crayon-inline">MAdN</span>, <span class="lang:r decode:true  crayon-inline">MNM</span>, <span class="lang:r decode:true  crayon-inline">MAM</span>, <span class="lang:r decode:true  crayon-inline">MAdM</span> — используя команду:</p>
<pre class="decode">es(M3$N2568$x, "YXY", h=18)</pre>
<p>Получим вот что:</p>
<pre>Estimation progress: 100%... Done!
Time elapsed: 0.92 seconds
Model estimated: ETS(MAdM)
Persistence vector g:
alpha  beta gamma 
0.021 0.021 0.001 
Damping parameter: 0.976
Initial values were optimised.
19 parameters were estimated in the process
Residuals standard deviation: 0.065
Cost function type: MSE; Cost function value: 169730

Information criteria:
     AIC     AICc      BIC 
1764.062 1771.979 1816.380</pre>
<p>Если все пулы моделей, которые мы рассмотрели выше, нас не устраивают, и мы хотим сформировать какой-то свой собственный, особенный, то его можно передать функции в виде вектора названий:</p>
<pre class="decode">es(M3$N2568$x, c("ANN", "MNN", "AAdN", "AAdM", "MAdM"), h=18)</pre>
<p>В этом случае функция пройдёт через все модели в пуле и выберет наилучшую, которой в данном случае является ETS(M,Ad,M). Обратим внимание на то, что значение информационного критерия моделей ETS(M,Ad,M) и ETS(M,Md,M) очень близки друг к другу. Сразу же возникает вопрос, какой модели отдать предпочтение, если разница между ними настолько ничтожна. Именно такие вещи и мотивируют комбинирование прогнозов.</p>
<p>Комбинирование прогнозов регулируется в <span class="lang:r decode:true  crayon-inline">es()</span> с помощью значения &#171;C&#187;. Опять же, мы можем использовать &#171;Z&#187;, &#171;X&#187;, &#171;Y&#187;, &#171;N&#187;, &#171;A&#187; и &#171;M&#187; вместе с этим значением и комбинировать модели из тех пулов, которые нам нравятся. В простейшем же случае мы можем скомбинировать все 30 моделей вот так (давайте ещё попросим и интервал прогнозный построить):</p>
<pre class="decode">es(M3$N2568$x, "CCC", h=18, intervals=TRUE)</pre>
<p>Получим следующие результаты:</p>
<pre>Estimation progress: 100%... Done!
Time elapsed: 10.04 seconds
Model estimated: ETS(CCC)
Initial values were optimised.
Residuals standard deviation: 438.242
Cost function type: MSE

Information criteria:
Combined AICc 
     1772.198 
95% parametric prediction intervals were constructed</pre>
<p>И вот такой график:</p>
<div id="attachment_1080" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/01/N2568-es-CCC.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1080" src="/wp-content/uploads/2017/01/N2568-es-CCC-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1080" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-CCC-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-CCC-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-CCC-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/01/N2568-es-CCC.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1080" class="wp-caption-text">Кобинированная ETS и ряда N2568 из базы M3</p></div>
<p>Из-за того, что мы задали &#171;C&#187; для всех компонент, функция прошла через все 30 моделей, что заняло около 10 секунд. Но мы могли бы скомбинировать и модели из меньшего пула, если бы знали, как его ограничить. Например, глядя на линейный график нашего ряда, можно заключить, что нам нужна модель с мультипликативной сезонностью:</p>
<pre class="decode">es(M3$N2568$x, "CCM", h=18)</pre>
<p>В этом случае мы скомбинируем 10 моделей, а значит и затратим раза в 3 меньше времени, чем в случае с комбинированием всего подряд.</p>
<p>Можно так же сформировать какой-нибудь экзотический пул на основе &#171;X&#187; и &#171;Y&#187;:</p>
<pre class="decode">es(M3$N2568$x, "CXY", h=18)</pre>
<p>В этом случае пул будет включать 12 моделей: <span class="lang:r decode:true  crayon-inline">ANN</span>, <span class="lang:r decode:true  crayon-inline">AAN</span>, <span class="lang:r decode:true  crayon-inline">AAdN</span>, <span class="lang:r decode:true  crayon-inline">ANM</span>, <span class="lang:r decode:true  crayon-inline">AAM</span>, <span class="lang:r decode:true  crayon-inline">AAdM</span>, <span class="lang:r decode:true  crayon-inline">MNN</span>, <span class="lang:r decode:true  crayon-inline">MAN</span>, <span class="lang:r decode:true  crayon-inline">MAdN</span>, <span class="lang:r decode:true  crayon-inline">MNM</span>, <span class="lang:r decode:true  crayon-inline">MAM</span>, <span class="lang:r decode:true  crayon-inline">MAdM</span>.</p>
<p>Ну, и наконец, мы можем скомбинировать модели из произвольного пула, если в него включить <span class="lang:r decode:true  crayon-inline">CCC</span>:</p>
<pre class="decode">es(M3$N2568$x, c("CCC","ANN", "MNN", "AAdN", "AAdM", "MMdM"), h=18)</pre>
<p>Как видим, функция <span class="lang:r decode:true  crayon-inline">es()</span> предоставляет огромный простор для творчества при выборе моделей и комбинировании прогнозов. Теперь вы можете творить с экспоненциальным сглаживанием всё, что захотите.</p>
<p>На сегодня всё. В следующий раз мы обсудим другие захватывающий параметры функции <span class="lang:r decode:true  crayon-inline">es()</span>. Не переключайтесь!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/">Пакет «smooth» для R. Функция es(). Часть 4. Выбор моделей и комбинирование прогнозов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Функция es(). Часть 3. Мультипликативные модели</title>
		<link>https://openforecast.org/ru/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/</link>
					<comments>https://openforecast.org/ru/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 18 Nov 2016 13:17:19 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1030</guid>

					<description><![CDATA[<p>Голая теория В прошлый раз мы обсуждали аддитивные модели экспоненциального сглаживания, сегодня пришла пора мультипликативных. Вообще в среде прогнозистов имеется некоторый скепсис по поводу мультипликативных моделей экспоненциального сглаживания. Нет, конечно, когда речь заходит о типе сезонности, многие скажут, что нужно использовать мультипликативную, и будут правы (очень многие ряды имеют такой характер сезонности). Однако в случае [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/">Пакет «smooth» для R. Функция es(). Часть 3. Мультипликативные модели</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Голая теория</h3>
<p>В прошлый раз мы обсуждали аддитивные модели экспоненциального сглаживания, сегодня пришла пора мультипликативных.</p>
<p>Вообще в среде прогнозистов имеется некоторый скепсис по поводу мультипликативных моделей экспоненциального сглаживания. Нет, конечно, когда речь заходит о типе сезонности, многие скажут, что нужно использовать мультипликативную, и будут правы (очень многие ряды имеют такой характер сезонности). Однако в случае с трендом, уровнем ряда и ошибкой не всё так однозначно и понятно. Зачем на самом деле умножать уровень на тренд и на ошибку? Что это даёт? Жизнь усложняет, это само собой. Математические выкладки усложняет, это тоже. Точность прогнозов при этом не обязательно возрастает. В общем, проблем добавляется, а результат не очевиден.</p>
<p>Вы спросите меня, зачем тогда вообще эти модели нужны? На то существует как минимум одна причина. Мультипликативные модели подразумевают, что данные, с которыми мы работаем всегда положительны. Это очень полезное свойство, когда нам, например, нужно спрогнозировать уровень продаж, потому что продать -51 ботинок в Апреле 2017 года в принципе невозможно (если не брать в расчёт какие-нибудь технические ошибки). Это и есть та самая причина, по которой мультипликативные модели могут быть нужны.</p>
<p>Давайте посмотрим, в чём их особенность.</p>
<p>Компоненты таких моделей могут быть записаны с помощью натуральных логарифмов в форме, похожей на ту, что <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">мы уже обсуждали</a>:<br />
\begin{equation} \label{eq:ssGeneralMultiplicative}<br />
	\begin{matrix}<br />
		y_t = \exp \left(w&#8217; \log(v_{t-l}) + \log(1+\epsilon_t) \right) \\<br />
		\log(v_t) = F \log(v_{t-l}) + \log (1 + g \epsilon_t)<br />
	\end{matrix} .<br />
\end{equation}<br />
Все обозначения мы уже ввели в <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">предыдущей статье</a>, так что здесь опять обсуждать не будем. Единственное, на что хотелось бы обратить внимание &#8212; это то, что функции \(\exp\) и \(\log\) здесь применяются к векторам поэлементно. То есть \(\log(v_t)\) будет давать вектор, в котором каждая из компонент прологарифмирована. Важно отметить, что все компоненты модели должны быть положительными, иначе она работать не будет.</p>
<p>Модель \eqref{eq:ssGeneralMultiplicative} позволяет записать любые мультипликативные модели в компактной форме. Например, модель с мультипликативным трендом и мультипликативной ошибкой ETS(M,M,N) может быть записана так:<br />
\begin{equation} \label{eq:ssETS(M,M,N)}<br />
	\begin{matrix}<br />
		y_t = \exp \left(\log(l_{t-l}) + \log(b_{t-l}) + \log(1 + \epsilon_t) \right) \\<br />
		\log(l_t) = \log(l_{t-l}) + \log(b_{t-l}) + \log (1 + \alpha \epsilon_t) \\<br />
		\log(b_t) = \log(b_{t-l}) + \log (1 + \beta \epsilon_t)<br />
	\end{matrix} .<br />
\end{equation}<br />
Если теперь взять экспоненту во втором и третьем уравнениях в \eqref{eq:ssETS(M,M,N)}, а также упростить первое, то получится вот такая модель, которая лежит в основе метода Пегельса:<br />
\begin{equation} \label{eq:ssETS(M,M,N)_Pegels}<br />
	\begin{matrix}<br />
		y_t = l_{t-l} b_{t-l} (1 + \epsilon_t) \\<br />
		l_t = l_{t-l} b_{t-l} (1 + \alpha \epsilon_t) \\<br />
		b_t = b_{t-l} (1 + \beta \epsilon_t)<br />
	\end{matrix} .<br />
\end{equation}<br />
Как видим, форма \eqref{eq:ssGeneralMultiplicative} универсальна и объединяет в себе много разных моделей.</p>
<p>Итак, в чём же фишка? Из-за перемножения компонент итоговое значение всегда будет положительным. Однако, в данном случае важно, чтобы ошибка в \eqref{eq:ssGeneralMultiplicative} была распределена лог-нормально:<br />
\begin{equation} \label{eq:ssErrorlogN}<br />
	(1 + \epsilon_t) \sim \text{log}\mathcal{N}(0,\sigma^2),<br />
\end{equation}<br />
здесь \(\sigma^2\) это дисперсия логарифма ошибки \(1 + \epsilon_t\). Почему именно такое распределение? Если эта дисперсия невелика, то, в принципе, совершенно неважно, распределена ли ошибка нормально или лог-нормально, так как оба распределения в этом случае оказываются очень близкими друг к другу. Однако, когда дисперсия становится выше, различия становятся более ощутимыми, хвост лог-нормального распределения становится более длинным. В этом случае допущение о нормальности распределения становится некорректным, так как ошибка \(1 + \epsilon_t\) из-за высокой дисперсии может становиться отрицательной, что делает модель \eqref{eq:ssGeneralMultiplicative} непригодной для прогнозирования. Поэтому допущение \eqref{eq:ssErrorlogN} важно для этой модели.</p>
<p>Само предположение \eqref{eq:ssErrorlogN} приводит к следующим результатам.</p>
<p>Во-первых, с высокой дисперсией и низкими фактическими значениями модель даёт медианные прогнозы, а не средние. Нет, конечно, средние тоже можно дать, но сделать это сложнее, да и особо не имеет смысл, так как <a href="/forecasting_toolbox/data-analysis-stat/">медиана более робастна</a> в случаях с асимметричными распределениями. Это всё становится особенно важным в случае с целочисленным спросом, до которого мы когда-нибудь, возможно, доберёмся.</p>
<p>Во-вторых, прогнозные интервалы оказываются несимметричными как раз из-за предположения \eqref{eq:ssErrorlogN}. Это, опять же, становится более заметно в рядах данных с высокой дисперсией и низким уровнем ряда. В противном случае разницы между интервалами, построенными с помощью мультипликативной и аддитивной моделями, не будет практически никакой.</p>
<p>Ну, и, в-третьих, оценка параметров модели должна осуществляться иначе. Целевая функция для этих моделей может быть выведена из следующей <a href="/2015/08/14/ets-multiplicative-error-term/">логарифмированной функции правдоподобия</a>:<br />
\begin{equation} \label{eq:ssConcentratedLogLikelihoodLnorm}<br />
	\ell(\theta | Y) = -\frac{T}{2} \left( \log \left( 2 \pi e \right) +\log \left( \hat{\sigma}^2 \right) \right) -\sum_{t=1}^T \log y_t ,<br />
\end{equation}<br />
где дисперсия \(\hat{\sigma}^2 = \frac{1}{T} \sum_{t=1}^T \log^2(1 + \epsilon_{t})\). Целевая функция в этом случае будет иметь вид:<br />
\begin{equation} \label{eq:ssCostFunction}<br />
	\text{CF} = \log \left( \hat{\sigma}^2 \right) + \frac{2}{T} \sum_{t=1}^T \log y_t .<br />
\end{equation}</p>
<h3>Штуки в R</h3>
<p>Наглядным примером того, в чём преимущества мультипликативной модели, является ряд N2457 из базы M3. Несмотря на то, что уровень ряда достаточно велик (в среднем что-то около 5000), дисперсия в нём так же велика. Это указывает на то, что предпочтение стоит отдать мультипликативной модели. Попробуем построить модель ETS(M,N,N) с параметрическими прогнозными интервалами:</p>
<pre class="decode" title="Examples of usage" >es(M3$N2457$x, "MNN", h=18, holdout=TRUE, intervals="p")</pre>
<p>Получим вот что:</p>
<pre title="N1234, ETS(AAdN), output of es()" >Time elapsed: 0.1 seconds
Model estimated: ETS(MNN)
Persistence vector g:
alpha 
0.145 
Initial values were optimised.
3 parameters were estimated in the process
Residuals standard deviation: 0.413
Cost function type: MSE; Cost function value: 1288657

Information criteria:
     AIC     AICc      BIC 
1645.978 1646.236 1653.702 
95% parametric prediction intervals were constructed
72% of values are in the prediction interval
Forecast errors:
MPE: 26.3%; Bias: 87%; MAPE: 39.8%; SMAPE: 49.4%
MASE: 2.944; sMAE: 120.1%; RelMAE: 1.258; sMSE: 242.7%</pre>
<p>Мы уже обсуждали в <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">предыдущей статье</a>, что значит каждая из этих строчек, так что останавливаться на этом не будем. Самой важной строкой для нас является &#171;Residuals standard deviation: 0.413&#187;, в которой говорится о том, что стандартное отклонение остатков модели составило 0.413. То есть дисперсия модели составила что-то порядка 0.17. Это, на самом деле, достаточно много для мультипликативной модели и указывает на несимметричность распределения остатков, что находит отражение в следующих прогнозных интервалах:<br />
<div id="attachment_1032" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/11/N2457-MNN-PI-parametric.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1032" src="/wp-content/uploads/2016/11/N2457-MNN-PI-parametric-300x175.png" alt="Ряд N2457 из M3 и прогноз и интервал по модели es(&quot;MNN&quot;)" width="300" height="175" class="size-medium wp-image-1032" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-MNN-PI-parametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-MNN-PI-parametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-MNN-PI-parametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-MNN-PI-parametric.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1032" class="wp-caption-text">Ряд N2457 из M3 и прогноз и интервал по модели es(&#171;MNN&#187;)</p></div>
<p>Если бы мы построили модель с аддитивной ошибкой, ETS(A,N,N), то получили бы вот что:<br />
<div id="attachment_1033" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/11/N2457-ANN-PI-parametric.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1033" src="/wp-content/uploads/2016/11/N2457-ANN-PI-parametric-300x175.png" alt="Ряд N2457 из M3 и прогноз и интервал по модели es(&quot;ANN&quot;)" width="300" height="175" class="size-medium wp-image-1033" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-ANN-PI-parametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-ANN-PI-parametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-ANN-PI-parametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2457-ANN-PI-parametric.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1033" class="wp-caption-text">Ряд N2457 из M3 и прогноз и интервал по модели es(&#171;ANN&#187;)</p></div>
<p>Если сравнить эти два графика, то мы заметим, насколько отличаются у двух моделей прогнозные интервалы. Более того, у первой прогнозный интервал оказался более адекватным и накрыл большее число наблюдений, чем у второй. Как видим, в подобных ситуациях мультипликативные модели оказываются полезными.</p>
<p>Ну, и для очистки совести пример, в котором разница между аддитивной и мультипликативной моделями практически отсутствует. Это ряд N2348:<br />
<div id="attachment_1034" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/11/N2348-MNN-PI-parametric.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1034" src="/wp-content/uploads/2016/11/N2348-MNN-PI-parametric-300x175.png" alt="Ряд N2348 из M3 и прогноз и интервал по модели es(&quot;MNN&quot;)" width="300" height="175" class="size-medium wp-image-1034" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-MNN-PI-parametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-MNN-PI-parametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-MNN-PI-parametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-MNN-PI-parametric.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1034" class="wp-caption-text">Ряд N2348 из M3 и прогноз и интервал по модели es(&#171;MNN&#187;)</p></div>
<div id="attachment_1035" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/11/N2348-ANN-PI-parametric.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1035" src="/wp-content/uploads/2016/11/N2348-ANN-PI-parametric-300x175.png" alt="Ряд N2348 из M3 и прогноз и интервал по модели es(&quot;ANN&quot;)" width="300" height="175" class="size-medium wp-image-1035" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-ANN-PI-parametric-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-ANN-PI-parametric-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-ANN-PI-parametric-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N2348-ANN-PI-parametric.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1035" class="wp-caption-text">Ряд N2348 из M3 и прогноз и интервал по модели es(&#171;ANN&#187;)</p></div>
<p>Как видим, прогнозные интервалы и точечные прогнозы у обеих моделей оказались очень схожими. В таких случаях не настолько важно, какой модели отдать предпочтение, можно выбрать ту, с которой удобней работать.</p>
<p>Вот такие дела.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/">Пакет «smooth» для R. Функция es(). Часть 3. Мультипликативные модели</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Функция es(). Часть 2. Аддитивные модели</title>
		<link>https://openforecast.org/ru/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/</link>
					<comments>https://openforecast.org/ru/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 02 Nov 2016 09:27:21 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=981</guid>

					<description><![CDATA[<p>Немного статистики Как уже упоминалось в предыдущей статье, для пакета &#171;smooth&#187; написана документация с подробный объяснением всех моделей, лежащих в основе функций. Здесь мы обсудим несколько основных аспектов, касающихся функции es(). Сегодня мы обсудим аддитивные модели. У этих моделей все компоненты представлены не в мультипликативном виде, что облегчает их понимание и построение. Функция es() использует [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">Пакет «smooth» для R. Функция es(). Часть 2. Аддитивные модели</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Немного статистики</h3>
<p>Как уже упоминалось <a href="/2016/10/14/smooth-es-part-1-ru/">в предыдущей статье</a>, для пакета &#171;smooth&#187; написана документация с подробный объяснением всех моделей, лежащих в основе функций. Здесь мы обсудим несколько основных аспектов, касающихся функции <span class="lang:r decode:true  crayon-inline " >es()</span>. Сегодня мы обсудим аддитивные модели. У этих моделей все компоненты представлены не в мультипликативном виде, что облегчает их понимание и построение.</p>
<p>Функция <span class="lang:r decode:true  crayon-inline " >es()</span> использует математическую модель пространства состояний (State-Space model, к которой мы, возможно, когда-нибудь доберёмся в учебнике на этом сайте) с единым источником ошибки (Single Source of Error). Практически все основные элеименты модели взяты из книги <a href="http://www.springer.com/gp/book/9783540719168" target="_blank">Hyndman et al. (2008)</a>. Преимущество этой модели заключается в том, что она позволяет записать в компактной форме любой метод экспоненциального сглаживания. Однако модель, лежащая в основе функции <span class="lang:r decode:true  crayon-inline " >es()</span> имеет несколько отличий по сравнению с обсуждаемой в упомянутой выше книге. Одно из важнейших отличий заключается в том, как моделируют сезонные компоненты у нас и у них: в то время, как они используют фиктивные переменные, мы используем для тех же целей лаговые. Есть и другие отличии, но мы о них поговорим несколько позже.</p>
<p>Сегодня мы обсуждаем аддитивную модель. Записывается она следующим образом:<br />
\begin{equation} \label{eq:ssGeneralAdditive}<br />
	\begin{matrix}<br />
		y_t = w&#8217; v_{t-l} + \epsilon_t \\<br />
		v_t = F v_{t-l} + g \epsilon_t<br />
	\end{matrix} ,<br />
\end{equation}<br />
где \(y_{t}\) &#8212; это фактическое значения на наблюдении \(t\), \(v_{t}\) &#8212; это вектор состояний (содержащий в себе компоненты временного ряда, такие как уровень ряда, тренд и сезонность), \(w\) и \(F\) &#8212; это заданные измерительный вектор и матрица переходов, а \(g\) &#8212; это вектор постоянства (не знаю, как его правильно перевести&#8230; В общем, он в себе содержит постоянные сглаживания). Наконец, \(\epsilon_t\) &#8212; это ошибка модели, относительно которой, в случае с аддитивной моделью, обычно делают предположение о том, что она распределена нормально.</p>
<p>Используя эти обозначения, любая аддитивная модель экспоненциального сглаживания может быть записана в виде \eqref{eq:ssGeneralAdditive}. Например, модель с демпфированным трендом, обозначающаяся обычно так же как ETS(A,Ad,N), имеет следующую структуру:<br />
\begin{equation} \label{eq:ssAAdNMatrices}<br />
w = 	\begin{pmatrix}<br />
		1 \\ \phi<br />
	\end{pmatrix},<br />
F = 	\begin{pmatrix}<br />
		1 &#038; \phi \\<br />
		0 &#038; \phi<br />
	\end{pmatrix},<br />
g = 	\begin{pmatrix}<br />
		\alpha \\<br />
		\beta<br />
	\end{pmatrix},<br />
v_t = 	\begin{pmatrix}<br />
		l_t \\<br />
		b_t<br />
	\end{pmatrix},<br />
v_{t-l} = 	\begin{pmatrix}<br />
		l_{t-1} \\<br />
		b_{t-1}<br />
	\end{pmatrix} .<br />
\end{equation}<br />
Подставляя эти значения в \eqref{eq:ssGeneralAdditive}, мы получим модель, которая, возможно, известна некоторым из вас:<br />
\begin{equation} \label{eq:ssAAdN}<br />
	\begin{matrix}<br />
		y_t = l_{t-1} + \phi b_{t-1} + \epsilon_t \\<br />
		l_t = l_{t-1} + \phi b_{t-1} + \alpha \epsilon_t \\<br />
		b_t = \phi b_{t-1} + \beta \epsilon_t<br />
	\end{matrix} ,<br />
\end{equation}<br />
где \(l_t\) &#8212; уровень ряда, \(b_t\) &#8212; тренд, \(\phi\) &#8212; параметр демпфирования тренда, \(\alpha\) и \(\beta\) &#8212; параметры сглаживания. Эта же модель приведена в упомянутом уже дважды учебнике. Так что модели без сезонности, реализованные в <span class="lang:r decode:true  crayon-inline " >es()</span> не отличаются практически ничем от несезонных моделей функции <span class="lang:r decode:true  crayon-inline " >ets()</span> пакета forecast. Однако различия начинают проявляться, когда мы обращаемся к сезонным компонентам&#8230;</p>
<p>Если вы обратили внимание, у вектора \(v_{t-l}\) в \eqref{eq:ssGeneralAdditive} есть индекс \(l\), который мы ещё не обсудили. Этот индекс указывает на то, что компоненты временного ряда могут иметь разные лаги. Например, сезонная компонента будет иметь какой-нибудь лаг \(m\) (в случае с месячными данными \(m=\)12), в то время как все остальные будут использоваться с лагом 1. Например, простая аддитивная сезонная модель ETS(A,A,A) имеет в нашей реализации следующую структуру вектора состояний:<br />
\begin{equation} \label{eq:ssETS(A,A,A)StateVector}<br />
	v_{t-l} =<br />
	\begin{pmatrix}<br />
		l_{t-1} \\<br />
		b_{t-1} \\<br />
		s_{t-m}<br />
	\end{pmatrix} ,<br />
\end{equation}<br />
где, как видим, уровень и тренд имеют лаг 1, а сезонная компонента имеет лаг \(m\). Если мы теперь подставим значения \eqref{eq:ssETS(A,A,A)StateVector} в \eqref{eq:ssGeneralAdditive}, то мы получим широко известную в узких кругах аддитивную модель Хольта-Уинтерса:<br />
\begin{equation} \label{eq:ssETS(A,A,A)}<br />
	\begin{matrix}<br />
		y_t = l_{t-1} + b_{t-1} + s_{t-m} + \epsilon_t \\<br />
		l_t = l_{t-1} + b_{t-1} + \alpha \epsilon_t \\<br />
		b_t = b_{t-1} + \beta \epsilon_t \\<br />
		s_t = s_{t-m} + \gamma \epsilon_t<br />
	\end{matrix} .<br />
\end{equation}</p>
<p>В случае с моделями из книги <a href="http://www.springer.com/gp/book/9783540719168" target="_blank">Hyndman et al. (2008)</a> в \eqref{eq:ssETS(A,A,A)} нужно было бы добавить \(m-1\) сезонную компоненту, каждая из которых не обновлялась бы на данном наблюдении. Суть модели бы не поменялась, но размер её увеличился бы. По сути, используя лаговую структуру, мы уменьшаем размеры \(v_t, w, F\) и \(g\), что позволяет упростить некоторые выкладки и требует проводить по-другому нормализацию сезонных компонент (не как в четырежды упомянутой книге). Финальные прогнозы от использования такой структуры могут быть другими, но незначительно, все статистические свойства модели сохраняются. Например, концентрированная логарифмированная функция правдоподобия для неё считается точно так же, как и для оригинальной ETS:<br />
\begin{equation} \label{eq:ssConcentratedLogLikelihoodNorm}<br />
	\ell(\theta | Y) = -\frac{T}{2} \left( \log \left( 2 \pi e \right) +\log \left( \hat{\sigma}^2 \right) \right),<br />
\end{equation}<br />
где \(\theta\) &#8212; это вектор параметров модели, а \(T\) &#8212; число наблюдений. Функция правдоподобия \eqref{eq:ssConcentratedLogLikelihoodNorm} может быть использована для <a href="/forecasting_toolbox/estimation-advanced-methods/">оценки параметров модели</a>, а так же для расчёта информационных критериев и <a href="/forecasting_toolbox/model-selection/">выбора оптимальной модели</a>.</p>
<h3>Пара примеров в R</h3>
<p>Впрочем, хватит всякой статистики и непонятных слов. Посмотрим, как оно работает. Для наших примеров мы будем использовать временные ряды из базы M3, которая доступна в пакете &#171;Mcomp&#187; для R, так что не забудьте его <a href="/using-r/">установить</a> и загрузить (<span class="lang:r decode:true  crayon-inline " >library(Mcomp)</span>).</p>
<p>Начнём с оценки модели по ряду N1234. В этом ряде имеется явные возрастающий тренд, а для прогнозирования таких рядов имеет смысл обратиться к модели демпфированного тренда (об этом нам говорит научная литература). Сделаем это с помощью команды:</p>
<pre class="decode" title="Examples of usage" >es(M3$N1234$x, "AAdN", h=8, intervals=TRUE)</pre>
<p>В результате этого мы получим две вещи: вывод функции и следующий график:<br />
<div id="attachment_987" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/10/N1234-AAdN.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-987" src="/wp-content/uploads/2016/10/N1234-AAdN-300x175.png" alt="Ряд N1234 из базы M3 и прогноз с помощью es()" width="300" height="175" class="size-medium wp-image-987" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-987" class="wp-caption-text">Ряд N1234 из базы M3 и прогноз с помощью es()</p></div>
<p>Если график вам ненужен, то можете попросить функцию его не выводить с помощью параметра <span class="lang:r decode:true  crayon-inline " >silent=&#187;graph&#187;</span>. Если вам ненужно, чтобы функция что-либо печатал по итогам работы, то это можно сделать так:</p>
<pre class="decode" title="Examples of usage" >ourModel <- es(M3$N1234$x, "AAdN", h=8, intervals=TRUE, silent="graph")</pre>
<p>В случаях с выбором наилучшей модели и комбинированием прогнозов (которые мы обсудим позже), может быть полезно указать, чтобы функция вообще заткнулась и ничего не выводила. Для этого надо задать<span class="lang:r decode:true  crayon-inline " >silent="all"</span> или <span class="lang:r decode:true  crayon-inline " >silent=TRUE</span>.</p>
<p>Итак, что же там у нас получилось в выводе? А вот что:</p>
<pre title="N1234, ETS(AAdN), output of es()" >Time elapsed: 0.15 seconds
Model estimated: ETS(AAdN)
Persistence vector g:
alpha  beta
0.623 0.26
Damping parameter: 0.964
Initial values were optimised.
6 parameters were estimated in the process
Residuals standard deviation: 75.206
Cost function type: MSE; Cost function value: 4902

Information criteria:
     AIC     AICc      BIC 
522.0857 524.2962 532.9256 

95% parametric prediction intervals were constructed</pre>
<p>Первые две строки говорят нам о том, сколько времени ушло на работу функции и какую модель мы оценили.</p>
<p>"Persistence vector g" - это тот самый вектор постоянства с постоянными сглаживания из \eqref{eq:ssGeneralAdditive}. В нашем случае он содержит две постоянные сглаживания (для уровня и для тренда).</p>
<p>"Damping parameter" показывает значение параметра демпфирования тренда.</p>
<p>Фраза "Initial values were optimised" говорит о том, что стартовые значения вектора состояний \(v_0\) были оптимизированы. Альтернативные варианты - это инициализация с помощью механизма обратного прогноза (backcast) или задание этих значений вручную пользователем.</p>
<p>Далее нам говорят о том, что при построении модели было оценено 6 параметров ("6 parameters were estimated in the process"). В них входят: 2 постоянные сглаживания, 2 стартовых значения, 1 параметр демпфирования и 1 оценённая дисперсия. Дисперсия тут считается для корректного учёта степеней свободы модели.</p>
<p>За этой строкой нам приводят значение стандартного отклонения ошибок, которое составило 75.206. Это несмещённая оценка стандартного отклонения, учитывающая количество степеней свободы и рассчитывающаяся по формуле:<br />
\begin{equation} \label{eq:sd_Value}<br />
	s = \sqrt{\frac{1}{T-k} \sum_{t=1}^T e_t },<br />
\end{equation}<br />
где \(k\) - это число параметров модели (в нашем случае - 6, как мы уже выяснили). Само по себе стандартное отклонение нам мало о чём говорит. Однако его можно, по идеи, использовать для сравнения разных моделей с аддитивной ошибкой.</p>
<p>Далее нам говорят, что в качестве целевой функции использовалась <a href="/forecasting_toolbox/estimation-simple-methods/">MSE</a>, и приводят итоговое значение. Это чисто информация для любопытных.</p>
<p>Строка "Information criteria" и следующая за ней таблица - это значения <a href="/forecasting_toolbox/model-selection/">информационных критериев</a>. С помощью них можно выбрать наиболее подходящую модель для данного временного ряда.</p>
<p>Ну, и, наконец, нам написали о том, что функция так же построила 95% параметрические прогнозные интервалы.</p>
<p>Всё вот это вот, фактически, говорит нам о том, чего можно ожидать от итогового объекта <span class="lang:r decode:true  crayon-inline " >ourModel</span>, который по сути своей представляет собой список (list). Например, <span class="lang:r decode:true  crayon-inline " >ourModel$model</span> содержит в себе название модели, а прогнозы хранятся в <span class="lang:r decode:true  crayon-inline " >ourModel$forecast</span>. Обо всём этом написано подробно в помощи к функции в R.</p>
<p>Что ж, попробуй теперь усложнить себе жизнь и посмотрим, как модель себя ведёт на <a href="/forecasting_toolbox/models_quality/">проверочной части</a> выборки:</p>
<pre class="decode" title="Examples of usage" >y <- ts(c(M3$N1234$x,M3$N1234$xx),start=start(M3$N1234$x),frequency=frequency(M3$N1234$x))
es(y, "AAdN", h=8, holdout=TRUE, intervals=TRUE)</pre>
<p>Итоговый график похож на предыдущий, но теперь на нём ещё есть значения из проверочной выборки:<br />
<div id="attachment_988" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/10/N1234-AAdN-holdout.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-988" src="/wp-content/uploads/2016/10/N1234-AAdN-holdout-300x175.png" alt="Ряд N1234 из базы M3, прогноз с помощью es() и фактические значения из проверочной выборки" width="300" height="175" class="size-medium wp-image-988" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-holdout-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-holdout-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-holdout-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/10/N1234-AAdN-holdout.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-988" class="wp-caption-text">Ряд N1234 из базы M3, прогноз с помощью es() и фактические значения из проверочной выборки</p></div>
<p>Как видим, мы не сумели дать точный точечный прогноз ряда, однако прогнозные интервалы накрыли фактические значения, что указывает на то, что ещё не всё потеряно, и мы хотя бы  правильно смогли оценить неопределённость. Что касается вывода в консоли, то у меня получилось следующее:</p>
<pre title="N1234, ETS(AAN), holdout, output of es()" >Time elapsed: 0.18 seconds
Model estimated: ETS(AAdN)
Persistence vector g:
alpha  beta 
0.623 0.260 
Damping parameter: 0.964
Initial values were optimised.
6 parameters were estimated in the process
Residuals standard deviation: 75.206
Cost function type: MSE; Cost function value: 4902

Information criteria:
     AIC     AICc      BIC 
522.0857 524.2962 532.9256 

95% parametric prediction intervals were constructed
88% of values are in the prediction interval
Forecast errors:
MPE: -3.2%; Bias: -100%; MAPE: 3.2%; SMAPE: 3.2%
MASE: 4.183; sMAE: 3.7%; RelMAE: 3.436; sMSE: 0.2%</pre>
<p>Здесь помимо уже упомянутых ранее строк, появились строка о том, какой процент фактических значений оказались в прогнозном интервале (88%), а так же теперь представлены разные прогнозные ошибки, которые <a href="/forecasting_toolbox/models_quality/">мы как-то обсуждали в учебнике</a>. Единственная новая для нас - это Bias, которая измеряет симметричность распределения ошибки и лежит в пределах от -100% (прогноз оказался завышен) до 100% (систематическое занижение прогноза). Сами по себе ошибки мало о чём говорят (за исключением наверно, Bias и RelMAE: первая говорит о том, что мы сильно промахнулись с нашим прогнозом, вторая говорит о том, что простой метод Naive дал прогнозы в 3,436 раза более точные, чем по нашему методу), поэтому их стоит сравнивать с ошибками по другим моделям. Например, по модели ETS(A,A,N) у меня получились следующие ошибки:</p>
<pre title="N1234, ETS(AAN), holdout, output of es()" >MPE: -3.7%; Bias: -100%; MAPE: 3.7%; SMAPE: 3.6%
MASE: 4.82; sMAE: 4.3%; RelMAE: 3.958; sMSE: 0.2%</pre>
<p>Как видим, модель ETS(A,Ad,N) оказалась несколько точней, чем модель ETS(A,A,N).</p>
<p>Все эти прогнозные ошибки хранятся в объекте <span class="lang:r decode:true  crayon-inline " >ourModel$accuracy</span> в виде вектора. Кроме того, из-за того, что мы использовали параметр <span class="lang:r decode:true  crayon-inline " >holdout=TRUE</span>, нам стала доступна ещё одна переменная - фактические значения из проверочной части выборки: <span class="lang:r decode:true  crayon-inline " >ourModel$holdout</span>. Они могут быть использованы для расчёта каких-нибудь ещё ошибок. Ни в чём себе не отказывайте!</p>
<p>Чуть ранее мы упомянули про особенности сезонных моделей, так что давайте взглянем на какой-нибудь пример такой модели. Возьмём простую модель, без тренда, ETS(A,N,A) и построим её для ряда N1956:</p>
<pre class="decode" title="N1956, ETS(ANA)" >ourModel <- es(M3$N1956$x, "ANA", h=18)</pre>
<p>Получим вот такой график:<br />
<div id="attachment_992" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2016/11/N1956-ANA.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-992" src="/wp-content/uploads/2016/11/N1956-ANA-300x175.png" alt="Ряд N1956 из базы M3 и его прогноз с помощью es()" width="300" height="175" class="size-medium wp-image-992" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N1956-ANA-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N1956-ANA-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N1956-ANA-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2016/11/N1956-ANA.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-992" class="wp-caption-text">Ряд N1956 из базы M3 и его прогноз с помощью es()</p></div>
<p>Особо ничего по этому графику не скажешь кроме того, что выглядит всё достаточно адекватно. Если бы мы сравнили итоговую модель с оценённой с помощью <span class="lang:r decode:true  crayon-inline " >ets()</span>, мы бы заметили мелкие различия - постоянные сглаживания и стартовые значения, скорее всего, различались бы, стандартное отклонение ошибки было бы другим, информационные критерии так же отличались бы. Это в свою очередь влияет на прогнозы модели. Вот пример прогнозов, полученных с помощью функций <span class="lang:r decode:true  crayon-inline " >es()</span> и <span class="lang:r decode:true  crayon-inline " >ets()</span>:</p>
<table>
<thead>
<tr>
<td>h</td>
<td><span class="lang:r decode:true  crayon-inline " >es()</span></td>
<td><span class="lang:r decode:true  crayon-inline " >ets()</span></td>
</tr>
</thead>
<tr>
<td>1</td>
<td>3106.583</td>
<td>3105.761</td>
</tr>
<tr>
<td>2</td>
<td>3592.868</td>
<td>3580.976</td>
</tr>
<tr>
<td>3</td>
<td>4395.580</td>
<td>4389.775</td>
</tr>
<tr>
<td>4</td>
<td>5044.109</td>
<td>5052.459</td>
</tr>
<tr>
<td>5</td>
<td>4305.332</td>
<td>4364.522</td>
</tr>
<tr>
<td>6</td>
<td>3650.615</td>
<td>3733.528</td>
</tr>
</table>
<p>Как видим, для некоторых наблюдений разницы практически нет никакой (например, для \(h=\)1). Однако есть несколько случаев, где отклонения оказываются чуть серьёзней (например, -82.913 при \(h=\)6). Впрочем, разница между прогнозами в среднем всё равно составляет не больше 0,431% от среднего уровня данных. Эти 0,431%, конечно, могут в итоге определить, что одна функция дала более точный прогноз, чем вторая, однако, какая из них лучше, сказать без проверочной выборки сложно.</p>
<p>Фух! На сегодня, пожалуй, всё. В следующий раз мы взглянем на мультипликативные модели - там есть важные различия по сравнению с моделями в основе <span class="lang:r decode:true  crayon-inline " >ets()</span>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">Пакет «smooth» для R. Функция es(). Часть 2. Аддитивные модели</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет &#171;smooth&#187; для R. Функция es(). Часть 1</title>
		<link>https://openforecast.org/ru/2016/10/14/smooth-es-part-1-ru/</link>
					<comments>https://openforecast.org/ru/2016/10/14/smooth-es-part-1-ru/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 14 Oct 2016 15:29:45 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[О функции es()]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[программирование]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=873</guid>

					<description><![CDATA[<p>Итак, свершилось! Пакет, над которым я работал последние года полтора, наконец выложен в CRAN. Как это водится, вся документация в пакете &#8212; на английском языке: и винеты, и даже написанный мною собственноручно огроменный документ с подробным описанием того, что там творится внутри. Поэтому, чтобы донести смысл пакета до рускоязычной аудитории, я попытаюсь в серии постов [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/10/14/smooth-es-part-1-ru/">Пакет &#171;smooth&#187; для R. Функция es(). Часть 1</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Итак, свершилось! Пакет, над которым я работал последние года полтора, наконец выложен в <a href="https://cran.r-project.org/package=smooth" target="_blank">CRAN</a>. Как это водится, вся документация в пакете &#8212; на английском языке: и <a href="https://cran.r-project.org/package=smooth/vignettes/smooth.html" target="_blank">винеты</a>, и даже написанный мною собственноручно огроменный <a href="https://github.com/config-i1/smooth/blob/master/inst/doc/smooth-Documentation.pdf" target="_blank">документ</a> с подробным описанием того, что там творится внутри. Поэтому, чтобы донести смысл пакета до рускоязычной аудитории, я попытаюсь в серии постов рассказать о том, что за функции находятся в пакете, зачем они нужны, как работают и что дают.</p>
<p>Начнём мы с Экспоненциального сглаживания.</p>
<h3>Что такое es(), и зачем она нужна?</h3>
<p>Вообще &#171;ES&#187; это сокращение от Exponential Smoothing (Экспоненциальное сглаживание). В R для этого уже существует функция под названием <span class="lang:r decode:true  crayon-inline " >ets()</span>, она входит в пакет &#171;<a href="https://github.com/robjhyndman/forecast">forecast</a>&#187; Роба Хайндамана. В связи с этим может возникнуть вопрос: &#171;Зачем нам ещё одна функция экспоненциального сглаживания?&#187;. На него у меня есть несколько ответов:</p>
<ol>
<li>Функция <span class="lang:r decode:true  crayon-inline " >ets()</span> не позволяет строить некоторые смешанные модели экспонениального сглаживания. Например, ETS(A,A,M), которая лежит в основе классического метода Хольта-Уинтерса, не доступна. Из исследовательского интереса, в попытке восстановить справедливость, я реализовал все 30 моделей экспоненциального сглаживания. Ни в чём себе не отказывайте!</li>
<li><span class="lang:r decode:true  crayon-inline " >ets()</span> не позволяет включать в модель экзогенные переменные. То есть, если вы считаете, что на объём продаж мороженого может влиять температура, но вы хотите использовать ещё и модель экспоненциального сглаживания, то вам можно только посочувствовать. Или можно было до появления пакета &#171;smooth&#187;. Функция <span class="lang:r decode:true  crayon-inline " >es()</span> позволяет включать либо вектор с экзогенной переменной, либо матрицу с экзогенными переменными. Прогнозируйте мороженое правильно!</li>
<li>В области прогнозирования есть общее представление о том, что комбинирование прогнозов разных моделей позволяет увеличивать их точность. Так Стефан Коласса <a href="http://econpapers.repec.org/article/eeeintfor/v_3a27_3ay_3a_3ai_3a2_3ap_3a238-251.htm" target="_blank">применил</a> <a href="http://www.springer.com/la/book/9780387953649" target="_blank">идею с комбинированием на основе инфорационных критериев</a> к моделям экспоненциального сглаживания и показал, что точность прогнозов от этого увеличивается. В функции <span class="lang:r decode:true  crayon-inline " >es()</span> этот механизм комбинирования реализован. Даёшь комбинацию!</li>
<li>Число сезонных коэффициентов в функции <span class="lang:r decode:true  crayon-inline " >ets()</span> ограничено 24. Причиной этого является сложность оптимизации моделей, в которых число коэффициентов оказывается большим. В функции <span class="lang:r decode:true  crayon-inline " >es()</span> такого ограничения нет. Я считаю, что пользователь должен сам нести ответственность за свои действия, ограничивать его как маленького ребёнка не стоит. Однако, если у вас высокочастотные данные и большое количество параметров, возможно стоит попробовать другие методы инициализации экспоненциального сглаживания. Будьте бдительны!</li>
<li>Собственно говоря, методы инициализации вектора состояний &#8212; это ещё один элемент, выгодно отличающий мою функцию от функции Роба. В случае с <span class="lang:r decode:true  crayon-inline " >es()</span> пользователь может либо оптимизировать стартовое значение, либо рассчитать его с помощью процедуры &#171;backcasting&#187;, либо задать вручную. Выбор за вами!</li>
<li>Помимо стандартных методов оценки параметров модели, в <span class="lang:r decode:true  crayon-inline " >es()</span> вы можете ещё встретить методы, основанные на минимуме <a href="/forecasting_toolbox/estimation-simple-methods/">MAE</a>, <a href="/forecasting_toolbox/estimation-advanced-methods/">траекторных функций и HAM</a>. Зачем? А затем, что они позволяют получать более робастные модели, что может быть необходимо, например, в случаях с высокочастотными данными. Ну, и ещё просто потому, что так интересней жить!</li>
<li>В литературе по прогнозированию существует тьма тьмущая методов построения прогнозных интервалов. В функции <span class="lang:r decode:true  crayon-inline " >es()</span> есть выбор из трёх: параметрические, полупараметрические и непараметрические. В каких-то случаях, например, непараметрические интервалы могут оказаться значительно более полезными, нежели параметрические. В конце концов, не сошёлся же клином мир на нормальном распределении!</li>
<li>Статистическая модель в основе <span class="lang:r decode:true  crayon-inline " >es()</span> несколько отличается от модели в основе <span class="lang:r decode:true  crayon-inline " >ets()</span>. В частности, в случае с мультипликативными ошибками <span class="lang:r decode:true  crayon-inline " >es()</span> использует <a href="/2015/08/14/ets-multiplicative-error-term/">допущение о лог-нормальном</a> законе распределения ошибок (а не нормальном, как в случае с классической ETS). Это оказывается особенно важно, когда уровень прогнозируемой величины близок к нулю. Вы не поверите, на какие чудеса способна лог-нормальная модель!</li>
<li><span class="lang:r decode:true  crayon-inline " >es()</span> позволяет работать с целочисленными данными и ситуациями с нулевыми значениями (то что в заморской литературе называется &#171;intermittent demand&#187;). Пока что в функции реализованы модель Кростона, TSB и модель с фиксированной вероятностью. Всё это основано на <a href="/2016/07/01/19th-iif-workshop/">текущем исследовании с Джоном Бойланом</a> и ещё будет дорабатываться. Следите за обновлениями!</li>
<li>Ну, и последнее, это замечательный параметр <span class="lang:r decode:true  crayon-inline " >holdout</span>, который позволяет делить выборку на две части на лету и оценивать точность прогнозов по тестовой выборке. Где ещё вы найдёте такую прелесть?!</li>
</ol>
<p>Замечу, что при этом функция <span class="lang:r decode:true  crayon-inline " >es()</span> не обязательно гарантирует вам более точные прогнозы, чем <span class="lang:r decode:true  crayon-inline " >ets()</span>. Мною замечено, что на разных данных она ведёт себя по-разному: где-то лучше <span class="lang:r decode:true  crayon-inline " >ets()</span>, где-то хуже. Главное преимущество функции заключается в её гибкости. Если вам эта гибкость ненужна, а нужно просто, чтобы работало, то рекомендую обратиться к <span class="lang:r decode:true  crayon-inline " >ets()</span>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/10/14/smooth-es-part-1-ru/">Пакет &#171;smooth&#187; для R. Функция es(). Часть 1</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2016/10/14/smooth-es-part-1-ru/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
