Обнаружение периодичности в сигнале с отсутствующими выборками

Рассмотрим вес человека как зарегистрированный (в фунтах) в течение високосного 2012 года. Человек не записывал свой вес каждый день. Вы хотели бы изучить периодичность сигнала, хотя некоторые точки данных отсутствуют.

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

load('weight2012.dat')

wgt = weight2012(:,2)/2.20462;

fprintf('Missing %d samples of %d\n',sum(isnan(wgt)),length(wgt))
Missing 27 samples of 366

Определите, является ли сигнал периодическим, проанализировав его в частотный диапазон. Алгоритм Lomb-Scargle разработан для обработки данных с отсутствующими выборками или данными, которые были получены нерегулярно.

Найдите длительности цикла, измеряя время в неделях.

[p,f] = plomb(wgt,7,'normalized');

plot(f,p)
xlabel('Frequency (week^{-1})')

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

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

wgd = reshape(wgt(1:7*52),[7 52])';

plot(wgd)
xlabel('Week')
ylabel('Weight (kg)')

dweek = datetime([repmat([2012 1],7,1) (1:7)'],'Format','eeee');

legend(string(dweek),'Location','northwest')

Figure contains an axes. The axes contains 7 objects of type line. These objects represent Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday.

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

wgs = sgolayfilt(wgd,3,7);

plot(wgs)
xlabel('Week')
ylabel('Smoothed weight (kg)')

legend(string(dweek),'Location','southeast')

Figure contains an axes. The axes contains 7 objects of type line. These objects represent Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday.

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

for jk = 1:7
    wgm = find(~isnan(wgd(:,jk)));
    fprintf('%s mean: %5.1f kg\n',dweek(jk),mean(wgd(wgm,jk)))
end
Sunday mean:  76.3 kg
Monday mean:  75.7 kg
Tuesday mean:  75.2 kg
Wednesday mean:  74.9 kg
Thursday mean:  75.1 kg
Friday mean:  75.3 kg
Saturday mean:  75.8 kg

См. также

| |

Похожие темы