ГЛАВА 8 Выявление структурных изменений
Практически любая промышленная система сегодня снабжена совокупностью сенсоров, датчиков и других измерительных устройств, позволяющих вести учет ее состояния (часто в реальном времени). Количество таких измерительных устройств и учитываемых с их помощью показателей может быть очень большим, что требует автоматизации процесса мониторинга и своевременного оповещения о нестандартных (например, предаварийных и аварийных) ситуациях. Подобные нестандартные ситуации обычно сопряжены с существенными изменениям во временных рядах, описывающих те или иные показатели. Одним из типов таких изменений является сдвиг среднего уровня временного ряда, который может быть как очень резким, так и постепенным (рис. 8.1). Существует несколько методов, позволяющих автоматически обнаруживать подобные структурные изменения во временных рядах. Одним из них является метод “E–Divisive with Medians” (EDM), разработанный исследователями из Корнеллского университета и компании Twitter (James, Kejariwal, and Matteson 2015) и реализованный в пакете для R BreakoutDetection
. В этой главе приведено краткое описание основ работы с данным пакетом.
Пакет BreakoutDetection
можно установить только из репозитория GitHub, для чего достаточно воспользоваться функцией install_github()
из пакета devtools
(который, конечно, тоже нужно сначала установить, если у вас его еще нет):
8.1 Метод “E–Divisive with Medians” (EDM)
Подробное описание теории, лежащей в основе EDM, приведено в статье James, Kejariwal, and Matteson (2015). Вкратце, этот метод основан на использовании т.н. \(E\)–статистики (от “energy”, т.е. “энергия”), которая характеризует расстояние между наблюдениями из случайных выборок. Чем больше эта статистика, тем больше оснований считать, что сравниваемые выборки происходят из разных генеральных совокупностей. Во избежание влияния обычных на практике аномальных наблюдений, метод EDM оперирует не средними значениями, а медианами. Более того, это непараметрический метод, т.е. он не исходит из предположения о принадлежности анализируемых наблюдений к каким–либо конкретным распределениям вероятностей. Непараметрическая природа EDM, а также использование медианы в качестве меры центральной тенденции, делают этот метод особенно подходящим для обнаружения структурных изменений во временных рядах при решении практических задач.
8.2 Функция breakout()
В пакете BreakoutDetection
есть всего лишь одна функция — breakout()
, которая имеет следующие аргументы:
Z
— временной ряд, который может быть представлен либо в виде числового вектора, либо в виде таблицы данных со столбцамиtimestamp
(“временная отметка”) иcount
(“количество”).min.size
— минимальное количество наблюдений, которое должно иметь место между точками излома тренда во временном ряду (по умолчанию равно 30).method
— название применяемого к данным сценария по обнаружению структурных изменений. Принимает два возможных значения:"amoc"
(от “at most one change”, т.е. “не более одного изменения”) и"multi"
(несколько точек излома)....
— дополнительные аргументы.
Набор дополнительных аргументов (...
) зависит от значения параметра method
. В обоих случаях (т.е. и "amoc"
, и "multi"
) функция примет следующие аргументы:
plot
— логический значение, включающее (TRUE
) или отключающее (FALSE
) построение графика временного ряда с отметками позиций обнаруженных точек излома тренда;xlab
иylab
— подписи осей графика;title
— заголовок графика.
Если method = "amoc"
, то функция breakout()
примет также:
alpha
— параметр, используемый в EDM для придания разных весов расстояниям между наблюдениями. Принимает любое значение из интервала (0, 2] (по умолчаниюalpha = 2
).exact
— логический аргумент. По умолчанию равенTRUE
, что приводит к расчету точных значений медиан при нахождении точек излома (в случае с длинными рядами это может сопровождаться длительными вычислениями).sig.lvl
— желаемый уровень статистической значимости теста для обнаруженной точки излома тренда (по умолчанию равен 0.05).nperm
— количество итераций при выполнении перестановочного теста. По умолчаниюnperm = 0,
т.е. перестановочный тест не выполняется.
Когда требуется обнаружить несколько точек излома тренда (method = "multi"
), на функцию breakout()
можно подать также следующие аргументы, задающие уровень регуляризации в отношении количества и близости взаимного расположения этих точек:
degree
— параметр, определяющий близость расположения точек излома. Принимает значения 0, 1 (принято по умолчанию) и 2. Чем больше этот параметр, тем меньше точек излома располагаются близко друг к другу.percent
— задает минимальное относительное (%) увеличение внутреннего критерия качества EDM (здесь не рассматривается), необходимое для классификации того или иного наблюдения как точки излома тренда. Например, значение 0.25 соответствует 25%–ному увеличению критерия. Аргументpercent
не имеет значения, принятого по умолчанию.beta
— принимает любое числовое значение (по умолчанию равен 0.008) и используется для регуляризации еслиdegree
и/илиpercent
не заданы. Чем больше этот параметр, тем меньше точек излома будет обнаружено алгоритмом.
8.3 Примеры использования функции breakout()
Применим функцию breakout()
с ее принятыми по умолчанию параметрами к данным по стоимости биткоина (подразд. 1.5.2):
Как видно на рис. 8.2, метод EDM обнаружил одну единственную точку излома тренда (отмечена вертикальной прерывистой линией), что обусловлено принятым по умолчанию аргументом method = "amoc"
(см. выше). Для оценивания статистической значимости этого сдвига во временном ряду следует воспользоваться аргументом nperm
. Выполним такое оценивание с помощью перестановочного теста с 1000 итераций (выполнение этой команды займет какое–то время):
Объект BO0_perm
представляет собой список со следующими элементами:
## $loc
## [1] 561
##
## $stat
## [1] 107.6948
##
## $time
## [1] 44.78
##
## $pval
## [1] 0.000999001
где loc
— это положение точки излома (т.е. ее порядковый номер во временном ряду), stat
— значение E-критерия, time
— время выполнения команды (сек.), а pval
— \(p\)–значение, полученное с помощью перестановочного теста. Как видим, обнаруженный сдвиг уровня временного ряда оказался статистически значимым (на уровне значимости 0.05).
Запросим теперь нахождение нескольких точек излома (рис. 8.3):
Рассмотрим теперь влияние параметров регуляризации. Сначала отключим регуляризацию с помощью параметра degree = 0
(рис. 8.4):
Как было отмечено выше, порядковые номера наблюдений, соответствующих обнаруженным точкам излома, хранятся в элементе loc
получаемого объекта–списка:
## [1] 43 74 113 158 203 246 302 484 680 755 840 879 927 957 992
## [16] 1048 1144 1201
Похожего эффекта (увеличение количества обнаруженных точек излома) можно добиться также с помощью низкого значения параметра percent
(рис. 8.5):
Наконец, снижение параметра beta
тоже приведет к увеличению числа обнаруженных алгоритмом точек излома (рис. 7):
Итак, мы рассмотрели принципы работы с пакетом BreakoutDetection
, в котором реализован один из наиболее эффективных методов обнаружения структурных изменений во временных рядах — “E-Divisive with Medians”. Как было отмечено выше, этот метод особенно хорошо подходит для использования в автоматических системах мониторинга параметров технических систем (именно для этого он изначально был разработан в компании Twitter). Другие примеры, где EDM может оказаться полезным, включают:
- анализ результатов, полученных в ходе A/B тестирования (аргумент
method
со значением"amoc"
позволит оценить влияние экспериментального фактора на сдвиг интересующей исследователя переменной–отклика); - обнаружение изменений в переменных, описывающих поведение людей (например, активность в социальных сетях) или животных и т.п.
Хотя пакет BreakoutDetection
очень прост в использовании и дает надежные результаты, следует отметить, что он, к сожалению, не обновлялся с 2014 г. Об этом стоит помнить, если вы решите использовать его в своих проектах.