www.gusucode.com > signal 案例源码程序 matlab代码 > signal/SpectralAnalysisOfCategoricalValuedTimeSeriesDataExample.m

    %% Find Periodicity in a Categorical Time Series
% This example shows how to perform spectral analysis of categorical-valued
% time-series data. The spectral analysis of categorical-valued time series
% is useful when you are interested in cyclic behavior of data whose values
% are not inherently numerical. This example reproduces in part the
% analysis reported in Stoffer et al. (1988). The data are taken from
% Stoffer, Tyler, and Wendt (2000).

% Copyright 2015 The MathWorks, Inc.


%%
% The data are from a study of sleep states in newborn children. A
% pediatric neurologist scored an infant's electroencephalographic (EEG)
% recording every minute for approximately two hours. The neurologist
% categorized the infant's sleep state into one of the following:
%
% * |qt| - Quiet sleep, trace alternant
% * |qh| - Quiet sleep, high voltage
% * |tr| - Transitional sleep
% * |al| - Active sleep, low voltage
% * |ah| - Active sleep, high voltage
% * |aw| - Awake

%%
% Enter the data. The infant was never awake during the EEG recording.

data = {'ah','ah','ah','ah','ah','ah','ah','ah','tr','ah','tr','ah', ...
   'ah','qh','qt','qt','qt','qt','qt','tr','qt','qt','qt','qt','qt', ...
   'qt','qt','qt','qt','qt','tr','al','al','al','al','al','tr','ah', ...
   'al','al','al','al','al','ah','ah','ah','ah','ah','ah','ah','tr', ...
   'tr','ah','ah','ah','ah','tr','tr','tr','qh','qh','qt','qt','qt', ...
   'qt','qt','qt','qt','qt','qt','qt','qt','qt','qt','qt','qt','qt', ...
   'qt','qt','tr','al','al','al','al','al','al','al','al','al','al', ...
   'al','al','al','al','al','al','al','ah','ah','ah','ah','ah','ah', ...
   'ah','ah','ah','tr'};

lend = length(data);
t = 1:lend;

%%
% The easiest way to analyze categorical-valued time series data for cyclic
% patterns involves assigning numerical values to the categories. There are
% at least two meaningful ways of assigning values to the infant's sleep
% states. First, note that you can order the six states from 1 to 6. This
% assignment makes sense along the scale of least active to most active.

%%
% Replace the six sleep states with their numerical equivalents and plot
% the data.

states = ['qt';'qh';'tr';'al';'ah';'aw'];
levelssix = [1 2 3 4 5 6];

for nn = 1:6
    datasix(strcmp(data,states(nn,:))) = levelssix(nn);
end

plot(t,datasix)
axis([0 lend 0 6])
ax = gca;
ax.YTick = [1 2 4 5];
grid
xlabel('Minutes')
ylabel('Sleep State')

%%
% The data exhibit cyclic behavior when you focus on the transitions
% between the quietest states (1 and 2) and the most active ones (4 and 5).
% To determine the cycle of that behavior, use spectral analysis. Recall
% that the sleep states are assigned in one-minute intervals. Sampling the
% data in one-minute intervals is equivalent to sampling the data 60 times
% per hour.

Fs = 60;
[Pxx,F] = periodogram(detrend(datasix,0),[],240,Fs);

plot(F,Pxx)
grid
xlabel('Cycles/Hour')
title('Periodogram of Sleep States')

%%
% The spectral analysis shows a clear peak indicating a dominant
% oscillation, or cycle in the data. Determine the frequency of the peak.

[maxval,maxidx] = max(Pxx);
Fsix = F(maxidx)

%%
% The infant's sleep states exhibit cyclic behavior with a frequency of
% approximately 1.25 cycles/hour.

%%
% Instead of assigning the sleep states the values 1 to 6, repeat the
% analysis focusing only on the distinction between quiet and active sleep.
% Assign the quiet states, |qt| and |qh|, the value 1. Assign the
% transitional state, |tr|, the value 2. Finally, assign the two active
% sleep states, |al| and |ah|, the value 3. For completeness, assign the
% awake state, |aw|, the value 4, even though the state does not occur in
% the data.

states = ['qt';'qh';'tr';'al';'ah';'aw'];
levelsfou = [1 1 2 3 3 4];

for nn = 1:6
    datafou(strcmp(data,states(nn,:))) = levelsfou(nn);
end

plot(t,datafou)
axis([0 lend 0 4])
ax = gca;
ax.YTick = [1 2 3];
grid
xlabel('Minutes')
ylabel('Sleep State')

%%
% With this rule of assignment between the sleep states and the values 1 to
% 3, the cyclic behavior of the data is clearer. Repeat the spectral
% analysis with the new assignment.

[Pxx,F] = periodogram(detrend(datafou,0),[],240,Fs);

plot(F,Pxx)
grid
xlabel('Cycles/Hour')
title('Periodogram of Sleep States')

[maxval,maxidx] = max(Pxx);
F(maxidx)

%%
% The new assignment has not changed the conclusion. The data show a
% dominant oscillation at 1.25 cyles/hour. Because the mapping between the
% sleep states and the integers representing those states was consistent,
% the analysis and conclusions were not affected. Based on a spectral
% analysis of this categorical data, you conclude that the infant's sleep
% state cycles between quiet and active sleep approximately once every
% hour.

%%
% *References*
%
% Stoffer, David S., Mark S. Scher, Gale A. Richardson, Nancy L. Day, and
% Patricia A. Coble. "A Walsh-Fourier Analysis of the Effects of Moderate
% Maternal Alcohol Consumption on Neonatal Sleep-State Cycling." _Journal
% of the American Statistical Association._ Vol. 83, 1988, pp. 954-963.
%
% Stoffer, David S., D. E. Tyler, and D. A. Wendt. "The Spectral Envelope
% and Its Applications." _Statistical Science._ Vol. 15, 2000, pp. 224-253.