Немного О Периодограммах Временных Рядов

Привет, Хабр! Сегодня я хочу поговорить о периодограмме и одном из возможных ее применений в области анализа временных рядов.

С его помощью можно определить, насколько хорошо идентифицированы постоянная, сезонная и случайная составляющие, а также сделать общие выводы о структуре временного ряда.

В этой статье я предлагаю посмотреть, как строится периодограмма, и проанализировать модельные и реальные примеры.

Кому интересно - добро пожаловать под кат.



Немного теории

Временной ряд – это данные, измеренные последовательно через определенные, чаще всего равные, промежутки времени.

В классическом случае предполагается, что временной ряд состоит из трех составляющих: трендовой (T_n), сезонной (S_n) и случайной (E_n).

Классические модели временных рядов:

Немного о периодограммах временных рядов

в аддитивном случае и

Немного о периодограммах временных рядов

в мультипликативе.

Какова бы ни была цель исследования временных рядов, зачастую рекомендуется с самого начала попытаться разделить и проанализировать каждый компонент. Объясню на нескольких примерах, почему это может быть необходимо.

Зная тенденцию или тенденцию ряда, можно делать прогнозы на несколько пунктов вперед и говорить о характере происходящего процесса в какой-либо долгосрочной перспективе.

Зная характер сезонной составляющей, можно формулировать различные гипотезы, а также корректировать прогноз в зависимости от характера сезонности.

Случайную величину можно изучать, чтобы понять, насколько исследуемый процесс подвержен случайным воздействиям, и попытаться исключить эту случайную часть при построении аппроксимации или прогноза.

Для выделения и анализа каждой части используются специальные статистические приемы и методы.

Анализируя периодограмму ряда, можно установить наличие или отсутствие той или иной компоненты, а также ее характер и относительную величину.

Сама периодограмма является функцией частоты, которая показывает оценку спектральной плотности сигнала.

Давайте посмотрим на это более подробно.

Действительная функция f может быть представлена как сумма синусов и косинусов разных частот с помощью разложения Фурье.



Немного о периодограммах временных рядов

Если вместо функции рассматривать ряд, то сумма квадратов коэффициентов при синусе и косинусе конкретной частоты покажет влияние конкретных частот на значения ряда.

Формально периодограмма записывается следующим образом:

Немного о периодограммах временных рядов

Перейдем к практике и посмотрим, как все это можно использовать.



Примеры

Рассмотрим примеры для нескольких серий моделей и реальных данных.

Сначала рассмотрим простейший ряд, состоящий из нормально распределенной случайной величины с нулевым математическим ожиданием и единичной дисперсией.

Этот ряд называется гауссовским белым шумом.

Давайте сгенерируем тысячу наблюдений гауссовского белого шума.

  
  
  
  
  
   

set.seed(1) par(mfrow=c(2,1)) data <- rnorm(1000, 0, 1) plot.ts(data, type="l") spectrum(data, log='no')



Немного о периодограммах временных рядов

Поскольку определяющих частот для шума вообще нет, то по периодограмме мы видим, что каждая частота входит примерно с одинаковой силой.

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

Отсюда и название белый шум – все частоты смешаны в равных пропорциях.

Мы не видим идеально равного инвестирования всех частот, поскольку это все же случайная величина, и конкретные отклонения зависят от реализации.

Если при выборе случайного компонента вы получаете что-то подобное, то можете считать, что шум был извлечен правильно.

Отличие красного шума от белого в том, что предыдущие значения влияют на последующие, т.е.

имеют ненулевую корреляцию, в отличие от белого шума.

Мы знаем, как рассчитывается корреляция; соответственно, мы можем выразить красный шум через белый шум с заранее определенным значением корреляции следующим образом:

Немного о периодограммах временных рядов

Подробности можно узнать, например, здесь.



set.seed(42) wnoise <- rnorm(1000, 0, 1) w0 <- wnoise[1] wnoise <- wnoise[2:1000] cor <- 0.8 rnoise = Reduce(function(prev_v, next_v) cor * prev_v + next_v * sqrt(1 - cor^2), wnoise, w0, accumulate = T) par(mfrow=c(2,1)) plot.ts(rnoise, type="l") spectrum(rnoise, log='no')



Немного о периодограммах временных рядов

Как и ожидалось, красный шум содержит в основном низкие частоты.

Если мы установим корреляцию ближе к нулю, мы получим белый шум, а если установим ее равным единице, то получим константу, а именно первое значение ряда белого шума.

Теперь предлагаю посмотреть на возможность применения с реальными временными рядами.

Возьмем, к примеру ряд Продажи пива, вина, спиртных напитков исчисляются миллионами долларов.



data <- read.table('.

/shared/MRTSSM4453USN.csv', sep=',', header=T, row.names = 1, ) data <- ts(data, start = c(1992, 1), frequency = 12) plot(data)



Немного о периодограммах временных рядов

Сезонность, очевидно, есть, посмотрим на периодограмму.



spectrum(data, log='no')



Немного о периодограммах временных рядов

Из графика сразу видно, что наибольшие пики стоимости расположены в сетке сезонности.

Наибольший пик приходится на точку 2, т.е.

в период 2/12, что указывает на наличие полугодовой сезонности.

Остальное можно интерпретировать аналогично.

Мы также видим значения в области низких частот; это медленно меняющаяся составляющая сериала - тенденция.

Таким образом, помимо того, что мы видим, какие частоты преобладают в ряду и какую периодичность имеет ряд, по периодограмме можно также оценить, насколько хорошо мы сгладили ряд. Существует много способов сгладить ряд и выделить тенденцию, и какой из них лучше, нужно решать в зависимости от характера данных.

Для демонстрации мы будем использовать метод классической модели декомпозиции, содержащийся в стандартном пакете статистики языка R.

decomposeTs <- stats::decompose(log(data)) plot(decomposeTs)



Немного о периодограммах временных рядов

Давайте посмотрим на периодограмму тренда, сезонности и шума.



spectrum(decomposeTs$trend, log='no', na.action = na.omit) spectrum(decomposeTs$seasonal, log='no', na.action = na.omit) spectrum(decomposeTs$random, log='no', na.action = na.omit)



Немного о периодограммах временных рядов



Немного о периодограммах временных рядов



Немного о периодограммах временных рядов

Периодограмма тренда содержит в основном низкие частоты, и это хорошо.

Сезонность слишком идеальна, это связано с методом экстракции, который всегда изолирует чистую сезонность, поскольку оперирует усреднением.

Шум похож на случайную величину, есть пики около 4 и 5, которые обманчиво кажутся большими, но если посмотреть на значение, то можно увидеть, что они не сильно выделяются на фоне шума.

С другой стороны, их можно включить в следующий период сезонности, тогда шум будет еще ближе к случайному.

Для этого примера стоит попробовать другие методы, результаты которых также можно проанализировать с помощью периодограммы.

Теги: #математика #анализ данных #Интеллектуальный анализ данных #временные ряды #r #графики и диаграммы #анализ данных в r

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.