Проект Templet

акторный фреймворк для запуска задач
на множестве ядер, кластерах и в облаках
templet.ssau.ru

Инструменты пользователя

Инструменты сайта


translate:using_r_for_time_series_analysis

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
translate:using_r_for_time_series_analysis [2014/12/12 19:14] – [Графическое представление временных рядов] artamonovtranslate:using_r_for_time_series_analysis [2015/02/05 15:34] (текущий) – внешнее изменение 127.0.0.1
Строка 128: Строка 128:
 Мы можем видеть из графика, что временной ряд, вероятно, может быть описан при помощи аддитивной модели, поскольку случайные флуктации в данных примерно постоянны с течением времени. Мы можем видеть из графика, что временной ряд, вероятно, может быть описан при помощи аддитивной модели, поскольку случайные флуктации в данных примерно постоянны с течением времени.
  
-Похожим образом, для построения графика временного ряда числа рождений в месяц в Нью-Йоркемы введём:+Похожим образом, для построения графика временного ряда числа рождений в месяц в Нью-Йорке мы введём:
  
 <code rsplus> <code rsplus>
Строка 137: Строка 137:
  
 Мы можем заметить, что есть сезонные колебания в числе рождений в месяц: есть пик каждое лето и дно каждую зиму. Опять же, похоже временной ряд может быть описан аддитивной моделью, поскольку сезонные колебания примерно постоянны с течением времени и, кажется, не зависят от уровня временного ряда, и случайные колебания также примерно постоянны по значению в течение долгого времени. Мы можем заметить, что есть сезонные колебания в числе рождений в месяц: есть пик каждое лето и дно каждую зиму. Опять же, похоже временной ряд может быть описан аддитивной моделью, поскольку сезонные колебания примерно постоянны с течением времени и, кажется, не зависят от уровня временного ряда, и случайные колебания также примерно постоянны по значению в течение долгого времени.
 +
 +Для построения графика ряда ежемесячных продаж в магазине сувениров на пляже курортного городка в штате Квинсленд Австралии мы используем такой код:
 +
 +<code rsplus>
 +> plot.ts(souvenirtimeseries)
 +</code>
 +
 +{{ :translate:r_timeseries_3.png |}}
 +
 +В этом случае, очевидно, что аддитивная модель не подходит для описания временного ряда, так как размер сезонных колебаний и случайные флуктации возрастают с увеличением уровня временного ряда. Таким образом, нам, возможно, потребуется преобразовать временной ряд для того, чтобы получить некоторый ряд, который можно описать с использованием аддитивной модели. Например, мы можем преобразовать временной ряд, вычислив натуральный логарифм от начальных данных:
 +
 +<code rsplus>
 +> logsouvenirtimeseries <- log(souvenirtimeseries)
 +> plot.ts(logsouvenirtimeseries)
 +</code>
 +
 +{{ :translate:r_timeseries_4.png |}}
 +
 +Здесь мы видим, что величина сезонных колебаний и случайных колебаний в лог-преобразованном временном ряде примерно постоянны в течение долгого времени, и не зависят от уровня временного ряда. Таким образом, лог-преобразованный временной ряд, вероятно, может быть описан с использованием аддитивной модели.
 +
 +==== Разложение временного ряда ====
 +
 +Разложение временного ряда - разделение его на составляющие компоненты, обычно это тренд и нерегулярная составляющая, и если это периодический ряд, сезонная компонента.
 +
 +=== Разложение непериодических данных ===
 +
 +Непериодический временной ряд состоит из составляющей тренда и нерегулярной компоненты. Разложение временного ряда сопряжено с попытками разделить временной ряд на эти компоненты, то есть, оценить трендовую составляющую и нерегулярную составляющую.
 +
 +Для оценки трендовой составляющей в непериодических временных рядах, которые могут быть описаны аддитивной моделью, часто используется метод сглаживания, например, вычислением простого скользящего среднего.
 +
 +Функция ''SMA()'' пакета "TTR" может быть использована для сглаживания временного ряда при помощи скользящего среднего. Для использования этой функции нам необходимо установить пакет "TTR" (инструкции по установки пакетов R смотри  [[http://a-little-book-of-r-for-time-series.readthedocs.org/en/latest/src/installr.html#how-to-install-an-r-package|How to install an R package]]). Как только вы установили пакет "TTR", вы можете загрузить пакет "TTR" введя:
 +
 +<code rsplus>
 +> library("TTR")
 +</code>
 +
 +Затем вы можете использовать функцию ''SMA()'' для сглаживания данных временного ряда. Для использования функции ''SMA()'' вам необходимо указать порядок (ширину) простого скользящего среднего, используя параметр ''n''. Например, чтобы вычислить простое скользящее среднее порядка 5, мы устанавливаем n=5 в функции ''SMA''.
 +
 +Например, как обсуждалось выше, временной ряд годов смерти 42 королей Англии не является периодическим, и, вероятно, может быть описана аддитивной моделью, поскольку случайные флуктации в данных, по грубому приближению,  постоянны по всей выборке:
 +
 +{{ :translate:r_timeseries_5.png |}}
 +
 +Так, мы можем попробовать оценить составляющую тренда этого временного ряда при сглаживании его простым скользящим средним. Для сглаживания временного ряда используем простое скользящее среднее порядка 3 и выведем результирующий график:
 +
 +<code rsplus>
 +> kingstimeseriesSMA3 <- SMA(kingstimeseries,n=3)
 +> plot.ts(kingstimeseriesSMA3)
 +</code>
 +
 +{{ :translate:r_timeseries_6.png |}}
 +
 +Похоже, множество случайных флуктаций всё ещё проявляется во временном ряде, сглаженном при помощи простого скользящего среднего порядка 3. Так, для оценки составляющей тренда с большей точностью мы можем захотеть попробовать сглаживание данных простым скользящим средним большего порядка. Поиск правильного порядка для сглаживания потребует небольшого числа проб и ошибок. Например, мы можем попробовать использовать простое скользящее среднее порядка 8.
 +
 +<code rsplus>
 +> kingstimeseriesSMA8 <- SMA(kingstimeseries,n=8)
 +> plot.ts(kingstimeseriesSMA8)
 +</code>
 +
 +{{ :translate:r_timeseries_7.png |}}
 +
 +Данные, сглаженные при помощи простого скользящего среднего порядка 8, дают прозрачную картину составляющей тренда и мы можем видеть, что продолжительность жизни королей, вероятно, снижалась с примерно 55 лет до примерно 38 лет в период первых 20 королей, а затем увеличивалась до 73 лет к концу правления 40ого короля во временном ряду.
 +
 +=== Разложение периодических данных ===
 +
 +Периодические данные состоят из составляющей тренда, периодической составляющей и нерегулярной составляющей. Разложение временного ряда - разделение этого временного ряда на эти 3 компоненты, то есть оценка этих составляющих.
 +
 +Чтобы оценить составляющую тренда и периодическую составляющую периодического временного ряда, который может быть описан аддитивной моделью, мы можем использовать функцию ''decompose()''. Это функция оценивает тренд, периодическую и нерегулярную составляющие временного ряда, который может быть описан аддитивной моделью.
 +
 +Функиция ''decompose()'' возвращает список объектов в качестве результата, где содержатся оценки периодической составляющей, тренда и нерегулярной компоненты, хранящиеся в именованых элементах этого списка объектов, называемых "seasonal", "trend" и "random" соответственно.
 +
 +Например, как было рассмотрено ранее, временной ряд количества новорожденных по месяца в Нью Йорке - периодический, с пиком каждое лето и провалом каждую зиму, вероятно может быть описан с использованием аддтивной модели, поскольку периодические и случайные флуктации, на первый взгляда, постоянны по величине во времени:
 +
 +{{ :translate:r_timeseries_8.png |}}
 +Для оценки тренда, периодической и нерегулярной составляющей этого временного ряда мы вводим:
 +
 +<code rsplus>
 +> birthstimeseriescomponents <- decompose(birthstimeseries)
 +</code>
 +
 +Оценки значений тренда, периодической и нерегулярной компоненты будут сохранены в переменных 
 +''birthstimeseriescomponents$seasonal'', ''birthstimeseriescomponents$trend'' и ''birthstimeseriescomponents$random''. Например, мы можем вывести оценки значений сезонной компоненты напечатав:
 +
 +<code rsplus>
 +> birthstimeseriescomponents$seasonal # get the estimated values of the seasonal component
 +       Jan        Feb        Mar        Apr        May        Jun        Jul        Aug        Sep        Oct        Nov        Dec
 + 1946 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1947 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1948 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1949 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1950 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1951 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1952 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1953 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1954 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1955 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1956 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1957 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1958 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 + 1959 -0.6771947 -2.0829607  0.8625232 -0.8016787  0.2516514 -0.1532556  1.4560457  1.1645938  0.6916162  0.7752444 -1.1097652 -0.3768197
 +</code>
 +
 +Оценки значений сезонной компоненты приведены для месяцев с января по декабрь для каждого года. Наиюольшее значение сезонной составляющей в июле (примерно 1.46), а наименьшее в февреле (примерно -2.08), что соответствует пику рождаемости в июле и провалу в феврале каждого года.
 +
 +Мы можем вывести оценки тренда, сеознной и нерегулярной компоненты временного ряда используя функцию ''plot()'', например так:
 +
 +<code rsplus>
 +> plot(birthstimeseriescomponents)
 +</code>
 +
 +{{ :translate:r_timeseries_9.png |}}
 +
 +На графиках выше показан исходный временной ряд (верхний график), оценка составляющей тренда(второй сверху), оценка сезонной компоненты(третий сверху) и оценка случайной компоненты(последний). Мы видим, что оценка тренда немного уменьшилась с 24 в 1947 до 22 в 1948, а затем неуклонно росла примерно до 27 в 1959.
 +
 +=== Исключение периодической составляющей ===
 +Если у вас есть периодический временной ряд, который может быть описан аддитивной моделью, вы можете исключить сезонную компоненту, вычтя оценку сезонной компоненты из исходного временного ряда. Мы можем сделать это, используя оценку сезонной компоненты, вычисленной функцией ''decompose()''.
 +
 +Например, для исключения сезонной составляющей временного ряда количества рождений по месяцам в Нью Йорке мы можем оценить сезонную составляющую, используя ''decompose()'', и затем вычесть сезонную компоненту из исходного временного ряда:
 +
 +<code rsplus>
 +> birthstimeseriescomponents <- decompose(birthstimeseries)
 +> birthstimeseriesseasonallyadjusted <- birthstimeseries - birthstimeseriescomponents$seasonal
 +</code>
 +
 +Затем мы можем вывести график временного ряда без сезонной составляющей при помощи функции ''plot()'':
 +
 +<code rsplus>
 +> plot(birthstimeseriesseasonallyadjusted)
 +</code>
 +
 +{{ :translate:r_timeseries_10.png |}}
 +
 +На графике видно, что сезонные перепады были удалены из исходного временного ряда. Получившийся временной ряд содержит только составляющую тренда и нерегулярную составляющую.
 +
 +==== Прогнозирование и экспоненциальное сглаживание ====
 +
 +Экспоненциальное сглаживание может быть использовано для краткосрочных прогнозов данных временного ряда.
 +
 +=== Простое экспоненциальное сглаживание ===
 +Если ваш временной ряд может быть описан аддтивной моделью с постоянным уровнем и не содержит сезонных колебаний, вы можете использовать простое экспоненциальное сглаживание для краткосрочного прогнозирования.
 +
 +Простое экспоненциальное сглаживание даёт возможность оценить уровень в текущей точке. Сглаживание определяется параметром ''alpha'', изменяющимся в диапазоне от 0 до 1. Значения ''alpha'', которые близки к 0 означают, что более старым наблюдениям в истории будут присвоены меньшие веса при прогнозировании будущих значений.
 +
 +Например, файл http://robjhyndman.com/tsdldata/hurst/precip1.dat содержит общее годовое количество осадков в дюймах в Лондоне за период 1813-1912 г. (исходные данные из Hipel and McLeod, 1994). Мы можем прочитать данне в R и вывести их при помощи команды:
 +
 +<code rsplus>
 +> rain <- scan("http://robjhyndman.com/tsdldata/hurst/precip1.dat",skip=1)
 +  Read 100 items
 +> rainseries <- ts(rain,start=c(1813))
 +> plot.ts(rainseries)
 +</code>
 +
 +{{ :translate:r_timeseries_11.png |}}
 +
 +=== Экспоненциальное сглаживание Хольта ===
 +Как видно из графика, уровень остаётся примерно постоянным (среднее значение остаётся постоянным на уровне 25 дюймов). Случайные отклонения во временном ряде примерно постоянны по значению, так что, вероятно, мы можем описать данные используя аддитивную модель. То есть, мы можем прогнозировать при помощи простого экспоненциального сглаживания.
 +
 +Для прогнозирования при помощи простого экспоненциального сглаживания в R, мы можем использовать модель прогноза простого экспоненциального сглаживания при помощи функции ''HoltWinters()''. Чтобы использовать ''HoltWinters()'' для простого экспоненциального сглаживания, мы должны установить параметр ''beta=FALSE'' и ''gamma=FALSE'' в функции ''HoltWinters()'' (параметры ''beta'' и ''gamma'' используются в экспоненциальном сглаживании Хольта и в экспоненциальном сглаживании Хольта-Винтера, как описывается ниже).
 +
 +Функция ''HoltWinters()'' возвращает список переменных, которые содержат именованные элементы.
 +
 +Например, чтобы использовать простое экспоненциальное сглаживание для прогнозирования значений временного ряда годовых осадков в Лондоне, мы введём:
 +
 +<code rsplus>
 +> rainseriesforecasts <- HoltWinters(rainseries, beta=FALSE, gamma=FALSE)
 +> rainseriesforecasts
 +  Smoothing parameters:
 +  alpha:  0.02412151
 +  beta :  FALSE
 +  gamma:  FALSE
 +  Coefficients:
 +    [,1]
 +  a 24.67819
 +</code>
 +
 +Вывод функции ''HoltWinters()'' сообщает нам, что оценка значения параметра ''alpha'' примерно 0.024. Это очень близко к 0, что говорит нам, что прогноз основан на более поздних значениях и в меньшей степени на ранних значениях.
 +
 +По умолчанию, ''HoltWinters()'' делает прогноз только для того же периода времени, что и в исходном временном ряду. В это случае, исходный временной ряд включает осадки в Лондоне за 1813-1912, так что прогноз тоже для периода 1813-1912.
 +
 +TODO
 +
 +=== Экспоненциальное сглаживание Хольта-Винтера ===
 +
 +TODO
 +
 +==== Модели АРПСС (ARIMA) ====
 +
 +TODO
 +
 +
translate/using_r_for_time_series_analysis.1418411675.txt.gz · Последнее изменение: 2014/12/12 19:14 (внешнее изменение)