Рассмотрим вес человека как зарегистрированный (в фунтах) в течение високосного 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})')
Заметьте, как вес человека колеблется еженедельно. Есть ли заметный шаблон от недели до недели? Исключить последние два дня года, чтобы получить 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')
Сглаживайте колебания с помощью фильтра, который подходит для полиномов низкого порядка к подмножествам данных. В частности, установите его в соответствии с кубическими полиномами к наборам семи дней.
wgs = sgolayfilt(wgd,3,7); plot(wgs) xlabel('Week') ylabel('Smoothed weight (kg)') legend(string(dweek),'Location','southeast')
Этот человек, как правило, ест больше, и, таким образом, весит больше, в выходные. Проверьте путем вычисления ежедневных средств. Исключить отсутствующие значения из расчета.
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
datestr
| plomb
| sgolayfilt