Прогнозирование многомерных временных рядов

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

Описание данных

Данные представляют собой двухмерные временные ряды, состоящий из 1-хищных 1-добычных популяций (в тысячах), собираемых 10 раз в год в течение 20 лет. Для получения дополнительной информации о данных смотрите Три Экологические Системы Населения: MATLAB и Файл MEX на C Modeling of Time-Series.

Загрузите данные временных рядов.

load PredPreyCrowdingData
z = iddata(y,[],0.1,'TimeUnit','years','Tstart',0);

z является iddata объект, содержащий два выходных сигнала, y1 и y2, которые относятся к хищнику и популяциям жертв, соответственно. The OutputData свойство z содержит население данные как матрицу 201 на 2, такую что z.OutputData(:,1) - популяция хищников и z.OutputData(:,2) - популяция жертв.

Постройте график данных.

plot(z)
title('Predator-Prey Population Data')
ylabel('Population (thousands)')

Figure contains 2 axes. Axes 1 with title y1 contains an object of type line. This object represents z. Axes 2 with title y2 contains an object of type line. This object represents z.

Данные показывают снижение популяции хищников из-за скопления людей.

Используйте первую половину в качестве данных оценки для идентификации моделей временных рядов.

ze = z(1:120);

Используйте оставшиеся данные для поиска порядков модели и проверки результатов прогнозирования.

zv = z(121:end);

Оценка линейной модели

Моделируйте временные ряды как линейный, авторегрессивный процесс. Линейные модели могут быть созданы в полиномиальной форме или форме пространства состояний с помощью таких команд, как ar (только для скалярных временных рядов), arx, armax, n4sid и ssest. Поскольку линейные модели не захватывают смещения данных (ненулевое условное среднее), сначала уменьшите значения данных.

[zed, Tze] = detrend(ze, 0);
[zvd, Tzv] = detrend(zv, 0);

Идентификация требует спецификации порядков модели. Для полиномиальных моделей можно найти подходящие порядки, используя arxstruc команда. Начиная с arxstruc работает только на модели с одним выходом, выполняйте поиск порядка модели отдельно для каждого вывода.

na_list = (1:10)';
V1 = arxstruc(zed(:,1,:),zvd(:,1,:),na_list);
na1 = selstruc(V1,0);
V2 = arxstruc(zed(:,2,:),zvd(:,2,:),na_list);
na2 = selstruc(V2,0);

The arxstruc команда предлагает авторегрессивные модели порядков 7 и 8, соответственно.

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

na = [na1 na1-1; na2-1 na2];
nc = [na1; na2];
sysARMA = armax(zed,[na nc])
sysARMA =
Discrete-time ARMA model:                                                 
  Model for output "y1": A(z)y_1(t) = - A_i(z)y_i(t) + C(z)e_1(t)         
                                                                          
    A(z) = 1 - 0.885 z^-1 - 0.1493 z^-2 + 0.8089 z^-3 - 0.2661 z^-4       
                                 - 0.9487 z^-5 + 0.8719 z^-6 - 0.2896 z^-7
                                                                          
                                                                          
    A_2(z) = 0.3433 z^-1 - 0.2802 z^-2 - 0.04949 z^-3 + 0.1018 z^-4       
                                              - 0.02683 z^-5 - 0.2416 z^-6
                                                                          
                                                                          
    C(z) = 1 - 0.4534 z^-1 - 0.4127 z^-2 + 0.7874 z^-3 + 0.298 z^-4       
                                 - 0.8684 z^-5 + 0.6106 z^-6 + 0.3616 z^-7
                                                                          
  Model for output "y2": A(z)y_2(t) = - A_i(z)y_i(t) + C(z)e_2(t)                
                                                                                 
    A(z) = 1 - 0.5826 z^-1 - 0.4688 z^-2 - 0.5949 z^-3 - 0.0547 z^-4             
                  + 0.5062 z^-5 + 0.4024 z^-6 - 0.01544 z^-7 - 0.1766 z^-8       
                                                                                 
                                                                                 
    A_1(z) = 0.2386 z^-1 + 0.1564 z^-2 - 0.2249 z^-3 - 0.2638 z^-4 - 0.1019 z^-5 
                                              - 0.07821 z^-6 + 0.2982 z^-7       
                                                                                 
                                                                                 
    C(z) = 1 - 0.1717 z^-1 - 0.09877 z^-2 - 0.5289 z^-3 - 0.24 z^-4              
                 + 0.06555 z^-5 + 0.2217 z^-6 - 0.05765 z^-7 - 0.1824 z^-8       
                                                                                 
Sample time: 0.1 years
  
Parameterization:
   Polynomial orders:   na=[7 6;7 8]   nc=[7;8]
   Number of free coefficients: 43
   Use "polydata", "getpvec", "getcov" for parameters and their uncertainties.

Status:                                                  
Estimated using ARMAX on time domain data "zed".         
Fit to estimation data: [89.85;90.97]% (prediction focus)
FPE: 3.814e-05, MSE: 0.007533                            

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

predOpt = predictOptions('OutputOffset',Tze.OutputOffset');
yhat1 = predict(sysARMA,ze,10, predOpt);

The predict команда предсказывает ответ на протяжении временного интервала измеренных данных и является инструментом для проверки качества предполагаемой модели. Ответ в момент времени t вычисляется с использованием измеренных значений в моменты времени t = 0,..., t-10.

Постройте график предсказанной характеристики и измеренных данных.

plot(ze,yhat1)
title('10-step predicted response compared to measured data')

Figure contains 2 axes. Axes 1 with title y1 contains 2 objects of type line. These objects represent ze, ze\_Predicted. Axes 2 with title y2 contains 2 objects of type line. These objects represent ze, ze\_Predicted.

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

compareOpt = compareOptions('OutputOffset',Tze.OutputOffset');
compare(ze,sysARMA,10,compareOpt)

Figure contains 2 axes. Axes 1 contains 2 objects of type line. These objects represent ze (y1), sysARMA: 75.49%. Axes 2 contains 2 objects of type line. These objects represent ze (y2), sysARMA: 76.21%.

График сгенерирован с помощью compare также показана нормированная среднеквадратичная (NRMSE) мера качества подгонки в процентной форме.

После проверки данных спрогнозируйте выход модели sysARMA 100 шагов (10 лет) после данных оценки и вычисление выходных стандартных отклонений.

forecastOpt = forecastOptions('OutputOffset',Tze.OutputOffset');
[yf1,x01,sysf1,ysd1] = forecast(sysARMA, ze, 100, forecastOpt);

yf1 - прогнозируемый ответ, возвращенный как iddata объект. yf1.OutputData содержит прогнозируемые значения.

sysf1 - система, подобная sysARMA но находится в форме пространства состояний. Симуляция sysf1 использование sim команда, с начальными условиями, x01, воспроизводит прогнозируемый ответ, yf1.

ysd1 - матрица стандартных отклонений. Он измеряет неопределенность, прогнозируемую из-за эффекта нарушений порядка в данных (измеренных sysARMA.NoiseVariance), неопределенность параметра (как сообщается getcov(sysARMA)) и неопределенности, связанные с процессом отображения прошлых данных на начальные условия, необходимые для прогнозирования (см. data2state).

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

t = yf1.SamplingInstants;
te = ze.SamplingInstants;
t0 = z.SamplingInstants;
subplot(1,2,1);
plot(t0,z.y(:,1),...
   te,yhat1.y(:,1),...
   t,yf1.y(:,1),'m',...
   t,yf1.y(:,1)+ysd1(:,1),'k--', ...
   t,yf1.y(:,1)-ysd1(:,1), 'k--')
xlabel('Time (year)');
ylabel('Predator population, in thousands');
subplot(1,2,2);
plot(t0,z.y(:,2),...
   te,yhat1.y(:,2),...
   t,yf1.y(:,2),'m',...
   t,yf1.y(:,2)+ysd1(:,2),'k--', ...
   t,yf1.y(:,2)-ysd1(:,2),'k--')
% Make the figure larger.
fig = gcf;
p = fig.Position;
fig.Position = [p(1),p(2)-p(4)*0.2,p(3)*1.4,p(4)*1.2];
xlabel('Time (year)');
ylabel('Prey population, in thousands');
legend({'Measured','Predicted','Forecasted','Forecast Uncertainty (1 sd)'},...
   'Location','best')

Figure contains 2 axes. Axes 1 contains 5 objects of type line. Axes 2 contains 5 objects of type line. These objects represent Measured, Predicted, Forecasted, Forecast Uncertainty (1 sd).

Графики показывают, что прогнозирование с использованием линейной модели ARMA (с дополнительной обработкой смещений) сработало несколько, и результаты показали высокую неопределенность по сравнению с фактическими населениями за 12-20 лет. Это указывает, что динамика изменения населения может быть нелинейной.

Оцените нелинейную модель черного ящика

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

Создайте нелинейную модель ARX с 2 выходами и без входов.

sysNLARX = idnlarx([1 1;1 1],[],'Ts',0.1,'TimeUnit','years');

sysNLARX является нелинейной моделью ARX первого порядка, которая не использует нелинейную функцию; он предсказывает ответ модели с помощью взвешенной суммы ее регрессоров первого порядка.

getreg(sysNLARX)
ans = 2x1 cell
    {'y1(t-1)'}
    {'y2(t-1)'}

Чтобы ввести функцию нелинейности, добавьте полиномиальные регрессоры к модели.

Создайте регрессоры до мощности 2 и включите перекрестные условия (продукты стандартных регрессоров, перечисленных выше). Добавьте эти регрессоры к модели как пользовательские регрессоры.

R = polyreg(sysNLARX,'MaxPower',2,'CrossTerm','on');
sysNLARX.CustomRegressors = R;
getreg(sysNLARX)
ans = 5x1 cell
    {'y1(t-1)'         }
    {'y2(t-1)'         }
    {'y1(t-1).^2'      }
    {'y1(t-1).*y2(t-1)'}
    {'y2(t-1).^2'      }

Оцените коэффициенты (веса регрессора и смещение) модели с помощью данных оценки ze.

sysNLARX = nlarx(ze,sysNLARX)
sysNLARX = 
Nonlinear multivariate time series model with 2 outputs
  Outputs: y1, y2

Regressors:
  1. Linear regressors in variables y1, y2
  2. Custom regressor: y1(t-1).^2
  3. Custom regressor: y1(t-1).*y2(t-1)
  4. Custom regressor: y2(t-1).^2
  List of all regressors

 All model outputs are linear in their regressors.
Sample time: 0.1 years

Status:                                                  
Estimated using NLARX on time domain data "ze".          
Fit to estimation data: [88.34;88.91]% (prediction focus)
FPE: 3.265e-05, MSE: 0.01048

Вычислите предсказанный выход с 10 шагом вперед, чтобы подтвердить модель.

yhat2 = predict(sysNLARX,ze,10);

Прогнозируйте выход модели на 100 шагов после данных оценки.

yf2 = forecast(sysNLARX,ze,100);

Стандартные отклонения прогнозируемой характеристики не вычисляются для нелинейных моделей ARX. Эти данные недоступны, потому что ковариационная информация параметра не вычисляется во время оценки этих моделей.

Постройте график измеренных, предсказанных и прогнозируемых выходов.

t = yf2.SamplingInstants;
subplot(1,2,1);
plot(t0,z.y(:,1),...
   te,yhat2.y(:,1),...
   t,yf2.y(:,1),'m')
xlabel('Time (year)');
ylabel('Predator population (thousands)');
subplot(1,2,2);
plot(t0,z.y(:,2),...
   te,yhat2.y(:,2),...
   t,yf2.y(:,2),'m')
legend('Measured','Predicted','Forecasted')
xlabel('Time (year)');
ylabel('Prey population (thousands)');

Figure contains 2 axes. Axes 1 contains 3 objects of type line. Axes 2 contains 3 objects of type line. These objects represent Measured, Predicted, Forecasted.

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

Обратите внимание, что чтобы уменьшить количество регрессоров, можно выбрать оптимальное подмножество (преобразованных) переменных с помощью анализа основных компонентов (см pca) или выбор признаков (см sequentialfs) в Statistics and Machine Learning Toolbox™.

Если вы знаете ранее динамику системы, можно подогнать данные оценки с помощью нелинейной модели серого-прямоугольника.

Оцените нелинейный серый ящик

Знания о природе динамики могут помочь улучшить качество модели и, следовательно, точность прогноза. Для динамики хищник-добыча, изменения у хищника (y1) и добыча (y2) население может быть представлена как:

y˙1(t)=p1*y1(t)+p2*y2(t)*y1(t)

y˙2(t)=p3*y2(t)-p4*y1(t)*y2(t)-p5*y2(t)2

Для получения дополнительной информации о уравнениях смотрите Три Экологические Системы Населения: MATLAB и Файл MEX на C Modeling of Time-Series.

Создайте нелинейную модель серого ящика на основе этих уравнений.

Укажите файл, описывающий структуру модели для системы хищник-добыча. Файл задает производные по состоянию и выходы модели как функцию времени, состояний, входов и параметров модели. Два выхода (хищник и популяции жертв) выбираются как состояния, чтобы вывести нелинейное описание динамики в пространстве состояний.

FileName = 'predprey2_m';

Задайте порядки модели (количество выходов, входов и состояний)

Order = [2 0 2];

Задайте начальные значения для параметров p1, p2, p3, p4, и p5, и указать, что все параметры должны быть оценены. Обратите внимание, что требование задать начальные догадки для параметров не существовало при оценке моделей черного ящика sysARMA и sysNLARX.

Parameters = struct('Name',{'Survival factor, predators' 'Death factor, predators' ...
   'Survival factor, preys' 'Death factor, preys' ...
   'Crowding factor, preys'}, ...
   'Unit',{'1/year' '1/year' '1/year' '1/year' '1/year'}, ...
   'Value',{-1.1 0.9 1.1 0.9 0.2}, ...
   'Minimum',{-Inf -Inf -Inf -Inf -Inf}, ...
   'Maximum',{Inf Inf Inf Inf Inf}, ...
   'Fixed',{false false false false false});

Точно так же задайте начальные состояния модели и укажите, что оба начальных состояния должны быть оценены.

InitialStates = struct('Name',{'Predator population' 'Prey population'}, ...
   'Unit',{'Size (thousands)' 'Size (thousands)'}, ...
   'Value',{1.8 1.8}, ...
   'Minimum', {0 0}, ...
   'Maximum',{Inf Inf}, ...
   'Fixed',{false false});

Задайте модель как систему непрерывного времени.

Ts = 0;

Создайте нелинейную модель серого ящика с заданной структурой, параметрами и состояниями.

sysGrey = idnlgrey(FileName,Order,Parameters,InitialStates,Ts,'TimeUnit','years');

Оцените параметры модели.

sysGrey = nlgreyest(ze,sysGrey);
present(sysGrey)
                                                                                                      
sysGrey =                                                                                             
Continuous-time nonlinear grey-box model defined by 'predprey2_m' (MATLAB file):                      
                                                                                                      
   dx/dt = F(t, x(t), p1, ..., p5)                                                                    
    y(t) = H(t, x(t), p1, ..., p5) + e(t)                                                             
                                                                                                      
 with 0 input(s), 2 state(s), 2 output(s), and 5 free parameter(s) (out of 5).                        
                                                                                                      
 States:                                        Initial value                                         
    x(1)  Predator population(t) [Size (thou..]   xinit@exp1   2.01325   (estimated) in [0, Inf]      
    x(2)  Prey population(t) [Size (thou..]       xinit@exp1   1.99687   (estimated) in [0, Inf]      
 Outputs:                                                                                             
    y(1)  y1(t)                                                                                       
    y(2)  y2(t)                                                                                       
 Parameters:                                    Value  Standard Deviation                             
    p1   Survival factor, predators [1/year]     -0.995895      0.0125269   (estimated) in [-Inf, Inf]
    p2   Death factor, predators [1/year]          1.00441      0.0129368   (estimated) in [-Inf, Inf]
    p3   Survival factor, preys [1/year]           1.01234      0.0135413   (estimated) in [-Inf, Inf]
    p4   Death factor, preys [1/year]              1.01909      0.0121026   (estimated) in [-Inf, Inf]
    p5   Crowding factor, preys [1/year]          0.103244      0.0039285   (estimated) in [-Inf, Inf]
                                                                                                      
Status:                                                                                               
Termination condition: Change in cost was less than the specified tolerance..                         
Number of iterations: 6, Number of function evaluations: 7                                            
                                                                                                      
Estimated using Solver: ode45; Search: lsqnonlin on time domain data "ze".                            
Fit to estimation data: [91.21;92.07]%                                                                
FPE: 8.613e-06, MSE: 0.005713                                                                         
More information in model's "Report" property.                                                        

Вычислите предсказанный выход с 10 шагом вперед, чтобы подтвердить модель.

yhat3 = predict(sysGrey,ze,10);

Прогнозируйте выход модели на 100 шагов сверх данных оценки и вычисляйте выходные стандартные отклонения.

[yf3,x03,sysf3,ysd3] = forecast(sysGrey,ze,100);

Постройте график измеренных, предсказанных и прогнозируемых выходов.

t = yf3.SamplingInstants;
subplot(1,2,1);
plot(t0,z.y(:,1),...
   te,yhat3.y(:,1),...
   t,yf3.y(:,1),'m',...
   t,yf3.y(:,1)+ysd3(:,1),'k--', ...
   t,yf3.y(:,1)-ysd3(:,1),'k--')
xlabel('Time (year)');
ylabel('Predator population (thousands)');
subplot(1,2,2);
plot(t0,z.y(:,2),...
   te,yhat3.y(:,2),...
   t,yf3.y(:,2),'m',...
   t,yf3.y(:,2)+ysd3(:,2),'k--', ...
   t,yf3.y(:,2)-ysd3(:,2),'k--')

legend('Measured','Predicted','Forecasted','Forecast uncertainty (1 sd)')
xlabel('Time (years)');
ylabel('Prey population (thousands)');

Figure contains 2 axes. Axes 1 contains 5 objects of type line. Axes 2 contains 5 objects of type line. These objects represent Measured, Predicted, Forecasted, Forecast uncertainty (1 sd).

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

Сравнение прогнозной Эффективности

Сравните прогнозируемый ответ, полученный из идентифицированных моделей, sysARMA, sysNLARX, и sysGrey. Первые два являются моделями в дискретном времени и sysGrey является моделью в непрерывном времени.

clf
plot(z,yf1,yf2,yf3)
legend({'Measured','Linear ARMA','Nonlinear AR','Nonlinear Grey-Box'})
title('Forecasted Responses')

Figure contains 2 axes. Axes 1 with title y1 contains 4 objects of type line. These objects represent Measured, Linear ARMA, Nonlinear AR, Nonlinear Grey-Box. Axes 2 with title y2 contains 4 objects of type line. These objects represent Measured, Linear ARMA, Nonlinear AR, Nonlinear Grey-Box.

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

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

y1(t)=s1*y1(t-1)+s2*y1(t-1)*y2(t-1)

y2(t)=s3*y2(t-1)-s4*y1(t-1)*y2(t-1)-s5*y2(t-1)2

Где, s1,...,s5 являются некоторыми параметрами, связанными с исходными параметрами p1,...,p5 и к шагу расчета, используемой для дифференцирования. Эти уравнения предполагают, что только 2 регрессоры необходимы для первого выхода (y1 (t-1) и * y1 (t-1) * y2 (t-1)) и 3 для второго выхода при построении нелинейной модели ARX. Даже при отсутствии таких предшествующих знаний структуры модели линейного регрессора, использующие полиномиальные регрессоры, остаются популярным выбором на практике.

Прогнозируйте значения с помощью нелинейной модели серого ящика в течение 200 лет.

[yf4,~,~,ysd4] = forecast(sysGrey, ze, 2000);

Постройте график последней части данных (показав 1 неопределенность сд)

t = yf4.SamplingInstants;
N = 700:2000;
subplot(1,2,1);
plot(t(N), yf4.y(N,1), 'm',...
   t(N), yf4.y(N,1)+ysd4(N,1), 'k--', ...
   t(N), yf4.y(N,1)-ysd4(N,1), 'k--')
xlabel('Time (year)');
ylabel('Predator population (thousands)');
ax = gca;
ax.YLim = [0.8 1];
ax.XLim = [82 212];
subplot(1,2,2);
plot(t(N),yf4.y(N,2),'m',...
   t(N),yf4.y(N,2)+ysd4(N,2),'k--', ...
   t(N),yf4.y(N,2)-ysd4(N,2),'k--')
legend('Forecasted population','Forecast uncertainty (1 sd)')
xlabel('Time (years)');
ylabel('Prey population (thousands)');
ax = gca;
ax.YLim = [0.9 1.1];
ax.XLim = [82 212];

Figure contains 2 axes. Axes 1 contains 3 objects of type line. Axes 2 contains 3 objects of type line. These objects represent Forecasted population, Forecast uncertainty (1 sd).

График показа, что хищное население, по прогнозам, достигнет установившегося состояния приблизительно 890 и популяция жертв, по прогнозам, достигнет 990.

Похожие темы