<?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>Архивы ETS - Open Forecasting</title>
	<atom:link href="https://openforecast.org/ru/tag/ets/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/ru/tag/ets/</link>
	<description>О том как смотреть в будущее</description>
	<lastBuildDate>Wed, 30 Jun 2021 12:36:19 +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>Архивы ETS - Open Forecasting</title>
	<link>https://openforecast.org/ru/tag/ets/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ISF2021: Как починить мультипликативные модели ETS</title>
		<link>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/</link>
					<comments>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 30 Jun 2021 12:09:46 +0000</pubDate>
				<category><![CDATA[Конференции]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[ISF]]></category>
		<category><![CDATA[конференции]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2664</guid>

					<description><![CDATA[<p>В этом году ISF (International Symposium on Forecasting) был виртуальной конференцией из-за пандемии. Наш центр устроил небольшое неофициальное собрание в полу-закрытом университете. Я презентовал из аудитории, а презентацию видели люди со всего мира, начиная с Австралии и Индонезии и заканчивая Европой (США ещё спали): В этой презентации я рассказал о том, что: Точечные прогнозы из [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/">ISF2021: Как починить мультипликативные модели ETS</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В этом году ISF (International Symposium on Forecasting) был виртуальной конференцией из-за пандемии. Наш центр устроил небольшое неофициальное собрание в полу-закрытом университете. Я презентовал из аудитории, а презентацию видели люди со всего мира, начиная с Австралии и Индонезии и заканчивая Европой (США ещё спали):</p>
<div id="attachment_2666" style="width: 235px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04.jpeg&amp;nocache=1"><img fetchpriority="high" decoding="async" aria-describedby="caption-attachment-2666" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-225x300.jpeg&amp;nocache=1" alt="Презентация в хабе Ланкастера" width="225" height="300" class="size-medium wp-image-2666" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-225x300.jpeg&amp;nocache=1 225w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-768x1024.jpeg&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04-1152x1536.jpeg&amp;nocache=1 1152w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2021/06/WhatsApp-Image-2021-06-30-at-10.17.04.jpeg&amp;nocache=1 1200w" sizes="(max-width: 225px) 100vw, 225px" /></a><p id="caption-attachment-2666" class="wp-caption-text">Презентация в хабе Ланкастера</p></div>
<p>В этой презентации я рассказал о том, что:</p>
<ol>
<li>Точечные прогнозы из мультипликативных ETS не соответствуют мат. ожиданию, что может быть проблемой в некоторых ситуациях;</li>
<li>Гамма, Логнормальное и Обратное Гауссовское распределения могут быть успешно использованы в мультипликативных ETS;</li>
<li>Всё это работает хорошо и даёт адекватные прогнозы&#8230;</li>
<li>&#8230;и уже доступно в функции adam() пакета smooth.</li>
</ol>
<p>Вот <a href="/wp-content/uploads/2021/06/2021-Svetunkov-ISF-ADAM-Multiplicative.pdf">слайды</a>. Видео запись презентации возможно будет доступно спустя несколько недель на Youtube канале IIF.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/">ISF2021: Как починить мультипликативные модели ETS</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2021/06/30/isf2021-kak-pochinit-multiplikativnye-modeli-ets/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>О том, как оценить адекватность прогнозных интервалов</title>
		<link>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/</link>
					<comments>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 18 Oct 2019 20:18:40 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Оценка точности прогнозов]]></category>
		<category><![CDATA[Теория прогнозирования]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[Прогнозные ошибки]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=2235</guid>

					<description><![CDATA[<p>Введение Некоторые люди считают, что главная идея прогнозирования заключается в том, чтобы как можно более точно предсказать будущее. У меня для них плохие новости. На самом деле главная идея прогнозирования заключается в уменьшении неопределённости относительно будущего. Ведь, будущее не предопределено, мы никогда не знаем, что именно произойдёт, когда и как. Но с помощью методов прогнозирования [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">О том, как оценить адекватность прогнозных интервалов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Введение</h3>
<p>Некоторые люди считают, что главная идея прогнозирования заключается в том, чтобы как можно более точно предсказать будущее. У меня для них плохие новости. На самом деле главная идея прогнозирования заключается в уменьшении неопределённости относительно будущего. Ведь, будущее не предопределено, мы никогда не знаем, что именно произойдёт, когда и как. Но с помощью методов прогнозирования мы можем хотя бы сказать, чего не стоит ждать и очертить область, в которой, вероятно, событие произойдёт&#8230;</p>
<p>В принципе, любое событие, которое мы хотим рассмотреть с точки зрения прогнозирования, может быть представлено некой систематической составляющей \(\mu_t\), которую можно описать с помощью некоторой модели, а так же случайной компонентой \(\epsilon_t\). Последняя может и не быть случайной по природе, но будет считаться случайной для целей моделирования. А всё из-за того, что мы не можем, например, предсказать, пойдёт ли конкретный человек в поликлинику в определённый день или нет. Поэтому тот спрос (или с чем вы там работаете), который мы наблюдаем в виде конкретных величин, может быть грубо описан математически следующим образом:<br />
\begin{equation} \label{eq:demand}<br />
y_t = \mu_t + \epsilon_t,<br />
\end{equation}<br />
где \(y_t\) &#8212; это фактические значения спроса (есть и другие формулы для нелинейных моделей, но они не меняют суть дискуссии, поэтому пока тут мы будем говорить о простой линейной модели). Что же мы обычно делаем в прогнозировании? Мы пытаемся как можно точнее описать систематическую составляющую \(\mu_t\), пытаясь выловить структуру и каким-то образом так же получить представление о неопределённости \(\epsilon_t\) вокруг этой структуры. Когда речь заходит об ошибке \(\epsilon_t\), мы обычно можем только что-то сказать о том, как это величина распределена, и какие у неё параметры (например, математическое ожидание и дисперсия). </p>
<p>Поэтому, когда перед нами имеется какой-нибудь вот такой временной ряд:</p>
<p><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample.png&amp;nocache=1"><img decoding="async" class="aligncenter size-medium wp-image-2202" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/UncertaintyExample.png&amp;nocache=1 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>то мы можем сказать, что средний уровень продаж составляет 1000 единиц, но так же, что вокруг этого уровня имеются некие случайные отклонения, характеризуемые каким-то СКО \(\sigma \approx 100 \). Суть прогнозирования сводится к тому, чтобы оценить как можно точнее \(\mu_t\) и \(\sigma\). Если нам удастся это сделать, то мы построим точечные прогнозы (синяя линия на графике) и прогнозный интервал шириной \(1-\alpha\) (скажем, 95-ти процентный, серая область на графике), который в идеальной ситуации будет накрывать \((1-\alpha) \times 100\)% наблюдений.</p>
<p>В реальности, мы никогда не знаем переменную \(\mu_t\), поэтому, в процессе построения модели мы можем либо переоценить её (&#171;underestimate&#187;, например, не включив сезонную компоненту), что приведёт к излишне высокой дисперсии и увеличенной ширине прогнозного интервала, либо недооценить её (&#171;overestimate&#187;, например, включив тренд, когда это ненужно), что приведёт к заниженной дисперсии и не реалистично узким прогнозным интервалам. Поэтому при выборе модели, мы пытаемся добраться как можно ближе к значениям \(\mu_t\) и \(\sigma\). </p>
<p>Когда речь заходит о непосредственном прогнозировании, мы обычно строим точечные прогнозы, которые соответствуют условной средней величине модели, призванной точно отразить будущие значения \(\mu_t\), а так же прогнозные интервалы, которые соответствуют определённым квантилям распределения и по идеи должны каким-то образом описать неопределённость случайной величины \(\epsilon_t\). На этом сайте уже была <a href="/2017/06/11/prediction-intervals/">статья на тему прогнозных интервалов</a>, а так же пару статей на тему <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">измерения точности точечных прогнозов</a>. В этой статье мы обсудим, как понять, правильно ли модель выловила эту самую неопределённость или нет.</p>
<h3>Интервальный оценки</h3>
<p>Рассмотрим следующий пример в R с использованием функций пакета smooth v2.5.4. Сгенерируем данные на основе модели ETS(A,N,A) с построим по этим данным несколько моделей:</p>
<pre class="decode">library(smooth)
x <- sim.es("ANA", obs=120, frequency=12, persistence=c(0.3,0.1), initial=c(1000), mean=0, sd=100)
modelUnderfit <- es(x$data, "ANN", silent=F, interval=T, holdout=T, h=24)
modelOverfit <- es(x$data, "AAA", silent=F, interval=T, holdout=T, h=24)
modelCorrect <- es(x$data, "ANA", silent=F, interval=T, holdout=T, h=24)
modelTrue <- es(x, silent=F, interval=T, holdout=T, h=24)</pre>
<div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>Четыре картинки с модельками</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
<div id="attachment_2207" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN.png&amp;nocache=1"><img decoding="async" aria-describedby="caption-attachment-2207" class="size-medium wp-image-2207" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANN.png&amp;nocache=1 1200w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2207" class="wp-caption-text">Модель, недооценивающая данные</p></div>
<div id="attachment_2206" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2206" class="size-medium wp-image-2206" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-AAA.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2206" class="wp-caption-text">Модель, переоценивающая данные</p></div>
<div id="attachment_2208" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2208" class="size-medium wp-image-2208" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-ANA-1.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2208" class="wp-caption-text">Правильная модель</p></div>
<div id="attachment_2204" style="width: 310px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True.png&amp;nocache=1"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-2204" class="size-medium wp-image-2204" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-300x175.png&amp;nocache=1" alt="" width="300" height="175" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2019/10/Intervals-ANA-True.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-2204" class="wp-caption-text">Истинная модель</p></div>
</div></div>
<p>Сами данные демонстрируют меняющийся уровень ряда и изменяющуюся во времени сезонность. А четыре модели, которые мы использовали, это:</p>
<ol>
<li>ETS(A,N,N), которая недооценивает данные (underfitting) из-за отсутствия сезонной компоненты,</li>
<li>ETS(A,A,A), которая переоценивает данные (overfitting) из-за лишней компоненты (тренд),</li>
<li>ETS(A,N,A), которая правильно специфицирована, но параметры которой рассчитаны на основе выборки,</li>
<li>ETS(A,N,A) - истинная модель, с правильными параметрами.</li>
</ol>
<p>Все эти модели дают нам точечные прогнозы, точность которых можно оценить с помощью <a href="/2019/08/25/kak-izmerit-tochnost-prognozov/">каких-нибудь ошибок</a>:</p>
<pre class="decode">errorMeasures <- rbind(modelUnderfit$accuracy,
                       modelOverfit$accuracy,
                       modelCorrect$accuracy,
                       modelTrue$accuracy)[,c("sMAE","sMSE","sCE")]
rownames(errorMeasures) <- c("Model Underfit","Model Overfit","Model Correct","Model True")
errorMeasures*100</pre>
<pre>                    sMAE      sMSE       sCE
Model Underfit 45.134368 25.510527 -122.3740
Model Overfit  19.797382  5.026588 -449.8459
Model Correct   9.580048  1.327130 -149.7284
Model True      9.529042  1.318951 -139.8342</pre>
<p>Обратите внимание, что в нашем примере первая модель дала наименее точный прогноз из-за отсутствия сезонной компоненты, но при этом дала наименее смещённый прогноз (sCE=-122.3740), что могло произойти просто по счастливой случайности. Вторая модель оказалась точнее первой, потому что в ней есть необходимая компонента, но не такой точной, как правильная модель из-за наличия тренда, который продолжает нисходящую траекторию на проверочной выборке. Что касается последних двух моделей, то разница в их точности достаточно мала, но, судя по всему, истинная модель оказалась немного точнее модели, оцененной по выборке.</p>
<p>Что более важно, все эти модели дали разные интервальные прогнозы. Проблема в том, что графически их проанализировать затруднительно. Поэтому нам стоит оценить их точность с помощью каких-нибудь показателей. Например, <strong>Mean Interval Score</strong> (MIS), предложенной <a href="https://doi.org/10.1198/016214506000001437" target="_blank" rel="noopener noreferrer">Gneiting (2011)</a> и популяризованной во время <a href="https://www.mcompetitions.unic.ac.cy/m4/" target="_blank" rel="noopener noreferrer">M4 Competition</a>:<br />
\begin{equation} \label{MIS}<br />
\begin{matrix}<br />
\text{MIS} = & \frac{1}{h} \sum_{j=1}^h \left( (u_{t+j} -l_{t+j}) + \frac{2}{\alpha} (l_{t+j} -y_{t+j}) \mathbb{1}(y_{t+j} < l_{t+j}) \right. \\ &#038; \left. + \frac{2}{\alpha} (y_{t+j} -u_{t+j}) \mathbb{1}(y_{t+j} > u_{t+j}) \right) ,<br />
\end{matrix}<br />
\end{equation}<br />
где \(u_{t+j}\) - это верхняя граница, \(l_{t+j}\) - это нижняя граница  интервала, \(\alpha\) - это уровень значимости, а \(\mathbb{1}(\cdot)\) - это индикаторная функция, значение которой равно единице, в случае, если условие внутри неё верно, и нулю в противном случае. Идея MIS заключается в том, чтобы оценить размах интервала вместе с его охватом (сколько наблюдений было накрыто интервалом). Если фактические значения лежат вне интервала, то ошибка увеличивается пропорционально расстоянию до них с коэффициентом \(\frac{2}{\alpha}\). Кроме того, ширина интервала положительно влияет на значение индекса: чем шире интервал, тем больше значение MIS. Идеалистическая модель со значением MIS=0 должна содержать значения на границах интервал, причём \(u_{t+j}=l_{t+j}\), что означает, что будущее предопределено, никакой случайно составляющей нет. Конечно же, в реальности это просто невозможно.</p>
<p>Этот индекс доступен в пакете greybox для R:</p>
<pre class="decode">c(MIS(modelUnderfit$holdout,modelUnderfit$lower,modelUnderfit$upper,level=0.95),
  MIS(modelOverfit$holdout,modelOverfit$lower,modelOverfit$upper,level=0.95),
  MIS(modelCorrect$holdout,modelCorrect$lower,modelCorrect$upper,level=0.95),
  MIS(modelTrue$holdout,modelTrue$lower,modelTrue$upper,level=0.95))</pre>
<pre>[1] 1541.6667 1427.7527  431.7717  504.8203</pre>
<p>Полученные цифры сами по себе ничего нам не говорят, их надо сравнивать друг с другом. Как видим, первая модель показала себя хуже всех в плане прогнозных интервалов, в то время как правильная модель 3 настолько хороша, что даже уделала истинную модель 4 (это могло произойти по чистой случайности). </p>
<p>К сожалению, мы не можем сказать ничего больше по поводу интервалов на основе MIS. Поэтому для того, чтобы понять, что же именно произошло, мы можем обратиться к среднему размаху интервалов (range):<br />
\begin{equation} \label{range}<br />
\text{range} = \frac{1}{h} \sum_{j=1}^h (u_{t+j} -l_{t+j}) ,<br />
\end{equation}<br />
которая на человеческом языке означает среднюю фактической ширины интервалов с первого по h шагов вперёд. Вот как это рассчитать в R:</p>
<pre class="decode">c(mean(modelUnderfit$upper - modelUnderfit$lower),
  mean(modelOverfit$upper - modelOverfit$lower),
  mean(modelCorrect$upper - modelCorrect$lower),
  mean(modelTrue$upper - modelTrue$lower))</pre>
<pre>[1] 1541.6667  297.1488  431.7717  504.8203</pre>
<p>Глядя на эти цифры, становится понятно, что вторая модель (которая переоценивает данные) произвела самые узкие интервалы из четырёх моделей, и серьёзно недооценила неопределённость. Это привело к тому, что большая часть значений оказалась вне интервала. Заметьте так же, что ширина интервалов первой модели значительно больше ширины других интервалов. Это плохо, потому что принимать решения на их основе будет затруднительно (что-то типа "завтра мы продадим от 100 до 1600 единиц хлеба").</p>
<p>Что можно ещё сделать, так это рассчитать среднюю величину покрытия интервалами (coverage):<br />
\begin{equation} \label{coverage}<br />
\text{coverage} = \frac{1}{h} \sum_{j=1}^h \left( \mathbb{1}(y_{t+j} < l_{t+j}) \times \mathbb{1}(y_{t+j} > u_{t+j}) \right) ,<br />
\end{equation}<br />
что может быть сделано в R следующим образом:</p>
<pre class="decode">c(sum((modelUnderfit$holdout > modelUnderfit$lower & modelUnderfit$holdout < modelUnderfit$upper)) / length(modelUnderfit$holdout),
  sum((modelOverfit$holdout > modelOverfit$lower & modelOverfit$holdout < modelOverfit$upper)) / length(modelOverfit$holdout),
  sum((modelCorrect$holdout > modelCorrect$lower & modelCorrect$holdout < modelCorrect$upper)) / length(modelCorrect$holdout),
  sum((modelTrue$holdout > modelTrue$lower & modelTrue$holdout < modelTrue$upper)) / length(modelTrue$holdout))</pre>
<pre>[1] 1.0000000 0.5416667 1.0000000 1.0000000</pre>
<p>К сожалению, в нашем случае эта величина оказалось не очень полезной. Например, первая, третья и четвёртая модели содержат в своих интервалах 100% наблюдений, хотя должны бы содержать 95%. Что же касается второй модели, то она накрывает только 54.2% наблюдений, что, конечно же, тоже плохо. Тем не менее, глядя на размах и величину покрытия мы можем заключить, что проблема второй модели заключается в излишне узком интервале, проблема первой - в излишне широком, в то время как третья и четвёртая неплохо себя проявили в этом упражнении.</p>
<p>Если нам нужно получить ещё более подробную оценку точности интервалов, мы можем обратиться к <a href="/etextbook/forecasting_toolbox/estimation-simple-methods/">пинбольной функции</a> для каждой границы по отдельности (кажется, она была предложена <a href="https://doi.org/10.2307/1913643" target="_blank" rel="noopener noreferrer">Koenker & Basset, 1978</a>):<br />
\begin{equation} \label{pinball}<br />
\text{pinball} = (1 -\alpha) \sum_{y_{t+j} < b_{t+j}, j=1,\dots,h } |y_{t+j} -b_{t+j}| + \alpha \sum_{y_{t+j} \geq b_{t+j} , j=1,\dots,h } |y_{t+j} -b_{t+j}|,
\end{equation}
где \(b_{t+j}\) - это значение границы интервала (верхней или нижней). Пинбол, по идеи, должен показывать, насколько точно мы оценили конкретный квантиль распределения. Чем меньше его значение, тем ближе мы оказались к квантилю. Если он равен нулю, то мы идеально попали в соответствующий квантиль.

В нашем случае, мы строили 95% прогнозный интервал, что означает, что мы целились в 2.5% и 97.5% квантили. Пинбол можно рассчитать с помощью функции пакета greybox в R:


<pre class="decode">pinballValues <- cbind(c(pinball(modelUnderfit$holdout,modelUnderfit$lower,0.025),
                         pinball(modelOverfit$holdout,modelOverfit$lower,0.025),
                         pinball(modelCorrect$holdout,modelCorrect$lower,0.025),
                         pinball(modelTrue$holdout,modelTrue$lower,0.025)),
                       c(pinball(modelUnderfit$holdout,modelUnderfit$upper,0.975),
                         pinball(modelOverfit$holdout,modelOverfit$upper,0.975),
                         pinball(modelCorrect$holdout,modelCorrect$upper,0.975),
                         pinball(modelTrue$holdout,modelTrue$upper,0.975)))
rownames(pinballValues) <- c("Model Underfit","Model Overfit","Model Correct","Model True")
colnames(pinballValues) <- c("lower","upper")
pinballValues</pre>
<pre>                  lower    upper
Model Underfit 484.0630 440.9371
Model Overfit  168.4098 688.2418
Model Correct  155.9144 103.1486
Model True     176.0856 126.8066</pre>
<p>Мы вновь можем заметить, что сами по себе значения пинболов нам ни о чём не говорят - они должны сравниваться друг с другом. На основе этого сравнения можно заключить, что правильная модель 3 оказалась точнее как для 2.5%, так и для 97.5% квантилей. Она даже побила истинную модель в этом примере, что согласуется с нашими предыдущими наблюдениями. Впрочем, это пример на одном временном ряде, так что это не показательно.</p>
<p>Кроме того, мы видим, что первая модель оказалась хуже правильной модели в плане как верхней, так и нижней границ интервала. Это всё из-за того, что размах её интервалов оказался завышенным. Она смогла только побить вторую модель (с переоценкой) по 97.5% квантилю, а так она показала себя достаточно плохо.</p>
<p>Что касается второй модели, нижняя граница её интервала оказалась достаточно точной, но вот верхняя оказалась совсем никудышной. Это всё из-за тренда, который тянет прогнозы вниз.</p>
<p>Стоит отдельно заметить, что с пинболами работать достаточно затруднительно, так как для точной оценки квантилей требуются большие выборки. Например, для того, чтобы получить более-менее адекватное представление о том, как себя проявил 97.5% квантильный прогноз, в нашем распоряжении должно быть как минимум 40 наблюдений, чтобы 39 из них лежали ниже границы (\(\frac{39}{40} = 0.975\)). На самом деле, с квантилями вообще тяжело работать, потому что их не всегда можно точно определить. Для напоминания, математически квантиль определяется так:<br />
\begin{equation} \label{quantile}<br />
P \left(y_t < q_{\alpha} \right) = \alpha ,
\end{equation}
что на человеческом языке означает "вероятность того, что значение окажется ниже определённого \(\alpha\)-квантиля равна \(\alpha\)". Продолжая наш пример, если в нашем распоряжении всего лишь 20 наблюдений, мы можем хоть с какой-то точностью определить только \(\frac{19}{20} = 0.95\) квантиль. Всё, что находится между 95% и 100% в этом случае - это серая зона.

Последнее, что хотелось бы сказать по поводу всех этих индексов, это то, что они измеряются в оригинальных единицах (например, литры пива). Поэтому их нельзя агрегировать для разных временных рядов. Для того, чтобы получить правильное представление о точности интервалов, нам нужно как-то избавиться от единиц измерения. Мы можем, например, всё масштабировать с помощью средней величины (как <a href="https://doi.org/10.1057/jors.2014.62" target="_blank" rel="noopener noreferrer">Petropoulos & Kourentzes (2015)</a>), либо на основе средних разностей (как <a href="https://doi.org/10.1016/j.ijforecast.2006.03.001" target="_blank" rel="noopener noreferrer">Hyndman & Koehler (2006)</a>), либо на основе относительных значений (как similar to <a href="https://doi.org/10.1016/j.ijforecast.2012.09.002" target="_blank" rel="noopener noreferrer">Davydenko & Fildes (2013)</a>).</p>
<h3>Эксперимент в R</h3>
<p>Для того, чтобы понять, как ведут себя все эти индексы, попробуем провести эксперимент на выборке из 1000 рядов, сгенерированных таким же образом, как и наш пример до того. Вот пример скрипта для R:</p>
<div class="su-spoiler su-spoiler-style-fancy su-spoiler-icon-plus su-spoiler-closed" data-scroll-offset="0" data-anchor-in-url="no"><div class="su-spoiler-title" tabindex="0" role="button"><span class="su-spoiler-icon"></span>Кусок кода в R</div><div class="su-spoiler-content su-u-clearfix su-u-trim">
<pre class="decode">library(smooth)
# 4 models, 5 measures: MIS, Coverage, Range, Pinball L, Pinball U, 1000 iterations
errorMeasures <- array(NA, c(1000,4,5), dimnames=list(NULL, c("Model Underfit","Model Overfit","Model Correct","Model True"),
                                                      c("MIS","Range","Coverage","Lower","Upper")))

for(i in 1:1000){
    x <- sim.es("ANA", obs=120, frequency=12, persistence=c(0.3,0.1), initial=c(1000), mean=0, sd=100)
    
    modelUnderfit <- es(x$data, "ANN", silent=T, interval="p", holdout=T, h=24)
    modelOverfit <- es(x$data, "AAA", silent=T, interval="p", holdout=T, h=24)
    modelCorrect <- es(x$data, "ANA", silent=T, interval="p", holdout=T, h=24)
    modelTrue <- es(x, silent=T, interval=T, holdout=T, h=24)
    
    errorMeasures[i,,1] <- c(MIS(modelUnderfit$holdout,modelUnderfit$lower,modelUnderfit$upper,level=0.95),
                             MIS(modelOverfit$holdout,modelOverfit$lower,modelOverfit$upper,level=0.95),
                             MIS(modelCorrect$holdout,modelCorrect$lower,modelCorrect$upper,level=0.95),
                             MIS(modelTrue$holdout,modelTrue$lower,modelTrue$upper,level=0.95));
    
    errorMeasures[i,,2] <- c(mean(modelUnderfit$upper - modelUnderfit$lower),
                             mean(modelOverfit$upper - modelOverfit$lower),
                             mean(modelCorrect$upper - modelCorrect$lower),
                             mean(modelTrue$upper - modelTrue$lower));
    
    errorMeasures[i,,3] <- c(sum(modelUnderfit$holdout > modelUnderfit$lower & modelUnderfit$holdout < modelUnderfit$upper),
                             sum(modelOverfit$holdout > modelOverfit$lower & modelOverfit$holdout < modelOverfit$upper),
                             sum(modelCorrect$holdout > modelCorrect$lower & modelCorrect$holdout < modelCorrect$upper),
                             sum(modelTrue$holdout > modelTrue$lower & modelTrue$holdout < modelTrue$upper)) / length(modelUnderfit$holdout);
    
    errorMeasures[i,,4] <- c(pinball(modelUnderfit$holdout,modelUnderfit$lower,0.025),
                             pinball(modelOverfit$holdout,modelOverfit$lower,0.025),
                             pinball(modelCorrect$holdout,modelCorrect$lower,0.025),
                             pinball(modelTrue$holdout,modelTrue$lower,0.025));
    
    errorMeasures[i,,5] <- c(pinball(modelUnderfit$holdout,modelUnderfit$upper,0.975),
                             pinball(modelOverfit$holdout,modelOverfit$upper,0.975),
                             pinball(modelCorrect$holdout,modelCorrect$upper,0.975),
                             pinball(modelTrue$holdout,modelTrue$upper,0.975));
}</pre>
</div></div>
<p>Признаюсь, это не самый эффективный код, можно было бы его распараллелить, но посчитал, что для целей нашего эксперимента, можно и подождать минут десять.</p>
<p>Проблема, с которой мы теперь сталкиваемся, рассчитав все эти значения по выборке из 1000 рядов - это как раз единицы измерения. Простое решение - взять одну из моделей за эталон и рассчитать относительные индексы на основе неё. В качестве такой модели я возьму правильную модель 3 (обратите внимание, что покрытие, coverage, уже измеряется в относительных величинах, поэтому его ненужно модифицировать):</p>
<pre class="decode">errorMeasuresRelative <- errorMeasures
for(i in 1:4){
    errorMeasuresRelative[,i,c(1,2,4,5)] <- errorMeasures[,i,c(1,2,4,5)] / errorMeasures[,3,c(1,2,4,5)]
}</pre>
<p>Таким образом мы будем анализировать относительные размах, MIS и пинбол, которые можно аггрегировать как угодно, но лучше - с помощью средних геометрических:</p>
<pre class="decode">round(cbind(exp(apply(log(errorMeasuresRelative[,,-3]),c(2,3),mean)),
            apply(errorMeasuresRelative,c(2,3),mean)[,3,drop=FALSE]),3)</pre>
<pre>                 MIS Range Lower Upper Coverage
Model Underfit 2.091 2.251 2.122 2.133    0.958
Model Overfit  1.133 1.040 1.123 1.113    0.910
Model Correct  1.000 1.000 1.000 1.000    0.938
Model True     0.962 1.013 0.964 0.963    0.951</pre>
<p>Как видим, модель, которая недооценивает данные дала на 125.1% более широкие интервалы, чем правильная модель. У неё так же более высокие значения пинболов (на 112.2% и 113.3% выше соответственно), что означает, что она сильно промахнулась относительно 2.5% и 97.5% квантилей. Резюмируя, модель переоценила неопределённость из-за того, что в ней не оказалось необходимой сезонной компоненты. Однако, покрытие у неё оказалось очень близко к 95%, что говорит о том, что сам подход к построению интервалов оказался корректным.</p>
<p>Вторая модель, которая переоценила данные, обладает более широким размахом, чем правильная модель, но при этом покрывает меньше фактических наблюдений своими интервалами. В целом, хоть ситуация с этой моделью не такая критическая, как с первой, решения на основе её интервалов принимать не безопасно.</p>
<p>Истинная модель (последняя в таблице) произвела интервалы чуть шире, чем модель, оценённая по выборке, но при этом оказалась точнее в плане конкретных квантилей и покрыла 95.1% наблюдений, что практически неотличимо от номинального значения.</p>
<p>А что касается третьей модели, она оказалась лучше первых двух в плане MIS, размаха и пинбола, но при этом покрыла только 93.8% значений в выборке, что существенно ниже, чем 95%. Это всё из-за того, что мы оценивали параметры по выборке и того, как именно учитывается неопределённость в моделях ETS - подход <a href="https://www.springer.com/gp/book/9783540719168" rel="noopener noreferrer" target="_blank">Hyndman et al. (2008)</a> подразумевает, что параметры известны... Это одна из неизученных проблем в области ETS на данный момент.</p>
<p>Вообще же, могут быть и другие причины в том, почему правильная модель дала не самые точные интервалы, некоторые из которых мы уже <a href="/2017/06/11/prediction-intervals/">обсуждали в прошлом</a>. Но главная мысль данной статьи заключается в том, что, несмотря на то, как именно мы конструируем интервалы, несмотря на то, какие модели используем и как их выбираем, у нас есть специальные инструменты, которые могут позволить нам понять, насколько правильно мы смогли уловить неопределённость.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/">О том, как оценить адекватность прогнозных интервалов</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2019/10/18/o-tom-kak-ocenit-adekvatnost-prognoznyh-intervalov/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Презентация на OR60. Экспоненциальное сглаживание: прошлое, настоящее и будущее</title>
		<link>https://openforecast.org/ru/2018/09/18/prezentaciya-na-or60-eksponencialnoe-sg/</link>
					<comments>https://openforecast.org/ru/2018/09/18/prezentaciya-na-or60-eksponencialnoe-sg/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 18 Sep 2018 21:01:31 +0000</pubDate>
				<category><![CDATA[GUM]]></category>
		<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[OR]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[презентация]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1874</guid>

					<description><![CDATA[<p>Роберт Файлдс попросил меня приготовить обзор на тему экспоненциального сглаживания для конференции OR60, которая прошла в Ланкастере c 11 по 13 сентября. Я решил сделать обзор в формате &#171;прошлое &#8212; настоящее &#8212; будущее&#187;, добавив в последнюю часть модель, которую мы разрабатываем с Никосом (GUM &#8212; Generalised Univariate Model, что-то типа &#171;Обобщённая одномерная модель&#187;). В конце [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/09/18/prezentaciya-na-or60-eksponencialnoe-sg/">Презентация на OR60. Экспоненциальное сглаживание: прошлое, настоящее и будущее</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Роберт Файлдс попросил меня приготовить обзор на тему экспоненциального сглаживания для конференции OR60, которая прошла в Ланкастере c 11 по 13 сентября. Я решил сделать обзор в формате &#171;прошлое &#8212; настоящее &#8212; будущее&#187;, добавив в последнюю часть модель, которую мы разрабатываем с Никосом (GUM &#8212; Generalised Univariate Model, что-то типа &#171;Обобщённая одномерная модель&#187;). В конце концов получилась очень плотная презентация, и у меня едва получилось втиснуть её в предоставленные мне полчаса.</p>
<p>Вот аннотация на английском:</p>
<p>Exponential smoothing has been known in both theoretical and practical forecasting for more than 60 years. It has evolved substantially from a simple exponential smoothing method, aiming at dealing with level data to a state-space framework, covering various time series characteristics. In this presentation we discuss the key milestones in the development of exponential smoothing, show the connections between the exponential smoothing and the other forecasting models and, finally, propose a more general framework that can potentially encompass all the existing forecasting models, called &#171;Generalised Univariate Model&#187;.</p>
<p>А вот и <a href="/wp-content/uploads/2018/09/2018-OR60-Svetunkov-GUM.pdf">слайды презентации</a>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/09/18/prezentaciya-na-or60-eksponencialnoe-sg/">Презентация на OR60. Экспоненциальное сглаживание: прошлое, настоящее и будущее</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2018/09/18/prezentaciya-na-or60-eksponencialnoe-sg/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ISF 2018, Болдер, США</title>
		<link>https://openforecast.org/ru/2018/06/19/isf-2018/</link>
					<comments>https://openforecast.org/ru/2018/06/19/isf-2018/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 19 Jun 2018 23:12:42 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ISF]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[презентация]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1768</guid>

					<description><![CDATA[<p>В этом году я презентовал исследование, являющееся продолжением того, что я докладывал в прошлом году в Австралии. Название презентации &#8212; &#171;Forecasting intermittent data with complex patterns&#187; (Прогнозирование прерывистых данных со сложными тенденциями). В этом исследовании мы разработали модель с логистической вероятностью, которая позволяет вылавливать сложные паттерны в переменной &#171;появления спроса&#187;. Фактически с помощью нехитрых преобразований [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/06/19/isf-2018/">ISF 2018, Болдер, США</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>В этом году я презентовал исследование, являющееся продолжением того, что я <a href="/2017/07/30/isf-2017/">докладывал в прошлом году в Австралии</a>. Название презентации &#8212; &#171;Forecasting intermittent data with complex patterns&#187; (Прогнозирование прерывистых данных со сложными тенденциями). В этом исследовании мы разработали модель с логистической вероятностью, которая позволяет вылавливать сложные паттерны в переменной &#171;появления спроса&#187;. Фактически с помощью нехитрых преобразований мы можем использовать любую аддитивную модель для прогнозирования прерывистого спроса. Я попытался разнообразить эту презентацию, чтобы она была понятна более широкому кругу слушателей, но формулы я никуда, конечно же, не выкинул. Формулы &#8212; это наше всё!</p>
<p><a href="https://openforecast.org/wp-content/uploads/2018/06/2018-ISF-Presentation.pdf">Здесь</a> можно скачать слайды презентации. Над статьёй по этой теме мы сейчас работаем с коллегами, а предыдущую нашу статью можно найти <a href="/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/">тут</a>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/06/19/isf-2018/">ISF 2018, Болдер, США</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2018/06/19/isf-2018/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Общие параметры. Часть 3. Экзогенные переменные. Основы</title>
		<link>https://openforecast.org/ru/2018/01/15/xreg-basics/</link>
					<comments>https://openforecast.org/ru/2018/01/15/xreg-basics/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 15 Jan 2018 14:42:01 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Общая информация]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1632</guid>

					<description><![CDATA[<p>Одно из преимуществ функций пакета smooth &#8212; это возможность использовать экзогенные переменные (регрессоры). Это потенциально может привести к росту точности прогнозов, в случае, если у вас в распоряжении есть хорошие оценки будущих значений включённых переменных. Например, в случае с ритейлом в качестве экзогенной переменной может выступать наличие акции в магазине (&#171;купите один шампунь, получите ящик [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/01/15/xreg-basics/">Пакет «smooth» для R. Общие параметры. Часть 3. Экзогенные переменные. Основы</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Одно из преимуществ функций пакета smooth &#8212; это возможность использовать экзогенные переменные (регрессоры). Это потенциально может привести к росту точности прогнозов, в случае, если у вас в распоряжении есть хорошие оценки будущих значений включённых переменных. Например, в случае с ритейлом в качестве экзогенной переменной может выступать наличие акции в магазине (&#171;купите один шампунь, получите ящик пива в подарок&#187;). Эту информацию мы можем знать заранее, причём со 100% точностью, если мы планируем проводить похожие акции в будущем. И, конечно же, использование этой информации должно повысить точность прогнозов по нашей модели.</p>
<p>Для подобных целей в R уже есть функция <span class="lang:r decode:true crayon-inline">arima()</span> из пакета <span class="lang:r decode:true crayon-inline">stats</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">smooth</span>. Теперь все функции в пакете (кроме <span class="lang:r decode:true crayon-inline">sma()</span>) предоставляют возможность по включению экзогенных переменных.</p>
<p>В <span class="lang:r decode:true crayon-inline">smooth</span> реализовано две модели для работы с экзогенными переменными: модель с аддитивными и с мультипликативными ошибками. Первая формулируется следующим образом:<br />
\begin{equation} \label{eq:additive}<br />
	y_t = w&#8217; v_{t-l} + a_1 x_{1,t} + a_2 x_{2,t} + … + a_k x_{k,t} + \epsilon_t ,<br />
\end{equation}<br />
где \(a_1, a_2, …, a_k\) &#8212; параметры соответствующих регрессоров \(x_{1,t}, x_{2,t}, …, x_{t,k}\). Все остальные переменные мы уже обсуждали <a href="/2016/11/02/smooth-package-for-r-es-function-part-ii-pure-additive-models-ru/">в предыдущих статьях</a>.<br />
Вторая модель выглядит немного по-другому, так как она основана на <a href="/2016/11/18/smooth-package-for-r-es-function-part-iii-pure-multiplicative-models-ru/">мультипликативной ETS</a>:<br />
\begin{equation} \label{eq:multiplicative}<br />
	\log y_t = w&#8217; \log(v_{t-1}) + a_1 x_{1,t} + a_2 x_{2,t} + … + a_k x_{k,t} + \log(1 + \epsilon_t) ,<br />
\end{equation}<br />
Она может быть так же представлена в следующем виде:<br />
\begin{equation} \label{eq:multiplicativeAlternative}<br />
	y_t =\exp \left({w&#8217; \log(v_{t-1})} \right) \exp(a_1 x_{1,t}) \exp(a_2 x_{2,t}) \dots \exp(a_k x_{k,t}) (1 + \epsilon_t).<br />
\end{equation}<br />
Эта модель соответствует лог-линейной. Такая форма принята для того, чтобы в качестве экзогенных можно было бы использовать фиктивные переменные. Если вам нужна лог-лог модель, то для этого достаточно всего лишь прологарифмировать экзогенную переменную перед использованием её в функции.</p>
<p>Важно отметить, что смешанные модели могут вызвать проблемы, так как в таком случае некоторые компоненты складываются, а другие &#8212; перемножаются. Поэтому я бы рекомендовал использовать либо <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> ETSX (<a href="/2017/01/24/smooth-package-for-r-es-function-part-iv-model-selection-and-combination-of-forecasts-2/">в статье про выбор моделей</a> описано, как можно осуществить выбор на основе чистых моделей).</p>
<p>Итак, для того, чтобы построить модель с заданными регрессорами, достаточно просто передать в функцию вектор, матрицу либо data.frame: </p>
<pre class="decode">ourModel <- es(BJsales, "XXN", xreg=BJsales.lead, h=10, holdout=TRUE, silent=FALSE)</pre>
<pre>Estimation progress: 100%... Done! 
Time elapsed: 0.27 seconds
Model estimated: ETSX(AAdN)
Persistence vector g:
alpha  beta 
0.939 0.301 
Damping parameter: 0.877
Initial values were optimised.
7 parameters were estimated in the process
Residuals standard deviation: 1.381
Xreg coefficients were estimated in a normal style
Cost function type: MSE; Cost function value: 1.811

Information criteria:
     AIC     AICc      BIC 
494.4490 495.2975 515.0405 
Forecast errors:
MPE: 1.2%; Bias: 91.3%; MAPE: 1.3%; SMAPE: 1.3%
MASE: 2.794; sMAE: 1.5%; RelMAE: 0.917; sMSE: 0%</pre>
<div id="attachment_1623" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2018/01/BJsalesETSXSimple.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1623" src="/wp-content/uploads/2018/01/BJsalesETSXSimple-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1623" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/01/BJsalesETSXSimple-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/01/BJsalesETSXSimple-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/01/BJsalesETSXSimple-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2018/01/BJsalesETSXSimple.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1623" class="wp-caption-text">BJsales series and ETSX with a leading indicator</p></div>
<p>В этом примере мы используем данные о продажах из книги Box & Jenkins (1976). Я попросил функцию использовать провести процедуру ретропрогноза и сделать прогноз на 10 шагов вперёд, так что последние 10 наблюдений переменной <span class="lang:r decode:true crayon-inline">BJsales.lead</span> используются для построения прогнозов. Функция построила модель и доложила нам, что параметры были оценены обычным методом (7 parameters were estimated in the process). Это значит, что мы предполагаем, что коэффициенты при регрессорах не меняются во времени. Альтернативный этому подход будет рассмотрен когда-нибудь в будущем.</p>
<p>Судя по всему, выбранная модель ETS(A,Ad,N) дала не самые точные, да ещё и смещённые прогнозы (систематическое отклонение от фактических значений в проверочной выборке). Пока что особых улучшений от включения переменной не видно...</p>
<p>Если в какой-то момент времени вы, вдруг, забудете о том, какая именно модель перед вами, вы можете воспользоваться функцией <span class="lang:r decode:true crayon-inline">formula()</span>, которая в случае с функциями <span class="lang:r decode:true crayon-inline">smooth</span> носит чисто описательный характер:</p>
<pre class="decode">formula(ourModel)</pre>
<pre>"y[t] = l[t-1] + b[t-1] + a1 * x[t] + e[t]"</pre>
<p>Функция рассказала нам, что уровень l[t-1], тренд b[t-1], экзогенная переменная "x[t]" и ошибка в нашей модели складываются. Если бы мы передали матрицу с экзогенными переменными или же построили модель с динамически меняющимися параметрами, то это было бы отражено в формуле. Использовать эту формулу так же, как и это сделается в lm(), к сожалению, нельзя.</p>
<p>Для сравнения построим следующую смешанную модель и посмотрим на её формулу:</p>
<pre class="decode">ourModel <- es(BJsales, "MAN", xreg=BJsales.lead, h=10, holdout=TRUE)
formula(ourModel)</pre>
<pre>"y[t] = (l[t-1] + b[t-1]) * exp(a1 * x[t]) * e[t]"</pre>
<p>Как видим, вначале тренд и уровень складываются, а потом это всё умножается на экспоненту нашей переменной. Если по какой-то причине тренд будет негативным, а уровень окажется близок к нулю, то экзогенная переменная будет умножена на отрицательное число. В результате получится бессмысленный прогноз. Это одна из причин, почему я не люблю смешанные модели и говорю, что использовать их надо с осторожностью.</p>
<p>Однако, вернёмся к нашим баранам. Если в нашем распоряжении нет значений экзогенной переменной для проверочной части выборки, то функции пакета <span class="lang:r decode:true crayon-inline">smooth</span> автоматически построят прогнозы для каждой из экзогенных переменных с помощью <span class="lang:r decode:true crayon-inline">es()</span> или <span class="lang:r decode:true crayon-inline">iss()</span> в зависимости от того, имеем мы дело с обычной или же с бинарной переменной. В последнем случае в качестве прогноза будет получена условная средняя, поэтому не удивляйтесь, если для вашей фиктивной переменной прогнозом будет что-нибудь типа 0,784. Так что не стоит использовать функцию вслепую, когда <span class="lang:r decode:true crayon-inline">holdout=FALSE</span>, будьте осторожны. Вот как функция работает в этом случае:</p>
<pre class="decode">es(BJsales, "XXN", xreg=BJsales.lead, h=10, holdout=FALSE, silent=FALSE)</pre>
<p>Нам должны сообщить о том, что функция сделала для нас (построила прогнозы экзогенных переменных):</p>
<pre>Warning message:
xreg did not contain values for the holdout, so we had to predict missing values.</pre>
<p>Если ваши переменные по размеру превышают выходную переменную, то функция удалит последние лишние наблюдения:</p>
<pre class="decode">ourModel <- es(BJsales[1:140], "XXN", xreg=BJsales.lead, h=10, holdout=TRUE)</pre>
<p>и сообщит нам об этом:</p>
<pre>Warning message:
xreg contained too many observations, so we had to cut off some of them.</pre>
<p>Как видите, функцию можно использовать напрямую, но, если вам хочется работать с <span class="lang:r decode:true crayon-inline">forecast()</span> (что совершенно необязательно), то это можно сделать так:</p>
<pre class="decode">forecast(ourModel, h=10, xreg=BJsales.lead)</pre>
<p>Из-за того, как реализовано использование экзогенных переменных в функциях пакета <span class="lang:r decode:true crayon-inline">smooth</span>, переменная <span class="lang:r decode:true crayon-inline">xreg</span> должна содержать все значения, а не только те, которые соответствуют проверочной выборке. Если вы вместо <span class="lang:r decode:true crayon-inline">xreg</span> передадите значения из проверочной выборки, то функция решит, что у вас мало наблюдений и построит прогнозы.</p>
<p>Я бы рекомендовал плюнуть на функцию <span class="lang:r decode:true crayon-inline">forecast()</span> и использовать <span class="lang:r decode:true crayon-inline">es()</span>, <span class="lang:r decode:true crayon-inline">ssarima()</span> и другие функции пакета <span class="lang:r decode:true crayon-inline">smooth</span> напрямую. Так вы сможете подготовить свои переменные и использовать их напрямую без дополнительных строк кода.</p>
<p>Аналогично тому, как это обсуждалось <a href="/2017/06/11/prediction-intervals/">в прошлой статье</a>, вы можете попросить функцию построить прогнозные интервалы. Только имейте в виду, что параметрические интервалы на данный момент не очень точны, так как не берут в расчёт возможный корреляции между экзогенными переменными и компонентами ETS. Сделать это сложно, поэтому эта функция и не реализована. Поэтому я бы рекомендовал в случае с ETSX, ARIMAX и пр. строить полупараметрические и непараметрические интервалы.</p>
<p>Наконец, вы всегда можете задать параметры для экзогенных переменных вручную, через переменную <span class="lang:r decode:true crayon-inline">initialX</span>:</p>
<pre class="decode">ourModel <- es(BJsales, "XXN", xreg=BJsales.lead, h=10, holdout=T, initialX=c(-1))</pre>
<p>Помимо всего этого, функции достаточно умны, чтобы определить, коррелируют ли переданные регрессоры друг с другом и есть ли в них дисперсия. Если что-то из переданного функции не так, она выкинет те переменные, которые вызывают проблемы:</p>
<pre class="decode">es(BJsales, "XXN", xreg=cbind(BJsales.lead,BJsales.lead), h=10, holdout=TRUE)</pre>
<pre>Warning message:
Some exogenous variables were perfectly correlated. We've dropped them out.</pre>
<p>Из-за того, что мы включили BJsales.lead дважды, регрессор вызвал совершенную мультиколлинеарность, поэтому функция выкинула один из них.</p>
<pre class="decode">es(BJsales, "XXN", xreg=cbind(BJsales.lead,rep(100,150)), h=10, holdout=TRUE)</pre>
<pre>Warning message:
Some exogenous variables do not have any variability. Dropping them out.</pre>
<p>А тут функция заметила, что вторая переменная постоянна, а значит и не может быть использована для моделирования, и, опять же, выкинула её.</p>
<p>Если вы случайно включите выходную переменную (в нашем примере это BJsales) в число регрессоров, то функция так же выкинет её:</p>
<pre class="decode">es(BJsales, "XXN", xreg=cbind(BJsales,BJsales.lead), h=10, holdout=TRUE)</pre>
<pre>Warning message:
One of exogenous variables and the forecasted data are exactly the same. We have dropped it.</pre>
<p>На этом основы заканчиваются. Далее мы перейдём к более продвинутым и интересным аспектам по использованию экзогенных переменных в функциях пакета <span class="lang:r decode:true crayon-inline">smooth</span>.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2018/01/15/xreg-basics/">Пакет «smooth» для R. Общие параметры. Часть 3. Экзогенные переменные. Основы</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2018/01/15/xreg-basics/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Пакет «smooth» для R. Общие параметры. Часть 2. Оценка параметров</title>
		<link>https://openforecast.org/ru/2017/11/20/estimation-of-smooth/</link>
					<comments>https://openforecast.org/ru/2017/11/20/estimation-of-smooth/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 20 Nov 2017 17:21:15 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Общая информация]]></category>
		<category><![CDATA[Пакет smooth для R]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1382</guid>

					<description><![CDATA[<p>Прежде чем мы приступим к обсуждению сегоднешней темы, я бы рекомендовал обратиться к статье &#171;Элементы математической статистики, проверка гипотез&#187; электронного учебника &#8212; нам понадобятся сегодня такие понятия, как несмещённость, эффективность и состоятельность. Здесь их лишний раз обсуждать нехочется. Кроме того, многое, что мы рассмотрим сегодня, уже описано в главах &#171;Простые методы оценки параметров моделей» и [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/11/20/estimation-of-smooth/">Пакет «smooth» для R. Общие параметры. Часть 2. Оценка параметров</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Прежде чем мы приступим к обсуждению сегоднешней темы, я бы рекомендовал обратиться к статье &#171;<a href="/forecasting_toolbox/statistics-and-hypothesis/">Элементы математической статистики, проверка гипотез</a>&#187; электронного учебника &#8212; нам понадобятся сегодня такие понятия, как несмещённость, эффективность и состоятельность. Здесь их лишний раз обсуждать нехочется.</p>
<p>Кроме того, многое, что мы рассмотрим сегодня, уже описано в главах &#171;<a href="/forecasting_toolbox/estimation-simple-methods/">Простые методы оценки параметров моделей</a>» и &#171;<a href="/forecasting_toolbox/estimation-advanced-methods/">Продвинутые методы оценки параметров моделей</a>». Поэтому теортическую часть мы обсуждать не будем, а лучше сконцентрируемся на том, как это сделать в R.</p>
<h3>Методы оценки на основе одношаговых прогнозов</h3>
<p>Начнём с того, что выберем временной ряд, с которым будем работать. Например, вот такой:</p>
<pre class="decode">x <- ts(c(M3$N1823$x,M3$N1823$xx),frequency=frequency(M3$N1823$x))</pre>
<p>Выглядит он вот так:</p>
<pre class="decode">plot(x)</pre>
<div id="attachment_1360" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators01.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1360" src="/wp-content/uploads/2017/10/SmoothEstimators01-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1360" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators01-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators01-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators01-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators01.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1360" class="wp-caption-text">Ряд N1823</p></div>
<p>Похоже, что в ряде имеется небольшая мультипликативная сезонность, но её тяжело распознать. Для простоты в нашем примере мы будем использовать простую модель ETS(A,A,N) с аддитивной ошибкой и аддитивным трендом. Как это водится в данных M3, для проверочной выборки мы будем использовать последние 18 наблюдений.</p>
<p>Начнём с модели, оценённой путём минимизации MSE.</p>
<ul>
<li>MSE.</li>
</ul>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T)</pre>
<div id="attachment_1361" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators02.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1361" src="/wp-content/uploads/2017/10/SmoothEstimators02-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1361" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1361" class="wp-caption-text">N1823 и модель ETS(A,A,N) с MSE</p></div>
<p>Вот информация о полученной модели:</p>
<pre>Time elapsed: 0.08 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
0.147 0.000 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 629.249
Cost function type: MSE; Cost function value: 377623.069

Information criteria:
     AIC     AICc      BIC 
1703.389 1703.977 1716.800 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -14%; Bias: -74.1%; MAPE: 16.8%; SMAPE: 15.1%
MASE: 0.855; sMAE: 13.4%; RelMAE: 1.047; sMSE: 2.4%</pre>
<p>Тут сложно прийти к каким-нибудь конкретным заключениям, но, судя по всему, в прогнозе наблюдается небольшое систематическое завышение (это показывает MPE). При этом относительная MAE (RelMAE) оказалась больше единицы, что говорит о том, что метод Naive лучше справляется с задачей прогнозирования этого ряда, чем ETS(A,A,N). Посмотрим на остатки модели:</p>
<pre class="decode">qqnorm(resid(ourModel))
qqline(resid(ourModel))</pre>
<div id="attachment_1363" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators02QQ.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1363" src="/wp-content/uploads/2017/10/SmoothEstimators02QQ-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1363" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02QQ-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02QQ-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02QQ-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators02QQ.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1363" class="wp-caption-text">График Квантиль-квантиль по остаткам модели ETS(A,A,N), оценённой MSE</p></div>
<p>Остатки выглядят ненормально - много эмпирических квантилей оказались расположены далеко от теоретических значений. Тест на нормальность Шапиро-Уилка отвергает гипотезу о нормальности распределения остатков на 5% уровне:</p>
<pre class="decode">shapiro.test(resid(ourModel))
> p-value = 0.001223</pre>
<p>Это может указывать на то, что другие методы оценки могут справиться с оценкой параметров лучше. И в функциях пакета <span class="lang:r decode:true crayon-inline">smooth</span> есть специальный волшебный параметра для этого - <span class="lang:r decode:true crayon-inline">loss</span>. Попробуем оценить ту же модель с помощью других методов.</p>
<ul>
<li>MAE.</li>
</ul>
<p>Минимум MAE находится с помощью команды:</p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,loss="MAE")</pre>
<p>и даёт следующие результаты:<br />
<div id="attachment_1362" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators03.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1362" src="/wp-content/uploads/2017/10/SmoothEstimators03-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1362" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1362" class="wp-caption-text">N1823 и ETS(A,A,N), оценённой с помощью MAE</p></div>
<pre>Time elapsed: 0.09 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
0.101 0.000 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 636.546
Cost function type: MAE; Cost function value: 462.675

Information criteria:
     AIC     AICc      BIC 
1705.879 1706.468 1719.290 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -5.1%; Bias: -32.1%; MAPE: 12.9%; SMAPE: 12.4%
MASE: 0.688; sMAE: 10.7%; RelMAE: 0.842; sMSE: 1.5%</pre>
<p>Что же получилось? Во-первых, постоянная сглаживания альфа оказалась меньше, чем в предыдущей модели, что говорит о том, что полученная модель менее чувствительна к выбросам и более консервативна. Во-вторых, RelMAE оказалась меньше нуля, что говорит о том, что данная модель лучше справляется с прогнозированием, чем Naive и чем предыдущая. Это, возможно, как раз вызвано робастностью данного метода оценки. В-третьих, по графику видно, что полученный прогноз проходит где-то между наблюдениями в проверочной выборке, что является желаемым поведением прогнозной модели. Остатки всё ещё распределены ненормально, но это вполне ожидаемо, так как другой метод оценки не делает их нормальными, а просто позволяет получить значения, менее чувствительные к выбросам:</p>
<div id="attachment_1364" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators03QQ.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1364" src="/wp-content/uploads/2017/10/SmoothEstimators03QQ-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1364" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03QQ-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03QQ-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03QQ-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators03QQ.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1364" class="wp-caption-text">График Квантиль-квантиль по остаткам модели ETS(A,A,N), оценённой MAE</p></div>
<ul>
<li>HAM – Half Absolute Moment.</li>
</ul>
<p>Здесь стоит немного остановиться, так как этот метод оценки мы ещё не рассматривали в учебнике. Формула его выглядит так:<br />
\begin{equation} \label{eq:HAM}<br />
	\text{HAM} = \frac{1}{T} \sum_{t=1}^T \sqrt{|e_{t+1}|}<br />
\end{equation}<br />
Особенность данного метода оценки заключается в том, что масштаб ошибок уменьшается за счёт взятия корня. В результате этого модель, оценённая HAM оказывается ещё более устойчивой к выбросам, чем MAE. Более того, для модели становятся важны более мелкие и часто встречающиеся отклонения, нежели крупные и редкие. Минимум этой функции на целочисленных данных соответствует моде. В случае с непрерывными - чему-то между модой и медианой. На эту тему я с коллегами сейчас провожу исследование. Этот метод оценки даёт состоятельные, но менее эффективные оценки параметров, чем MSE и MAE.</p>
<p>Посмотрим, что получится:</p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,loss="HAM")</pre>
<div id="attachment_1365" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators04.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1365" src="/wp-content/uploads/2017/10/SmoothEstimators04-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1365" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators04-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators04-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators04-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators04.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1365" class="wp-caption-text">N1823 и ETS(A,A,N) с HAM</p></div>
<pre>Time elapsed: 0.06 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
0.001 0.001 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 666.439
Cost function type: HAM; Cost function value: 19.67

Information criteria:
     AIC     AICc      BIC 
1715.792 1716.381 1729.203 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -1.7%; Bias: -14.1%; MAPE: 11.4%; SMAPE: 11.4%
MASE: 0.63; sMAE: 9.8%; RelMAE: 0.772; sMSE: 1.3%</pre>
<p>Судя по прогнозным ошибкам и графику, эта модель дала ещё более точные прогнозы, чем модель, оценённая с помощью MAE. Правда сделала она это приблизив обе постоянные сглаживания к нулю. Обратите внимание, что стандартное отклонение в этом случае оказалось выше, чем в случае с MAE, которое в свою очередь выше, чем MSE. Это означает, что одношаговые прогнозные интервалы будут шире у HAM, чем у MAE, чем у MSE. Однако, учитывая величину постоянных сглаживания в нашем примере, многошаговые интервалы у модель с HAM, скорее всего, будут уже остальных.</p>
<p>Кроме того, стоит заметить, что оптимизация моделей с использованием разных методов оценки происходит с разной скоростью. MSE - самый медленный метод оценки, в то время как HAM - самый быстрый. Вызвано это формой математической функции (в случае с MSE - парабола, с MAE - линейная, с HAM - корень) и тем, как работают эвристические методы оптимизации. Разница в скорости может быть существенной, особенно, если вы работаете с большими выборками. Так что, если вы спешите, а какие-нибудь оценки нужно получить быстро, попробуйте HAM. Только не забывайте, что информационные критерии в этом случае могут давать неточные результаты.</p>
<h3>Методы оценки на основе многошаговых прогнозов</h3>
<p>Следующие три метода используют идею, рассмотренную нами в главе "<a href="/forecasting_toolbox/estimation-advanced-methods/">Продвинутые методы оценки параметров</a>». Эти методы дают состоятельные, но не эффективны, а зачастую ещё и смещённые оценки параметров. Возникает вопрос, зачем ими тогда пользоваться? А всё дело в том, что эти методы "сжимают" параметры моделей, делая сами модели более "консервативными", ближе к детерминистическим и минимизируя влияние шумов на прогноз. Это оказывается особенно полезно в случаях с высокочастотными данными, когда асимптотические свойства начинают работать, а эффективность оценок растёт.</p>
<ul>
<li>MSE\(_h\) - Mean Squared Error для прогноза на h шагов вперёд:</li>
</ul>
<p>Посмотрим, что получится, если использовать его для оценки нашей модели:</p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,loss="MSEh")</pre>
<div id="attachment_1366" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators05.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1366" src="/wp-content/uploads/2017/10/SmoothEstimators05-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1366" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators05-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators05-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators05-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators05.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1366" class="wp-caption-text">N1823 и ETS(A,A,N) с MSEh</p></div>
<pre>Time elapsed: 0.24 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: 657.781
Cost function type: MSEh; Cost function value: 550179.34

Information criteria:
     AIC     AICc      BIC 
30393.86 30404.45 30635.25 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -10.4%; Bias: -62%; MAPE: 14.9%; SMAPE: 13.8%
MASE: 0.772; sMAE: 12.1%; RelMAE: 0.945; sMSE: 1.8%</pre>
<p>Как видим, обе постоянные сглаживания оказались равными нулю, в результате чего мы получили прямую линию, проходящую через все наблюдения. Если бы в нашем распоряжении было 1008, а не 108 наблюдений, тогда параметры были бы отличны от нуля, так как модель вынуждена была бы адаптироваться к изменениям в данных. Но мы получили, что получили...</p>
<ul>
<li>TMSE – Trace Mean Squared Error:</li>
</ul>
<p>Опять же, на наших данных:</p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,loss="TMSE")</pre>
<div id="attachment_1666" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/11/SmoothEstimators06.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1666" src="/wp-content/uploads/2017/11/SmoothEstimators06-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1666" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/11/SmoothEstimators06-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/11/SmoothEstimators06-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/11/SmoothEstimators06-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/11/SmoothEstimators06.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1666" class="wp-caption-text">N1823 and ETS(A,N,N) with TMSE</p></div>
<pre>Time elapsed: 0.2 seconds
Model estimated: ETS(AAN)
Persistence vector g:
alpha  beta 
0.075 0.000 
Initial values were optimised.
5 parameters were estimated in the process
Residuals standard deviation: 633.48
Cost function type: TMSE; Cost function value: 7477097.717

Information criteria:
     AIC     AICc      BIC 
30394.36 30404.94 30635.75 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -7.5%; Bias: -48.9%; MAPE: 13.4%; SMAPE: 12.6%
MASE: 0.704; sMAE: 11%; RelMAE: 0.862; sMSE: 1.5%</pre>
<p>Сравнивая эту модель с моделью с MSE и MSE\(_h\), можно заметить, что в случае с TMSE постоянная сглаживания для уровня ряда лежит где-то между постоянными сглаживания предыдущих моделей. Это демонстрирует тот самый, эффект, который мы обсуждали в учебнике: многошаговые прогнозы тянут параметры к нулю, в то время как одношаговые их немного поднимают вверх. Тем не менее, я бы рекомендовал использовать TMSE на больших выборках, где оценки параметров становятся более эффективными и менее смещёнными.</p>
<ul>
<li>GTMSE – Geometric Trace Mean Squared Error:</li>
</ul>
<p>Этот метод оценки мы тоже уже <a href="/forecasting_toolbox/estimation-advanced-methods/">обсуждали в учебнике</a>. </p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,loss="GTMSE")</pre>
<div id="attachment_1368" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators07.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1368" src="/wp-content/uploads/2017/10/SmoothEstimators07-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1368" /></a><p id="caption-attachment-1368" class="wp-caption-text">N1823 and ETS(A,A,N) with GTMSE</p></div>
<pre>Time elapsed: 0.18 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: 649.253
Cost function type: GTMSE; Cost function value: 232.419

Information criteria:
     AIC     AICc      BIC 
30402.77 30413.36 30644.16 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -8.2%; Bias: -53.8%; MAPE: 13.8%; SMAPE: 12.9%
MASE: 0.72; sMAE: 11.3%; RelMAE: 0.882; sMSE: 1.6%</pre>
<p>В нашем примере этот метод оценки также сжал параметры к нулю, сделав модель детерминистической, что соответствует результатам, полученным с помощью MSE\(_h\). Однако, стартовые значения у методы получились немного другими, что привело к другим прогнозам.</p>
<p>Имейте в виду, что все эти методы оценки значительно более требовательны к расчётном времени, потому что для каждого из них нужно сделать прогноз на h шагов вперёд из каждого наблюдения в обучающей выборке.</p>
<ul>
<li>Аналитические многошаговые методы оценки.</li>
</ul>
<p>В функциях пакета <span class="lang:r decode:true crayon-inline">smooth</span> есть ещё одна полезная, незадокументированная функция (доступная пока только для чистых аддитивных моделей) – использование аналитических аналогов многошаговых методов оценки. Вызываются такие методы путём добавления буквы "a" перед названием желаемого метода оценки: aMSEh, aTMSE, aGTMSE.  В этом случае одношаговые ошибки и параметры модели будут использоваться для реконструирования многошаговых методов оценки. Эта опция полезна в том случае, когда вам нужно использовать какой-то метод оценки на малых выборках. Также эти методы могут быть полезны, если вы работаете с большими выборками, но хотите, чтобы модель была построена относительно быстро.</p>
<p>Эти методы оценки имеют свойства схожие со свойствами их эмпирических аналогов, но работают быстрее и используют асимптотические свойства.</p>
<p>Вот пример использования аналитичекого MSE\(_h\):</p>
<pre class="decode">ourModel <- es(x,"AAN",silent=F,interval="p",h=18,holdout=T,cfType="aMSEh")</pre>
<div id="attachment_1377" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2017/10/SmoothEstimators09.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-1377" src="/wp-content/uploads/2017/10/SmoothEstimators09-300x175.png" alt="" width="300" height="175" class="size-medium wp-image-1377" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators09-300x175.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators09-768x448.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators09-1024x597.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2017/10/SmoothEstimators09.png&amp;nocache=1 1200w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-1377" class="wp-caption-text">N1823 и ETS(A,A,N) с aMSEh</p></div>
<pre>Time elapsed: 0.11 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: 627.818
Cost function type: aMSEh; Cost function value: 375907.976

Information criteria:
     AIC     AICc      BIC 
30652.15 30662.74 30893.55 
95% parametric prediction intervals were constructed
100% of values are in the prediction interval
Forecast errors:
MPE: -1.9%; Bias: -14.6%; MAPE: 11.7%; SMAPE: 11.6%
MASE: 0.643; sMAE: 10%; RelMAE: 0.787; sMSE: 1.3%</pre>
<p>Итоговые постоянные сглаживания получились равными нулю, аналогично тому, что мы наблюдали в MSE\(_h\). Стартовые значения модели при этом получились немного другие, поэтому и прогноз оказался другим (по сравнению с MSE\(_h\)). На себя так же обращает внимание то, что модель была оценена и сконструирована за 0.11 секунд, а не за 0.24, как в случае с MSE\(_h\).</p>
<ul>
<li>Аналогично тому, как это было с MSE, в функциях <span class="lang:r decode:true crayon-inline">smooth</span> реализованы и многошаговые MAE и HAM (типа MAE\(_h\) и THAM). Правда, они там просто потому что я смог их сделать, а не потому что они имеют какой-то особый смысл. К их изучению я ещё даже не думал приступать.</li>
</ul>
<h3>Заключение</h3>
<p>Теперь, когда мы обсудили все возможные методы оценки функций пакета <span class="lang:r decode:true crayon-inline">smooth</span>, у вас может возникнуть закономерный вопрос: "Что же использовать?". Честно говоря, у меня пока нет однозначного ответа на этот вопрос, так как это направление ещё не до конца изучено. Но у меня есть некоторые советы, которые хотелось бы здесь привести:</p>
<p>Во-первых, <a href="http://kourentzes.com/forecasting/2015/08/20/forecasting-solar-irradiance-true-models-trace-optimisation-and-shrinkage/" rel="noopener noreferrer" target="_blank">Никос Курентзес и Хуан Рамон Траперо выяснили</a>, что в случае с высокочастотными данными использование MSE\(_h\) и TMSE приводит к увеличению точности прогнозов по сравнению с MSE. Однако, если в случае с MSE\(_h\) для этого нужно построить h моделей, TMSE позволяет построить одну, что в разы уменьшает время расчётов. Точность прогнозов при использовании TMSE и MSE\(_h\) оказывается сопостовимой.</p>
<p>Во-вторых, если вы сталкиваетесь с асимметричным распределением остатков при оценке с помощью MSE, попробуйте использовать MAE и HAM – они могут улучшить прогнозную точность моделей.</p>
<p>В-третьих, аналитические версии многошаговых методов я бы рекомендовал использовать на больших выборках, когда скорость вычислений важна, а свойства этих методов хочется использовать. Ну, или в ситуации, когда выборка наоборот маленькая, а свойства хочется использовать (эмпирические значения получить в этом случае затруднительно).</p>
<p>Наконец, не стоит спользовать MSE\(_h\), TMSE и GTMSE если вас интересуют параметры моделей (а не точность прогнозов) – они скорее всего будут неэффективными и смещёнными. Это применимо как к ETS, так и к ARIMA, которые в этом случае становятся близкими к детерминистическим моделям. Используйте MSE и не выпендривайтесь!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/11/20/estimation-of-smooth/">Пакет «smooth» для R. Общие параметры. Часть 2. Оценка параметров</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/11/20/estimation-of-smooth/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Multiplicative State-Space Models for Intermittent Time Series</title>
		<link>https://openforecast.org/ru/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/</link>
					<comments>https://openforecast.org/ru/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 07 Nov 2017 18:35:42 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[Статьи]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[прерывистый спрос]]></category>
		<category><![CDATA[статистика]]></category>
		<category><![CDATA[статьи]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1416</guid>

					<description><![CDATA[<p>Мы с Джоном Бойланом работали последний год над статьёй по модели пространства состояний для прерывистых данных. Эту статью мы отправили в IJF, и, пока мы ждём ответа, я решил опубликовать рабочую версию статьи. Вот аннотация статьи на английском: Intermittent demand forecasting is an important supply chain task, which is commonly done using methods based on [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/">Multiplicative State-Space Models for Intermittent Time Series</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Мы с <a href="http://www.lancaster.ac.uk/lums/people/john-boylan" rel="noopener" target="_blank">Джоном Бойланом</a> работали последний год над статьёй по модели пространства состояний для прерывистых данных. Эту статью мы отправили в IJF, и, пока мы ждём ответа, я решил опубликовать рабочую версию статьи. Вот аннотация статьи на английском:</p>
<p>Intermittent demand forecasting is an important supply chain task, which is commonly done using methods based on exponential smoothing. These methods however do not have underlying statistical models, which limits their generalisation. In this paper we propose a general state-space model that takes intermittence of data into account, extending the taxonomy of exponential smoothing models. We show that this model has a connection with conventional non-intermittent state space models and underlies Croston’s and Teunter-Syntetos-Babai (TSB) forecasting methods. We discuss properties of the proposed models and show how a selection can be made between them in the proposed framework. We then conduct experiments on simulated data and on two real life datasets, demonstrating advantages of the proposed approach.</p>
<p><a href="http://dx.doi.org/10.13140/RG.2.2.35897.06242" rel="noopener" target="_blank">Сама статья</a>.</p>
<p>К слову, все модели, обсуждаемые в статье, <a href="/tag/smooth-ru/">доступны в пакете</a> <span class="lang:r decode:true crayon-inline">smooth</span>. Через пару месяцев я планирую написать на эту тему статью для сайта. Следите за обновлениями!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/">Multiplicative State-Space Models for Intermittent Time Series</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2017/11/07/multiplicative-state-space-models-for-intermittent-time-series-2/feed/</wfw:commentRss>
			<slash:comments>0</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 loading="lazy" 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="auto, (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 loading="lazy" 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="auto, (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>Пакет «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>
	</channel>
</rss>
