exponenta event banner

Линейная регрессия в частотной области

В этом примере показано, как использовать дискретное преобразование Фурье для построения модели линейной регрессии для временного ряда. Временные ряды, используемые в этом примере, - это месячное число случайных смертей в США с 1973 по 1979 год. Данные опубликованы в Brockwell and Davis (2006). Первоисточник - Национальный совет по безопасности США.

Введите данные. Копировать exdata в рабочую область MATLAB ®.

exdata = [
        9007        7750        8162        7717        7792        7836
        8106        6981        7306        7461        6957        6892
        8928        8038        8124        7776        7726        7791
        9137        8422        7870        7925        8106        8129
       10017        8714        9387        8634        8890        9115
       10826        9512        9556        8945        9299        9434
       11317       10120       10093       10078       10625       10484
       10744        9823        9620        9179        9302        9827
        9713        8743        8285        8037        8314        9110
        9938        9129        8433        8488        8850        9070
        9161        8710        8160        7874        8265        8633
        8927        8680        8034        8647        8796        9240];

exdata является матрицей 12 на 6. Каждый столбец exdata содержит данные за 12 месяцев. Первая строка каждого столбца содержит количество случайных смертей в США за январь соответствующего года. Последняя строка каждого столбца содержит количество случайных смертей в США за декабрь соответствующего года.

Преобразуйте матрицу данных в временной ряд 72 на 1 и постройте график данных за 1973-1978 годы.

ts = reshape(exdata,72,1);
years = linspace(1973,1979,72);

plot(years,ts,'o-','MarkerFaceColor','auto')
xlabel('Year')
ylabel('Number of Accidental Deaths')

Figure contains an axes. The axes contains an object of type line.

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

X (n) =μ+∑k (Akcos2πknN + Bkcos2πknN) + (n),

где λ - общее среднее значение, N - длина временного ряда, и λ (n) - последовательность белого шума независимых и идентично распределенных (IID) гауссовых случайных величин с нулевым средним и некоторой дисперсией. Термин аддитивный шум учитывает случайность, присущую данным. Параметрами модели являются общее среднее и амплитуды косинусов и синусов. Модель линейна в параметрах.

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

Выполните спектральный анализ данных, чтобы определить, какие частоты вносят значительный вклад в изменчивость данных. Поскольку общее среднее значение сигнала составляет приблизительно 9000 и пропорционально преобразованию Фурье на частоте 0, вычитайте среднее значение до спектрального анализа. Это уменьшает коэффициент Фурье большой величины при частоте 0 и облегчает обнаружение любых значительных колебаний. Частоты в преобразовании Фурье разнесены с интервалом, который является обратным от длины временного ряда, 1/72. Выборка данных ежемесячно, наибольшая частота в спектральном анализе - 1 цикл/2 месяца. В этом случае удобно смотреть на спектральный анализ в терминах циклов/год, так что масштабировать частоты соответственно для визуализации.

tsdft = fft(ts-mean(ts));
freq = 0:1/72:1/2;

plot(freq.*12,abs(tsdft(1:length(ts)/2+1)),'o-', ...
    'MarkerFaceColor','auto')
xlabel('Cycles/Year')
ylabel('Magnitude')
ax = gca;
ax.XTick = [1/6 1 2 3 4 5 6];

Figure contains an axes. The axes contains an object of type line.

Исходя из величин, частота 1 цикл/12 месяцев является наиболее значительным колебанием в данных. Величина за 1 цикл/12 месяцев более чем в два раза превышает любую другую величину. Однако спектральный анализ показывает, что в данных имеются и другие периодические компоненты. Например, по-видимому, существуют периодические компоненты на гармониках (целых кратных) 1 цикл/12 месяцев. Как представляется, существует также периодический компонент с периодом в 1 цикл/72 месяца.

На основе спектрального анализа данных подгоняют простую модель линейной регрессии с использованием косинусного и синусоидального члена с частотой наиболее значимой составляющей: 1 цикл/год (1 цикл/12 месяцев).

Определите частотный блок в дискретном преобразовании Фурье, который соответствует 1 циклу/12 месяцам. Поскольку частоты разнесены на 1/72, а первый бункер соответствует 0 частоте, правильный бункер равен 72/12 + 1. Это частотный блок положительной частоты. Необходимо также включить ячейку частоты, соответствующую отрицательной частоте: -1 цикл/12 месяцев. При индексировании MATLAB частотный блок отрицательной частоты равен 72-72/12 + 1.

Создайте вектор нулей 72 на 1. Заполните соответствующие элементы вектора коэффициентами Фурье, соответствующими положительной и отрицательной частоте 1 цикл/12 месяцев. Инвертировать преобразование Фурье и добавить общее среднее значение, чтобы получить соответствие с данными о случайной смерти.

freqbin = 72/12;
freqbins = [freqbin 72-freqbin]+1;
tsfit = zeros(72,1);
tsfit(freqbins) = tsdft(freqbins);
tsfit = ifft(tsfit);
mu = mean(ts);
tsfit = mu+tsfit;

Постройте график исходных данных вместе с подобранными сериями, используя два коэффициента Фурье.

plot(years,ts,'o-','MarkerFaceColor','auto')
xlabel('Year')
ylabel('Number of Accidental Deaths')
hold on
plot(years,tsfit,'linewidth',2)
legend('Data','Fitted Model')
hold off

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Data, Fitted Model.

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

Чтобы оценить, насколько адекватно одна частота 1 цикл/12 месяцев учитывает наблюдаемые временные ряды, сформируйте остатки. Если остатки напоминают последовательность белого шума, простая линейная модель с одной частотой адекватно смоделировала временной ряд.

Чтобы оценить остатки, используйте автокорреляционную последовательность с 95% -ными интервалами достоверности для белого шума.

resid = ts-tsfit;
[xc,lags] = xcorr(resid,50,'coeff');

stem(lags(51:end),xc(51:end),'filled')
hold on
lconf = -1.96*ones(51,1)/sqrt(72);
uconf = 1.96*ones(51,1)/sqrt(72);
plot(lags(51:end),lconf,'r')
plot(lags(51:end),uconf,'r')
xlabel('Lag')
ylabel('Correlation Coefficient')
title('Autocorrelation of Residuals')
hold off

Figure contains an axes. The axes with title Autocorrelation of Residuals contains 3 objects of type stem, line.

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

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

tsfit2dft = zeros(72,1);
[Y,I] = sort(abs(tsdft),'descend');
indices = I(1:6);
tsfit2dft(indices) = tsdft(indices);

Продемонстрируйте, что сохранение только 6 из 72 коэффициентов Фурье (3 частоты) сохраняет большую часть энергии сигнала. Во-первых, продемонстрировать, что сохранение всех коэффициентов Фурье дает эквивалентность энергии между исходным сигналом и преобразованием Фурье.

norm(1/sqrt(72)*tsdft,2)/norm(ts-mean(ts),2)
ans = 1.0000

Отношение равно 1. Теперь изучите отношение энергии, где сохраняются только 3 частоты.

norm(1/sqrt(72)*tsfit2dft,2)/norm(ts-mean(ts),2)
ans = 0.8991

Почти 90% энергии сохраняется. Эквивалентно, 90% дисперсии временного ряда учитывается 3 частотными компонентами.

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

tsfit2 = mu+ifft(tsfit2dft,'symmetric');

plot(years,ts,'o-','markerfacecolor','auto')
xlabel('Year')
ylabel('Number of Accidental Deaths')
hold on
plot(years,tsfit,'linewidth',2)
plot(years,tsfit2,'linewidth',2)
legend('Data','1 Frequency','3 Frequencies')
hold off

Figure contains an axes. The axes contains 3 objects of type line. These objects represent Data, 1 Frequency, 3 Frequencies.

Использование 3 частот улучшило соответствие исходному сигналу. Это можно увидеть, изучив автокорреляцию остатков из 3-частотной модели.

resid = ts-tsfit2;
[xc,lags] = xcorr(resid,50,'coeff');

stem(lags(51:end),xc(51:end),'filled')
hold on
lconf = -1.96*ones(51,1)/sqrt(72);
uconf = 1.96*ones(51,1)/sqrt(72);
plot(lags(51:end),lconf,'r')
plot(lags(51:end),uconf,'r')
xlabel('Lag')
ylabel('Correlation Coefficient')
title('Autocorrelation of Residuals')
hold off

Figure contains an axes. The axes with title Autocorrelation of Residuals contains 3 objects of type stem, line.

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

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

X = ones(72,7);
X(:,2) = cos(2*pi/72*(0:71))';
X(:,3) = sin(2*pi/72*(0:71))';
X(:,4) = cos(2*pi*6/72*(0:71))';
X(:,5) = sin(2*pi*6/72*(0:71))';
X(:,6) = cos(2*pi*12/72*(0:71))';
X(:,7) = sin(2*pi*12/72*(0:71))';
beta = X\ts;
tsfit_lm = X*beta;
max(abs(tsfit_lm-tsfit2))
ans = 1.2733e-11

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

Для получения более подробной информации о спектральном анализе во временных рядах и эквивалентности регрессии во временной области см. (Shumway and Stoffer, 2006).

Хотя спектральный анализ может ответить, какие периодические компоненты вносят значительный вклад в изменчивость данных, он не объясняет, почему эти компоненты присутствуют. При тщательном изучении этих данных можно увидеть, что минимальные значения в 12-месячном цикле, как правило, приходятся на февраль, а максимальные - на июль. Правдоподобным объяснением этих данных является то, что люди, естественно, более активны летом, чем зимой. К сожалению, в результате этой повышенной активности повышается вероятность возникновения несчастных случаев со смертельным исходом.

Ссылки

Броквелл, Питер Дж. и Ричард А. Дэвис. Временные ряды: теория и методы. Нью-Йорк: Спрингер, 2006.

Шумвей, Роберт Х. и Дэвид С. Стоффер. Анализ временных рядов и его применения с помощью примеров R. Нью-Йорк: Спрингер, 2006.

См. также

| |