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

<channel>
	<title>Архивы программирование - Open Forecasting</title>
	<atom:link href="https://openforecast.org/ru/tag/programmirovanie/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/ru/tag/programmirovanie/</link>
	<description>О том как смотреть в будущее</description>
	<lastBuildDate>Wed, 01 Aug 2018 10:15:31 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/cropped-usd-05-32x32.png&amp;nocache=1</url>
	<title>Архивы программирование - Open Forecasting</title>
	<link>https://openforecast.org/ru/tag/programmirovanie/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Пакет greybox для R</title>
		<link>https://openforecast.org/ru/2018/05/04/greybox-for-r/</link>
					<comments>https://openforecast.org/ru/2018/05/04/greybox-for-r/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Fri, 04 May 2018 12:22:35 +0000</pubDate>
				<category><![CDATA[R]]></category>
		<category><![CDATA[Пакет greybox для R]]></category>
		<category><![CDATA[Прикладное прогнозирование]]></category>
		<category><![CDATA[greybox]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=1737</guid>

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

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

					<description><![CDATA[<p>Давно ничего не появлялось на страницах этого блога. Пора бы исправить этот пробел. Сегодня, 30 января 2016 года, начинает свою жизнь пакет для R под названием &#171;smooth». Пока что он публикуется только на сайте github.com, но в перспективе он появится и в CRAN, что облегчит многим жизнь и позволит забыть о всяких Rtools и devtools. [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/01/30/smooth/">Smooth &#8212; новый пакет для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Давно ничего не появлялось на страницах этого блога. Пора бы исправить этот пробел.</p>
<p>Сегодня, 30 января 2016 года, начинает свою жизнь пакет для R под названием &#171;<a href="https://github.com/config-i1/smooth" target="_blank">smooth</a>». Пока что он публикуется только на сайте <a href="https://github.com" target="_blank">github.com</a>, но в перспективе он появится и в <a href="https://cran.r-project.org/web/packages/available_packages_by_name.html" target="_blank">CRAN</a>, что облегчит многим жизнь и позволит забыть о всяких Rtools и devtools. Что же входит сейчас в этот замечательный пакет?</p>
<ol>
<li><span class="lang:r decode:true crayon-inline">es()</span> &#8212; функция по оценке экспоненциального сглаживания и построению прогнозов. Об этой функции я уже писал раньше <a href="/2015/08/11/ets2-for-r/">здесь</a>, <a href="/2015/10/05/es-for-r/">здесь</a> и <a href="/2015/12/05/es-tstools-1-6/">здесь</a>.</li>
<li><span class="lang:r decode:true crayon-inline">ces()</span> &#8212; комплексное экспоненциальное сглаживание. Оценка и прогнозирование. Об этой функции я тоже уже писал <a href="/2015/03/04/ces-github/">здесь</a>.</li>
<li><span class="lang:r decode:true crayon-inline">ges()</span> &#8212; обобщённое экспоненциальное сглаживание. Подробней об этой функции я напишу позже, когда разберусь, что же она такое делает и как.</li>
<li><span class="lang:r decode:true crayon-inline">nus()</span> &#8212; метод неравномерного сглаживания. Он был рассмотрен во втором томе <a href="http://www.urait.ru/izdatelstvo/our_authors/6DAFC8E2-7E98-4632-A3D5-F14A3FF8BF3A" target="_blank">нашего учебника по прогнозированию</a>. Когда-нибудь я напишу о нём и на этом сайте&#8230;</li>
<li><span class="lang:r decode:true crayon-inline">ces.auto()</span> &#8212; функция позволяет выбрать наилучшую модель комплексного экспоненциального сглаживания из двух: сезонной и не сезонной. Скорее всего, эта функция со временем покинет пакет &#171;smooth&#187;, так как этот функционал должен по хорошему быть внедрён в функцию <span class="lang:r decode:true crayon-inline">ces()</span>.</li>
<li><span class="lang:r decode:true crayon-inline">sim.ets()</span> &#8212; функция позволяет генерировать временные ряды на основе модели экспоненциального сглаживания (ETS). Возможно, будет переименована в <span class="lang:r decode:true crayon-inline">simulate.ets()</span>, когда <span class="lang:r decode:true crayon-inline">es()</span> начнёт использовать классы в R.</li>
<li><span class="lang:r decode:true crayon-inline">sim.ces()</span> &#8212; функция позволяет генерировать временные ряды на основе модели комплексного экспоненциального сглаживания (CES). Участь её ждёт такая же, как и <span class="lang:r decode:true crayon-inline">sim.ets()</span>.</li>
</ol>
<p>В пакет входит также несколько вспомогательных функций, таких как <span class="lang:r decode:true crayon-inline">graphmaker()</span> (построение линейных графиков) и коэффициенты для расчёта ошибок прогнозирования (MPE, MAPE, SMAPE, MASE, GMRAE). И конечно же, в пакет входит критически важная функция <span class="lang:r decode:true crayon-inline">sowhat()</span>, которая проверяет произвольные запросы на адекватность.</p>
<p>Чтобы установить пакет, нужно совсем ничего &#8212; только пара строк кода в R:</p>
<pre class="decode" >if (!require("devtools")){install.packages("devtools")}
devtools::install_github("config-i1/smooth")</pre>
<p>Замечу, что с пакетом &#171;TStools&#187; при этом ничего плохого не произойдёт. Я продолжаю его поддерживать, и Ланкастерский Центр Прогнозирования продолжает постепенно добавлять новые функции в пакет. Функция <span class="lang:r decode:true crayon-inline">es()</span> при этом какое-то время будет в нём обновляться, но затем будет оттуда окончательно перенесена в &#171;smooth&#187;.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2016/01/30/smooth/">Smooth &#8212; новый пакет для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2016/01/30/smooth/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>TStools v1.6 и функция es()</title>
		<link>https://openforecast.org/ru/2015/12/05/es-tstools-1-6/</link>
					<comments>https://openforecast.org/ru/2015/12/05/es-tstools-1-6/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sat, 05 Dec 2015 15:10:05 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[программирование]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=613</guid>

					<description><![CDATA[<p>С момента последней записи о функции es() прошло уже достаточно времени, и, конечно же, я не бездельничал, а она не стояла на месте. Что же нового появилось? Давайте посмотрим. Построение прогнозных интервалов. Пока что с помощью функции можно получать полупараметрические и непараметрические интервалы. Первые используют ковариационную матрицу многошаговых ошибок (см. Продвинутые методы оценки), вторые используют [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/12/05/es-tstools-1-6/">TStools v1.6 и функция es()</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> прошло уже достаточно времени, и, конечно же, я не бездельничал, а она не стояла на месте. Что же нового появилось? Давайте посмотрим.</p>
<ol>
<li>Построение прогнозных интервалов. Пока что с помощью функции можно получать полупараметрические и непараметрические интервалы. Первые используют ковариационную матрицу многошаговых ошибок (см. <a href="/forecasting_toolbox/estimation-advanced-methods/">Продвинутые методы оценки</a>), вторые используют идею с квантильными регрессиями <a href="http://www.jstor.org/stable/2634872?seq=1#page_scan_tab_contents" target="_blank">Taylor and Bunn, 1999</a>. По умолчанию в <span class="lang:r decode:true crayon-inline">es()</span> используется первый метод, так как второй оказывается не очень точным в случае с небольшим числом наблюдений. До параметрических интервалов пока руки не дошли &#8212; слишком муторные формулы.</li>
<li>Построение комбинированной модели экспоненциального сглаживания. Для построения такой модели нужно использовать параметр <span class="lang:r decode:true crayon-inline">model=&#187;CCC&#187;</span>. В этом случае функция оценит все возможные модели ETS, рассчитает информационные критерии и на основе них построит комбинацию. В основе комбинации лежит известный метод весов Акайке (AIC Weights), подробно о котором в контексте экспоненциального сглаживания написал <a href="http://econpapers.repec.org/RePEc:eee:intfor:v:27:y::i:2:p:238-251" target="_blank">Stephan Kolassa, 2011</a>. В моей функции не обязательно перебирать все модели ETS. Можно их ограничить, например, вот так: <span class="lang:r decode:true crayon-inline">model=&#187;CCN&#187;</span> (скомбинировать все несезонные модели) &#8212; или так: <span class="lang:r decode:true crayon-inline">model=&#187;ACC&#187;</span> (скомбинировать все модели с аддитивной ошибкой). В общем, любой каприз за ваши деньги&#8230;</li>
<li>В качестве целевых функций добавлены &#171;<a href="/forecasting_toolbox/estimation-simple-methods/" target="_blank">MAE</a>&#187; и нечто под названием &#171;HAM&#187; &#8212; &#171;Half Absolute Moment&#187; (Половинный абсолютный момент). Оба они позволяют получить более робастные оценки, чем использующаяся по умолчанию &#171;<a href="/forecasting_toolbox/estimation-simple-methods/" target="_blank">MSE</a>&#171;. HAM при этом ещё более робастен, чем MAE, причём настолько, что даёт модальные оценки, а не медианные. Помимо этого скорость вычислений с HAM на порядок выше скорости MAE, которая в свою очередь выше скорости MSE. Пока что, правда, оптимизатор не всегда находит глобальный минимум HAM, но я постараюсь это исправить&#8230; когда-нибудь&#8230; в будущем&#8230;</li>
<li>Выбор модели при использовании любой целевой функции. Делается это на основе всё тех же информационных критериев (и расчёта выборочной дисперсии), что не совсем корректно (так как функция правдоподобия получается не максимизированной), но это хоть какое-то решение на данный момент.</li>
<li>Ну, и, конечно же, как всегда, код оптимизирован, скорость вычислений увеличена, баги исправлены.</li>
</ol>
<p>Отдельное спасибо <a href="https://twitter.com/dmi3k" target="_blank">Dmytro Perepolkin</a> за интересные предложения и отловленные баги.</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/12/05/es-tstools-1-6/">TStools v1.6 и функция es()</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2015/12/05/es-tstools-1-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Обновления в функции &#171;es&#187; в R</title>
		<link>https://openforecast.org/ru/2015/10/05/es-for-r/</link>
					<comments>https://openforecast.org/ru/2015/10/05/es-for-r/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 05 Oct 2015 15:34:49 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[Экстраполяционные методы]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[программирование]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=524</guid>

					<description><![CDATA[<p>С момента последней записи о функции экспоненциального сглаживания в R прошло уже почти два месяца. А за это время в функции произошёл ряд изменений: Я её переименовал из &#171;ets2&#187; в более благозвучное es() &#8212; &#171;Exponential Smoothing&#187;; Функция теперь позволяет использовать экзогенные переменные. Делается это через параметр xreg. В параметр можно подавать как вектора (то есть [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/10/05/es-for-r/">Обновления в функции &#171;es&#187; в R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>С момента последней <a href="/2015/08/11/ets2-for-r/">записи о функции экспоненциального сглаживания в R</a> прошло уже почти два месяца. А за это время в функции произошёл ряд изменений:</p>
<ol>
<li>Я её переименовал из &#171;ets2&#187; в более благозвучное <span class="lang:r decode:true crayon-inline">es()</span> &#8212; &#171;Exponential Smoothing&#187;;</li>
<li>Функция теперь позволяет использовать экзогенные переменные. Делается это через параметр <span class="lang:r decode:true crayon-inline">xreg</span>. В параметр можно подавать как вектора (то есть только одну переменную), так и матрицы (то есть несколько переменных). Главное условие &#8212; это чтобы экзогенная переменная имела либо размер обучающей выборки, либо такой же, как и вся выборка в целом. То есть, если длина интересующей нас переменной y составляет 50 наблюдений, 40 из которых &#8212; обучающая выборка, а 10 &#8212; тестовая, то функция спокойно примет некую переменную x, если в той будет 40 или 50 наблюдений;</li>
<li>Кроме того, <span class="lang:r decode:true crayon-inline">es()</span> теперь позволяет строить полупараметрические и непараметрические прогнозные интервалы. Первые рассчитываются на основе <a href="/forecasting_toolbox/estimation-advanced-methods/">траекторной матрицы</a>, вторые &#8212; на основе идеи <a href="http://www.jstor.org/stable/2634872?seq=1#page_scan_tab_contents" target="_blank">Taylor and Bunn, 1999</a>. Параметрических пока нет &#8212; слишком сложно и требует много времени, которого пока не нашлось;</li>
<li>Ну, и, конечно же, код ещё раз оптимизирован, а несколько багов исправлены.</li>
</ol>
<p>Функция всё так же входит в пакет &#171;<a href="https://github.com/trnnick/TStools" target="_blank">TStools</a>&#187; и пока всё ещё доступна только с сайта github, до cran мы пока не добрались.</p>
<p>Напомню, чтобы получить последнюю версию пакета &#171;TStools&#187; с упомянутой функцией, в R достаточно набрать:</p>
<pre>
if (!require("devtools")){install.packages("devtools")}

devtools::install_github("trnnick/TStools")
</pre>
<p>Сообщение <a href="https://openforecast.org/ru/2015/10/05/es-for-r/">Обновления в функции &#171;es&#187; в R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2015/10/05/es-for-r/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Функция es для R</title>
		<link>https://openforecast.org/ru/2015/08/11/ets2-for-r/</link>
					<comments>https://openforecast.org/ru/2015/08/11/ets2-for-r/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Tue, 11 Aug 2015 22:00:06 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[программирование]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=337</guid>

					<description><![CDATA[<p>Данная статья многим может показаться совершенно непонятной. Оно и не удивительно, к моделям экспоненциального сглаживания мы ещё в учебнике не подобрались, а вот программу для них уже обсуждаем&#8230; Что же поделаешь?! Жизнь жестока! Итак, в R для построения моделей экспоненциального сглаживания существует прекрасная функция ets() из пакета forecast, которым занимается Rob J.Hyndman. Пакет находится в [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/08/11/ets2-for-r/">Функция es для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Данная статья многим может показаться совершенно непонятной. Оно и не удивительно, к моделям экспоненциального сглаживания мы ещё в <a href="/about/">учебнике</a> не подобрались, а вот программу для них уже обсуждаем&#8230; Что же поделаешь?! Жизнь жестока!</p>
<p>Итак, в R для построения моделей экспоненциального сглаживания существует прекрасная функция <span class="lang:r decode:true crayon-inline">ets()</span> из пакета <span class="lang:r decode:true crayon-inline">forecast</span>, которым занимается Rob J.Hyndman. Пакет находится в общих репозиториях и легко устанавливается командой в R:</p>
<pre>
install.packages("forecast")
</pre>
<p>Однако у этой функции с моей точки зрения есть несколько недостатков, среди которых можно выделить следующие:</p>
<ol>
<li>Отсутствие некоторых моделей экспоненциального сглаживания;</li>
<p>В книге &#171;<a href="http://www.springer.com/us/book/9783540719168" target="_blank">Forecasting with Exponential Smoothing</a>&#187; Роб с соавторами предлагают таксономию, в соответствии с которой существует всего 30 моделей экспоненциального сглаживания, однако функция <span class="lang:r decode:true crayon-inline">ets()</span> позволяет строить только 19 из них, опуская сложные в оценке модели (включая оригинальную модель Хольта-Уинтерса).</p>
<li>Отсутствие возможности задавать произвольные значения компонент;</li>
<p>Для инициализации любой модели экспоненциального сглаживания нужно задать самое первое расчётное значение либо первые значения компонент уровня ряда, тренда и сезонной составляющей. В <span class="lang:r decode:true crayon-inline">ets()</span> они подбираются во время оптимизации, но иногда стартовые значения имеет смысл задать вручную. Именно этой возможности в <span class="lang:r decode:true crayon-inline">ets()</span> и нет.</p>
<li>Невозможность включения экзогенных (внешних) переменных;</li>
<p>В той же книге обсуждается, что в модель пространства состояний, в виде которой авторы представляют любое экспоненциальное сглаживание, можно легко включить произвольное количество экзогенных переменных, которые объяснили бы поведение нашего показателя в некоторые моменты времени. Однако возможность включения переменных в функции <span class="lang:r decode:true crayon-inline">ets()</span> отсутствует. Пока она отсутствует и в моей функции «es», но в списке приоритетов она не на последнем месте.</p>
<li>Ограниченность критериев в целевой функции</li>
<p><span class="lang:r decode:true crayon-inline">ets()</span> позволяет оценивать модели, используя либо простую сумму квадратов отклонений, либо функцию правдоподобия, либо среднюю абсолютную ошибку&#8230; Но траекторных критериев в функции нет. Под траекторными понимаются такие критерии, которые учитывают прогнозную траекторию модели и минимизируют ошибку не на один шаг вперёд, а на несколько.</p>
<li>Отсутствие возможности разбиения выборки на тестовую и проверочную.</li>
<p>Иногда нам нужно просто проверить, как себя поведёт та или иная функция на выбранном ряде данных. Для того, чтобы сопоставить фактические значения с прогнозными с помощью функции <span class="lang:r decode:true crayon-inline">ets()</span> нужно сделать много лишних движений.
</ol>
<p>Этих недостатков мне показалось достаточно для того, чтобы написать свою функцию, но главной проблемой моей функции всё это время была скорость работы. Недавно я переписал главные куски кода в C++, и теперь скорость выросла в разы (порядка 30 раз). Теперь мне за свою функцию не стыдно и можно о ней немного рассказать.</p>
<p>Установить функцию можно легко если в вашем R есть пакет &#171;<span class="lang:r decode:true crayon-inline">devtools</span>&#187; (мы это уже кратко обсуждали <a href="/2015/03/04/ces-github/">в статье про CES</a>). Однако при сборке под Windows вам может понадобиться программа под названием &#171;Rtools&#187;. Скачать её можно <a href="https://cran.r-project.org/bin/windows/Rtools/">отсюда</a>, устанавливать лучше в корневой каталог. Так же для сборки понадобятся пакеты <span class="lang:r decode:true crayon-inline">Rcpp</span> и <span class="lang:r decode:true crayon-inline">RcppArmadillo</span>:</p>
<pre>
install.packages("Rcpp")
install.packages("RcppArmadillo")
</pre>
<p>В случае возникновения проблем, рекомендую просмотреть <a href="/using-r/">статью про основы R</a>.</p>
<p>После этого установка пакета с функцией <span class="lang:r decode:true crayon-inline">es()</span> (от английского &#171;Exponential Smoothing&#187;) выполняется следующей командой:</p>
<pre>
devtools::install_github("trnnick/TStools")
</pre>
<p>В этот репозиторий я загружаю уже протестированные функции, а всё самое весёлое и потенциально плохо работающее я загружаю в свой пакет «<a href="https://github.com/config-i1/prognosis" target="_blank">prognosis</a>». Если вы смелый, ловкий, умелый, то милости прошу установить пакет «prognosis».</p>
<p>После установки подключим пакет в R:</p>
<pre>
library("TStools")
</pre>
<p>А теперь посмотрим, что нам даёт эта функция <span class="lang:r decode:true crayon-inline">es()</span>. Возьмём для примера какой-нибудь ряд из базы M3. Например, N1234. Для того, чтобы сравнить прогнозные и фактические значения на проверочной выборке, предварительно объединим тестовую и проверочную части в одну переменную \( y \):</p>
<pre>
y <- ts(c(M3$N1234$x,M3$N1234$xx),frequency=frequency(M3$N1234$x),start=start(M3$N1234$x))
</pre>
<p>И для начала попросим функцию самостоятельно выбрать наилучшую модель экспоненциального сглаживания и дать прогноз на 8 наблюдений вперёд.</p>
<pre>
es(y,h=8,holdout=TRUE)->test
</pre>
<p>В результате этого получим следующий график:</p>
<div id="attachment_342" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/08/ets2-plot-01.png"><img decoding="async" aria-describedby="caption-attachment-342" src="/wp-content/uploads/2015/08/ets2-plot-01-300x189.png" alt="График ряда N1234 и модели ETS(A,A,N), построенной по нему." width="300" height="189" class="size-medium wp-image-342" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-01-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-01.png&amp;nocache=1 849w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-342" class="wp-caption-text">График ряда N1234 и модели ETS(A,A,N), построенной по нему.</p></div>
<p>и вывод в консоль:</p>
<pre>
Building model: ANN AAN AAdN AMN AMdN ANA AAA AAdA AMA AMdA ANM AAM AAdM AMM AMdM MNN MAN MAdN MMN MMdN MNA MAA MAdA MMA MMdA MNM MAM MAdM MMM MMdM ... Done! 
"Time elapsed: 4.04 seconds"
"Model constructed: MAN"
"Persistence vector: 0.672, 0.233"
"Initial components: 7036.588, 7.801"
"Residuals sigma: 0.008"
"CF type: one step ahead; CF value is: 4677"
"Biased log-likelihood: -258"
"AIC: 515.97 AICc: 516.97"
"MASE: 4.82"
"MASALE: 3.72%"
</pre>
<p>Разберём построчно, что же мы тут получили.</p>
<p>В первой строке перечислены все опробованные модели, и слова в ней добавляются по мере построения модели.</p>
<p>В строке [2] показано время, потраченное на работу программы. Эта информация позволяет нам прикинуть, сколько может занять работа программы по массиву похожих временных рядов. 8 секунд - это, конечно, немало. Надеюсь, в будущем я смогу ещё оптимизировать код и довести этот показатель до 2 - 3 секунд.</p>
<p>Строка [3] показывает выбранную функцией модель. Это модель с аддитивной ошибкой, аддитивным трендом, без сезонности. Этой модели соответствует метод Хольта.</p>
<p>Строкой [4] перечислены оптимальные постоянные сглаживания, которые функция es получила в ходе расчётов.</p>
[5] - это стартовые значения компонент уровня и тренда в модели Хольта.</p>
[6] - это стандартное отклонение остатков полученной модели.</p>
<p>В строке [7] написано, какой критерий использовался при оценке. "One step ahead" соответствует минимизации средней квадратической одношаговой прогнозной ошибки. Подробней о критериях скоро можно будет прочитать в готовящейся к публикации статье "Методы оценки параметров моделей" в разделе <a href="/forecasting_toolbox/">Инструментарий прогнозиста</a>.</p>
<p>CF value в той же строе [7] - это значение полученной целевой функции. Особо полезной информации не несёт, но позволяет проводить элементарное сравнение между моделями, построенными по одному и тому же ряду данных.</p>
[8] Biased log-likelihood - смещённое значение логарифмированной функции правдоподобия. Техническая деталь, не несущая особой пользы человечеству. Будет убрана в следующем релизе.</p>
<p>Информационные критерии AIC и AICc в строке [9] позволяют проводить более корректно сравнение между моделями. Общий принцип - чем меньше значение, тем ближе модель к некой "истинной", лежащий где-то там, в основе мироздания. Для модели ETS(M,A,N), как видим, получились такие вот значения. Для сравнения, для сезонной модели ETS(A,A,A), построенной по этому же ряду, у меня получились такие значения: "AIC: 526.862 AICc: 532.005". Это говорит о том, что модель ETS(M,A,N) ближе к истине, чем ETS(A,A,A), что неудивительно - в нашем ряде данных сезонности нет. Информационные критерии мы ещё обсудим в будущем параграфе "Выбор прогнозной модели" раздела "<a href="/forecasting_toolbox/">Инструментарий прогнозиста</a>".</p>
<p>Пунктами [10] и [11] показаны ошибки прогноза. Первая - это "Mean Absolute Scale Error", а вторая - такая же, отличающаяся лишь знаменателем в формуле. Чем меньше значение, тем точнее оказался прогноз. Подробней о них мы поговорим во всё том же разделе "<a href="/forecasting_toolbox/">Инструментарий прогнозиста</a>". Но не сегодня.</p>
<p>Но и это ещё не всё. Переменная test, в которую мы сохранили результаты работы нашей функции, содержит в себе кучу всего интересного (вызываемого командой вида <span class="lang:r decode:true crayon-inline">test$var</span>, где <span class="lang:r decode:true crayon-inline">var</span> - это имя переменной):</p>
<ul>
<li><strong>persistence</strong> - вектор постоянных сглаживания. Может содержать от 1 до 3-х следующих элементов: \(\alpha, \beta, \gamma \).</li>
<li><strong>phi</strong> - значение коэффициента демпфирования. Имеет смысл только в случае, если построена модель с демпфированным трендом.</li>
<li><strong>states</strong> - матрица, содержащая компоненты экспоненциального сглаживания. В случае с нашей моделью ETS(A,A,N) содержит 2 столбца: уровень и тренд. Её можно так же представить графически следующим образом:
<pre>
plot(test$states)
</pre>
<p>Должен получиться вот такой график:</p>
<div id="attachment_348" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/08/ets2-plot-02.png"><img decoding="async" aria-describedby="caption-attachment-348" src="/wp-content/uploads/2015/08/ets2-plot-02-300x189.png" alt="Компоненты модели ETS(M,A,N) по ряду N1234 в динамике" width="300" height="189" class="size-medium wp-image-348" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-02-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-02.png&amp;nocache=1 849w" sizes="(max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-348" class="wp-caption-text">Компоненты модели ETS(M,A,N) по ряду N1234 в динамике</p></div>
</li>
<li><strong>fitted</strong> - расчётные значения в тестовой выборке.</li>
<li><strong>forecast</strong> - прогноз по модели (соответствующий проверочной выборке).</li>
<li><strong>residuals</strong> - остатки модели, соответствующие одношаговым ошибками, полученным по тестовой выборке.</li>
<li><strong>errors</strong> - матрица ошибок модели. В случае, если использовался стандартный критерий "One step ahead" совпадает с остатками residuals. В случае с другими критериями содержит итоговую матрицу многошаговых ошибок.</li>
<li><strong>x</strong> - исходный ряд данных (весь ряд, отправленные функции).</li>
<li><strong>ICs</strong> - информационные критерии AIC и AICc, рассчитанные для модели.</li>
<li><strong>CF</strong> - значение целевой функции.</li>
<li><strong>FI</strong> - матрица "информация Фишера". Получается из функции правдоподобия и нужна для расчёта дисперсий коэффициентов. В R ковариационную матрицу коэффииентов на основе неё можно легко получить с помощью следующей команды:
<pre>
solve(-test$FI)
</pre>
</li>
</ul>
<p>Мы можем попросить <span class="lang:r decode:true crayon-inline">es()</span> построить нам какую-нибудь конкретную модель экспоненциального сглаживания, а не выбранную автоматически. Для этого надо передать функции название модели. Например, для модели демпфированного тренда ETS(A,Ad,N) нужно ввести:</p>
<pre>
es(y,model="AAdN",h=8,holdout=TRUE)->test
</pre>
<p>Вывод в консоль будет аналогичным предыдущему, а график получится такой:</p>
<div id="attachment_350" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/08/ets2-plot-03.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-350" src="/wp-content/uploads/2015/08/ets2-plot-03-300x189.png" alt="График ряда N1234 и модели ETS(A,Ad,N), построенной по нему." width="300" height="189" class="size-medium wp-image-350" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-03-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-03.png&amp;nocache=1 849w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-350" class="wp-caption-text">График ряда N1234 и модели ETS(A,Ad,N), построенной по нему.</p></div>
<p><span class="lang:r decode:true crayon-inline">es()</span> может построить и всякие "запрещённые" в <span class="lang:r decode:true crayon-inline">ets()</span> модели. Например, по ряду N2568 самой близкой к "идеальной" будет модель ETS(A,Ad,M), которая соответствует методу Хольта-Уинтерса и в <span class="lang:r decode:true crayon-inline">ets()</span> недоступна. Выглядит это графически вот так:</p>
<div id="attachment_352" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/08/ets2-plot-04.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-352" src="/wp-content/uploads/2015/08/ets2-plot-04-300x189.png" alt="Ряд N2568 и прогноз по модели ETS(A,Ad,M)." width="300" height="189" class="size-medium wp-image-352" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-04-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-04.png&amp;nocache=1 849w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-352" class="wp-caption-text">Ряд N2568 и прогноз по модели ETS(A,Ad,M).</p></div>
<p><span class="lang:r decode:true crayon-inline">es()</span> так же может находить параметры из классических и из расширенных границ для постоянных сглаживания. Я лично считаю, что только расширенные границы и нужно использовать при оценке моделей экспоненциального сглаживания, но некоторые прогнозисты со мной не согласны (но мы их со временем переубедим. На нашей стороне правда и Keith Ord). По умолчанию в функции используются классические границы, но расширенные включаются достаточно легко:</p>
<pre>
y <- ts(c(M3$N2568$x,M3$N2568$xx),frequency=frequency(M3$N2568$x),start=start(M3$N2568$x))
es(y,h=18,holdout=TRUE,bounds="admissible")->test
</pre>
<p>Вместо слова "admissible" можно ввести и просто первую букву - "a".</p>
<p>Из-за того, что расширенные границы больше классических, во время оптимизации могут получаться другие оптимальные значения параметров. Для нашего сезонного ряда N2568 оптимальной моделью теперь будет ETS(M,A,M), которая позволяет построить более точный прогноз по ряду. Графически это выглядит так:</p>
<div id="attachment_355" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/08/ets2-plot-05.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-355" src="/wp-content/uploads/2015/08/ets2-plot-05-300x189.png" alt="Ряд 2568 и модель ETS(M,A,M)" width="300" height="189" class="size-medium wp-image-355" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-05-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/08/ets2-plot-05.png&amp;nocache=1 849w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-355" class="wp-caption-text">Ряд 2568 и модель ETS(M,A,M)</p></div>
<p>И вот мы подобрались к самому интересному. Достаточно важной особенностью функции <span class="lang:r decode:true crayon-inline">es()</span> является возможность использовать <a href="/forecasting_toolbox/estimation-advanced-methods/">тракеторные целевые функции</a>. По умолчанию используется нечто под названием "TLV" - Total Logarithmic Variation. Суть метода заключается в том, что вместо одношаговой ошибки на каждом наблюдении производится многошаговая (от 1 до h, где h - срок прогнозирования). Затем по этим ошибкам рассчитываются дисперсии, которые логарифмируются, суммируются и минимизируются. На сайте на эту тему <a href="/forecasting_toolbox/estimation-advanced-methods/">есть статья</a>. Напомним, что использование "TLV" позволяет увеличивать точность долгосрочных прогнозов при незначительном уменьшении точности краткосрочных. Помимо TLV есть ещё "GV" - generalised variance, "TV" - Total Variation и "hsteps" - ошибка прогноза на h шагов вперёд. При использовании TLV и GV можно так же легко использовать процедуру выбора наилучшей модели. А вот использование этой процедуры в случаях с TV и hsteps ничем теоретически не обосновано.</p>
<p>Посмотрим, что получится, если использовать траекторную целевую функцию для того же сезонного ряда N2568:</p>
<pre>
es(y,h=18,holdout=TRUE,trace=TRUE)->test
</pre>
<p>Оптимальной остаётся всё та же функция ETS(M,A,M), параметры отличаются незначительно, но точность прогноза вырасла - ошибка уменьшилась с 8,71% до 6,37%. А всё из-за того, что во втором случае лучше выявлены долгосрочные тенденции.</p>
<p>Про методы оценки моделей можно <a href="/forecasting_toolbox/estimation-advanced-methods/">почитать здесь</a>, а можно - и просто <a href="/2015/07/15/euro-2015/">посмотреть презентацию</a>, которую я делал в Глазгоу - там вкратце описана идея траекторных целевых функций.</p>
<p>Пока по <span class="lang:r decode:true crayon-inline">es()</span> всё. Функция всё ещё разрабатывается и дорабатывается. Следите за обновлениями!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/08/11/ets2-for-r/">Функция es для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2015/08/11/ets2-for-r/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
			</item>
		<item>
		<title>Комплексное экспоненциальное сглаживание для R</title>
		<link>https://openforecast.org/ru/2015/03/04/ces-github/</link>
					<comments>https://openforecast.org/ru/2015/03/04/ces-github/#comments</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 04 Mar 2015 13:05:22 +0000</pubDate>
				<category><![CDATA[CES]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[комплексные переменные]]></category>
		<category><![CDATA[программирование]]></category>
		<category><![CDATA[статистика]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=48</guid>

					<description><![CDATA[<p>Какое-то время назад я разработал функцию, позволяющую строить прогнозы с использованием модели Комплексного экспоненциального сглаживания (Complex Exponential Smoothing &#8212; CES). Эта функция опубликована на сайте github под лицензией GPL v.3. С помощью этой функции можно давать прогнозы на произвольные промежутки времени как для не сезонных, так и для сезонных временных рядов. Кроме того, функция позволяет [&#8230;]</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/03/04/ces-github/">Комплексное экспоненциальное сглаживание для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Какое-то время назад я разработал функцию, позволяющую строить прогнозы с использованием модели Комплексного экспоненциального сглаживания (Complex Exponential Smoothing &#8212; CES). Эта функция <a title="Страница проекта на guthub" href="https://github.com/config-i1/smooth" target="blank">опубликована на сайте github</a> под лицензией GPL v.3. С помощью этой функции можно давать прогнозы на произвольные промежутки времени как для не сезонных, так и для сезонных временных рядов. Кроме того, функция позволяет включать в модель экзогенные переменные. Давайте рассмотрим пример того, как она работает.</p>
<p>Для того, чтобы установить эту функцию себе на компьютер нужно установить пакет smooth из CRAN:</p>
<pre>install.packages("smooth")</pre>
<p>В качестве альтернативы можно установить пакет из GitHub. Для этого:</p>
<p>1.  Установить пакет &#171;devtools&#187;, если он не установлен:</p>
<pre>if (!require("devtools")){install.packages("devtools")}</pre>
<p>2. Установить пакет &#171;CES&#187; с сайта github:</p>
<pre>devtools::install_github("config-i1/smooth")</pre>
<p>После того, как пакет установился, подключаем его в R:</p>
<pre>library("CES")</pre>
<p>Возьмём для наших примеров временной ряд №387 из базы рядов M3. Для того, чтобы база рядов была доступна, в R надо установить и подключить пакет &#171;Mcomp&#187;:</p>
<pre>install.packages("Mcomp")
library("Mcomp")</pre>
<p>Построим график по ряду:</p>
<pre>plot(M3$N0387$x,ylab="Series N0387")</pre>
<p>Вот он:</p>
<div id="attachment_50" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/03/N0387.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-50" class="size-medium wp-image-50" src="/wp-content/uploads/2015/03/N0387-300x189.png" alt="Ряд 387 из базы рядов M3" width="300" height="189" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387.png&amp;nocache=1 859w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-50" class="wp-caption-text">Ряд N0387 из базы рядов M3</p></div>
<p>Этот ряд относится к годовым, для таких рядов в M3 строят прогнозы на срок в 6 лет. Построим CES и дадим точечный и интервальный прогнозы. Делается это с помощью следующей команды:</p>
<pre>ces(M3$N0387$x,h=6,intervals=T) -> test</pre>
<p>Функция выдаёт много информации и возвращает кучу векторов и матриц. Поэтому мы используем &#171;-&gt; test&#187; для сохранения этих данных в отдельный объект. Кроме того, она возвращает нам следующую информацию:</p>
<pre>"Time elapsed: 0.19 seconds"
"Model constructed: Complex Exponential Smoothing"
"a0 + ia1: 1.88365413369954+0.97087980257933i"
"ABS Eigenvalues for stability condition:"
0.9364115 0.1399830
"CF value is: 1574102"
"AIC: 264.846; AICc: 267.922; BIC: 268.407; CIC:260.846"</pre>
<p>Разберём по пунктам, что мы тут получили.</p>
[1] &#8212; нам сообщают, что на построение модели ушло 0,19 секунд, что хорошо. Иногда, когда наблюдений много (например, 100), построение функции может затянуться на десятки секунд. Вызвано это тем, что R достаточно медленная программа. Возможно, я как-нибудь займусь C++ и перепишу код функции, тогда она будет работать значительно эффективней и быстрей. Но это планы на будущее. Сразу же стоит заметить, что скорость вычислений будет меняться от компьютера к компьютеру. Чем мощнее ваш железный конь, тем быстрее будут найдены оптимальные параметры модели.</p>
[2] &#8212; нам сообщили, что построили модель Комплексного экспоненциального сглаживания. Альтернативы &#8212; та же модель, только с сезонностью.</p>
[3] &#8212; мы видим значение комплексной постоянной сглаживания. По ней самой можно сказать, что CES даст прогноз на снижение (так как мнимая часть меньше единицы) и что ряд данных испытывает значительные изменения (так как действительная часть близка к 2).</p>
[4] и [5] &#8212; далее нам выдали значения собственных чисел матрицы дисконтирования. Если все они меньше единицы, то полученная модель стабильна (то есть старые значения не влияют на прогноз). Если бы модель получилась нестабильной, нам бы об этом сообщили.</p>
[6] &#8212; после этого мы видим значение целевой функции (сумма квадратов ошибок), которое само по себе полезной информации несёт немного.</p>
[7] &#8212; и последнее &#8212; значения информационных критериев. Помимо трёх первых стандартных тут ещё рассчитывается комплексный информационный критерий (Complex IC &#8212; CIC), который представляет собой AIC с другим числом степеней свободы (см. <a title="Число степеней свободы в комплекснозначных моделях" href="/2015/03/03/complexdf/">соответствующую заметку</a>).</p>
<p>Функция &#171;ces&#187; так же строит такой график:</p>
<div id="attachment_51" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/03/N0387-ces-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-51" class="size-medium wp-image-51" src="/wp-content/uploads/2015/03/N0387-ces-1-300x189.png" alt="CES и прогноз по ней" width="300" height="189" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387-ces-1-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387-ces-1.png&amp;nocache=1 859w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-51" class="wp-caption-text">Ряд N0387 и его прогноз по CES</p></div>
<p>Чтобы использовать прогноз CES, нам достаточно запросить его у R. Точечный прогноз:</p>
<pre>test$forecast</pre>
<p>Интервальный прогноз:</p>
<pre>test$high
test$low</pre>
<p>Если же нас интересует, насколько точно модель дала прогноз, мы можем включить тестовую выборку и немного изменить исходный запрос на:</p>
<pre>x <- ts(c(M3$N0387$x,M3$N0387$xx),frequency=frequency(M3$N0387$x),start=start(M3$N0387$x))
ces(x,h=6,intervals=T,holdout=T) -> test</pre>
<p>Первой строчкой мы объединили обучающую (M3$N0387$x) и тестовую (M3$N0387$xx) выборки в одну и сохранили это всё как объект &#171;x&#187; имеющий тип &#171;ts&#187; &#8212; временной ряд.</p>
<p>Второй строкой мы построили модель CES по обучающей выборке и дали прогноз на тестовую: команда holdout=T сообщает о том, что из всего ряда нужно h=6 последних наблюдений использовать для тестовой выборки. В результате использования этой команды мы получим немного другой вывод в командную строку:</p>
<pre>"Time elapsed: 0.17 seconds"
"Model constructed: Complex Exponential Smoothing"
"a0 + ia1: 1.88365413369954+0.97087980257933i"
"ABS Eigenvalues for stability condition:"
0.9364115 0.1399830
"CF value is: 1574102"
"AIC: 264.846; AICc: 267.922; BIC: 268.407; CIC:260.846"
"MASE: 0.614"
"MASE.lvl: 5.224%"</pre>
<p>Как видим, значения [1] &#8212; [7] идентичны предыдущему выводу, однако к ним добавились [8], сообщающий нам значение <a title="MASE в википедии" href="http://en.wikipedia.org/wiki/Mean_absolute_scaled_error" target="blank">MASE</a> для прогноза и [9] сообщающий нечто похожее только с делением на среднюю величину по исходному ряду данных. Эти значения сами по себе нам ни о чём не говорят, но позволяют сравнивать точность прогнозов разных моделей. MASE здесь используется, так как это наиболее адекватная и наименее смещённая мера точности прогноза. MASE.lvl так же является несмещённой, но при этом имеет некую интерпретацию, аналогичную обычной средней абсолютной процентной ошибки аппроксимации (MAPE).</p>
<p>График всего это выглядит следующим образом:</p>
<div id="attachment_52" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/03/N0387-ces-2.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-52" class="size-medium wp-image-52" src="/wp-content/uploads/2015/03/N0387-ces-2-300x189.png" alt="CES и прогноз по ней" width="300" height="189" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387-ces-2-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N0387-ces-2.png&amp;nocache=1 859w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-52" class="wp-caption-text">Ряд N0387 вместе с тестовой выборкой и его прогноз по CES</p></div>
<p>Как видим, прогноз оказался достаточно точным. Впрочем, для какого-то однозначного вывода нужно его сравнить с прогнозами по другим моделям, чего в рамках это статьи мы пока делать не будем.</p>
<p>CES так же умеет строить прогнозы по сезонным временным рядам. Для этого ей нужно передать вектор типа &#171;ts&#187; и задать тип сезонной модели. Например, для сезонного ряда N2568 из M3 команда будет иметь следующий вид:</p>
<pre>ces(M3$N2568$x,h=18,seasonality="F",intervals=T) -> test</pre>
<p>Выбранная сезонность здесь &#8212; &#171;полная&#187; или &#171;комплексная&#187;. Она позволяет моделировать как аддитивную, так  мультипликативную сезонность во временных рядах. В коде так же реализованы частичная (&#171;P&#187;), она же просто аддитивная, сезонность и простая сезонная модель &#171;S&#187;, не имеющая тренда. Подробней обо всём это можно будет почитать в скором времени в статье, которая готовится к выпуску.</p>
<p>А вот вывод нашей команды:</p>
<pre>Non-stable model estimated! Use with care! To avoid that reestimate ces using 'bounds=TRUE'.
"Time elapsed: 4.34 seconds"
"Model constructed: Complex Exponential Smoothing with a full (complex) seasonality"
"a0 + ia1: 1.13652538578959+1.00295810649073i"
"b0 + ib1: 1.66249591228014+1.02106035157178i"
"ABS Eigenvalues for stability condition:"
1.0043258 0.6192850 0.1573755 0.1164405
"CF value is: 36299094"
"AIC: 2079.247; AICc: 2101.13; BIC: 2161.855; CIC:2047.247"</pre>
<p>Как видим, R сообщил нам, что построена нестабильная модель (красная строка). Он нам так же предложил переоценить модель с параметром &#171;bounds=TRUE&#187;, который отвечает за подбор параметров исключительно в области стабильных параметров. Это имеет смысл сделать, так как в противном случае прогноз может быть неадекватным и непредсказуемым (как бы это забавно не звучало), однако скорость вычислений в таком случае снизится.</p>
<p>Из нового в данном выводе &#8212; название модели (с полной сезонностью) и значение сезонной комплексной постоянной сглаживания [5]. Всё остальное аналогично предыдущему примеру. Заметим, что одно из собственных чисел в строке [7] оказалось больше единицы, что как раз и привело к жуткой красной надписи.</p>
<p>Перезапустим функцию с предложенным параметром:</p>
<pre>ces(M3$N2568$x,h=18,seasonality="F",intervals=T,bounds=T) -> test</pre>
<p>Итоговый вывод и прогноз изменятся:</p>
<pre>"Time elapsed: 36.72 seconds"
"Model constructed: Complex Exponential Smoothing with a full (complex) seasonality"
"a0 + ia1: 1.14042311450241+0.99312271083681i"
"b0 + ib1: 1.62771138458957+1.04585709733533i"
"ABS Eigenvalues for stability condition:"
0.9999924 0.5183545 0.2109118 0.1898389
"CF value is: 36209112"
"AIC: 2078.959; AICc: 2100.842; BIC: 2161.567; CIC:2046.959"</pre>
<p>Время на вычисления теперь заняло 36,72 секунды, что почти в 10 раз больше, чем в предыдущий раз. Однако это привело к получению стабильной модели и нахождению коэффициентов, которые гарантируют немного меньшее значение целевой функции. Прогноз по CES в этом случае выглядит так:</p>
<div id="attachment_53" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/03/N2568-ces-1.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-53" class="size-medium wp-image-53" src="/wp-content/uploads/2015/03/N2568-ces-1-300x189.png" alt="Ряд N2568, CES и прогноз" width="300" height="189" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N2568-ces-1-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N2568-ces-1.png&amp;nocache=1 859w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-53" class="wp-caption-text">Ряд N2568, CES и прогноз</p></div>
<p>Мы могли бы так же поиграться с тестовой выборкой, но делать этого не будем. Попробуйте проделать это сами ;).</p>
<p>Функция &#171;ces&#187; так же позволяет включать экзогенные переменные. В этом случае нужно ей передать в параметре &#171;xreg&#187; либо вектор (обычный либо &#171;ts&#187;), соответствующей переменной, либо матрицу (или &#171;data.frame&#187;), длинна которой должна либо соответствовать обучающей выборке, либо соответствовать обучающей выборке + горизонту прогнозирования. В первом случае значения экзогенных переменных экстраполируются методом Naïve.</p>
<p>К сожалению, под рукой у меня нет рядов данных, для которых можно было бы использовать экзогенные переменные, так что демонстрацию этой функции оставим на будущее.</p>
<p>Ну, и последнее, что включено в пакет &#171;CES&#187; &#8212; это функция &#171;ces.auto&#187;, которая автоматически выбирает подходящую модель из несезонной / сезонной в зависимости от выбранного ряда данных. Делается это на основе информационного критерия. По умолчанию используется CIC, хотя можно попросить функцию выбрать и другой критерий. Посмотрим, как работает функция для ряда N2568:</p>
<pre>ces.auto(M3$N2568$x,h=18,intervals=T,bounds=T) -> test</pre>
<p>Построения моделей занимает какое-то время, но в конце концов мы получаем следующий вывод:</p>
<pre>"Estimating CES with seasonality = 'N'"
"Estimating CES with seasonality = 'F'"

"The best model is with seasonality = 'F'"
"AIC: 2078.959; AICc: 2100.842; BIC: 2161.567; CIC: 2046.959"</pre>
<p>Информации выводится немного, всё основное содержится в объекте &#171;test&#187;. Самое главное &#8212; это то, что модель точно определила, что перед ней сезонный ряд данных.</p>
<p>Попробуем использовать эту же функцию для какого-нибудь ряда с аддитивной сезонностью и включим модель частичной сезонности. Для примера рассмотрим ряд N1192. Это ряд квартальных данных, период упреждения прогноза в нём обычно берётся равным 8 наблюдений.</p>
<pre>x <- ts(c(M3$N1192$x,M3$N1192$xx),frequency=frequency(M3$N1192$x),start=start(M3$N1192$x))
ces.auto(x,h=8,model.types=c("N","P","F"),holdout=T,bounds=T,intervals=T) -> test</pre>
<p>Параметр &#171;model.types&#187; передаёт функции все названия типов CES, которые нужно проверить по ряду данных. В результате применения этой функции получаем:</p>
<pre>"Estimating CES with seasonality = 'N'"
"Estimating CES with seasonality = 'P'"
"Estimating CES with seasonality = 'F'"

"The best model is with seasonality = 'P'"
"AIC: 204.001; AICc: 234.001; BIC: 210.954; CIC: 197.001"
"MASE: 0.721"
"MASE.lvl: 3.885%"</pre>
<p>Наилучшая модель &#8212; это модель с частичной сезонностью, так как ряд данных имеет аддитивную сезонную компоненту. Выглядит прогноз следующим образом:</p>
<div id="attachment_54" style="width: 310px" class="wp-caption alignnone"><a href="/wp-content/uploads/2015/03/N1192-ces.png"><img loading="lazy" decoding="async" aria-describedby="caption-attachment-54" class="size-medium wp-image-54" src="/wp-content/uploads/2015/03/N1192-ces-300x189.png" alt="Ряд N1192, CES и прогноз" width="300" height="189" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N1192-ces-300x189.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2015/03/N1192-ces.png&amp;nocache=1 859w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><p id="caption-attachment-54" class="wp-caption-text">Ряд N1192, CES и прогноз</p></div>
<p>Чисто графически видно, что точечный прогноз оказался недостаточно точным. Вызвано это малым количеством данных &#8212; точность CES повышается с ростом числа наблюдений. Тем не менее будущие значения попали в прогнозный интервал, так что не всё потеряно.</p>
<p>Применение той же команды для какого-нибудь другого ряда, только без сезонности, приводит к выбору несезонной модели CES. Можете поверить на слово, а можете сами проверить. Например, на ряде N1041.</p>
<p>По CES пока всё. Как только что-нибудь появится новое, обязательно напишу.</p>
<p>До новых встреч!</p>
<p>Сообщение <a href="https://openforecast.org/ru/2015/03/04/ces-github/">Комплексное экспоненциальное сглаживание для R</a> появились сначала на <a href="https://openforecast.org/ru">Open Forecasting</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/ru/2015/03/04/ces-github/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
