В этом примере показано, как использовать стабильный сезонный фильтр для десезонализации временного ряда (с использованием аддитивного разложения). Временные ряды - ежемесячные случайные смерти в США с 1973 по 1978 год (Brockwell and Davis, 2002).
Загрузите набор данных о случайных смертях.
load('Data_Accidental.mat') y = Data; T = length(y); figure plot(y/1000) h1 = gca; h1.XLim = [0,T]; h1.XTick = 1:12:T; h1.XTickLabel = datestr(dates(1:12:T),10); title 'Monthly Accidental Deaths'; ylabel 'Number of deaths (thousands)'; hold on

Данные показывают сильный сезонный компонент с периодичностью 12.
Сглаживание данных с использованием 13-кратного скользящего среднего. Для предотвращения потери данных наблюдения повторите первое и последнее сглаженные значения шесть раз. Вычтите сглаженный ряд из исходного ряда, чтобы уменьшить количество данных. Добавьте оценку тренда скользящего среднего к графику наблюдаемого временного ряда.
sW13 = [1/24;repmat(1/12,11,1);1/24]; yS = conv(y,sW13,'same'); yS(1:6) = yS(7); yS(T-5:T) = yS(T-6); xt = y-yS; h = plot(yS/1000,'r','LineWidth',2); legend(h,'13-Term Moving Average') hold off

Уменьшенный временной ряд: xt.
Использование параметра shape 'same' при вызове conv возвращает сглаженный ряд той же длины, что и исходный ряд.
Создание массива ячеек, sidx, для хранения индексов, соответствующих каждому периоду. Данные являются ежемесячными, с периодичностью 12, поэтому первый элемент sidx - вектор с элементами 1, 13, 25,..., 61 (соответствующий январским наблюдениям). Второй элемент sidx - вектор с элементами 2, 14, 16,..., 62 (соответствующий февральским наблюдениям). Это повторяется в течение всех 12 месяцев .
s = 12; sidx = cell(s,1); for i = 1:s sidx{i,1} = i:s:T; end sidx{1:2}
ans = 1×6
1 13 25 37 49 61
ans = 1×6
2 14 26 38 50 62
Использование массива ячеек для хранения индексов допускает возможность того, что каждый период не встречается одинаковое количество раз в пределах наблюдаемого ряда.
Применение стабильного сезонного фильтра к убывающей серии, xt. Используя индексы, построенные на этапе 3, усредняют уменьшенные данные, соответствующие каждому периоду. То есть среднее значение всех значений января (по индексам 1, 13, 25,..., 61), а затем среднее значение всех значений февраля (по индексам 2, 14, 26,..., 62) и так далее за оставшиеся месяцы. Поместите сглаженные значения обратно в один вектор.
Центрируйте сезонную оценку, чтобы колебаться около нуля.
sst = cellfun(@(x) mean(xt(x)),sidx); % Put smoothed values back into a vector of length N nc = floor(T/s); % no. complete years rm = mod(T,s); % no. extra months sst = [repmat(sst,nc,1);sst(1:rm)]; % Center the seasonal estimate (additive) sBar = mean(sst); % for centering sst = sst-sBar; figure plot(sst/1000) title 'Stable Seasonal Component'; h2 = gca; h2.XLim = [0 T]; ylabel 'Number of deaths (thousands)'; h2.XTick = 1:12:T; h2.XTickLabel = datestr(dates(1:12:T),10);

Стабильная сезонная составляющая имеет постоянную амплитуду по ряду. Сезонная оценка центрирована и колеблется около нуля.
Вычтите оцененный сезонный компонент из исходных данных.
dt = y - sst; figure plot(dt/1000) title 'Deseasonalized Series'; ylabel 'Number of deaths (thousands)'; h3 = gca; h3.XLim = [0 T]; h3.XTick = 1:12:T; h3.XTickLabel = datestr(dates(1:12:T),10);

Десезонализированный ряд состоит из долгосрочного тренда и нерегулярных компонентов. Масштабная квадратичная тенденция в количестве случайных смертей очевидна с удалением сезонной составляющей.
Ссылки:
Броквелл, П. Дж. и Р. А. Дэвис. Введение во временные ряды и прогнозирование. 2-й ред. Нью-Йорк, Нью-Йорк: Спрингер, 2002.