Предскажите наблюдения за моделью в пространстве состояний, содержащей компонент регрессии

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

Предположим, что линейное соотношение между изменением в уровне безработицы и темпом роста номинального валового национального продукта (nGNP) представляет интерес. Предположим далее, что первым различием уровня безработицы является серия ARMA(1,1). Символически, и в форме пространства состояний, модель

[x1,tx2,t]=[ϕθ00][x1,t-1x2,t-1]+[11]u1,tyt-βZt=x1,t+σεt,

где:

  • x1,t изменение в уровне безработицы во время t.

  • x2,t фиктивное состояние для MA (1) эффект.

  • y1,t наблюдаемое изменение в уровне безработицы, выкачиваемом темпом роста nGNP (Zt).

  • u1,t серия Gaussian воздействий состояния, имеющих среднее значение 0 и стандартное отклонение 1.

  • εt серия Gaussian инноваций наблюдения, имеющих среднее значение 0 и стандартное отклонение σ.

Загрузите набор данных Нельсона-Плоссера, который содержит уровень безработицы и nGNP ряд, среди прочего.

load Data_NelsonPlosser

Предварительно обработайте данные путем взятия натурального логарифма nGNP ряда и первого различия каждого ряда. Кроме того, удалите стартовые значения NaN из каждого ряда.

isNaN = any(ismissing(DataTable),2);       % Flag periods containing NaNs
gnpn = DataTable.GNPN(~isNaN);
u = DataTable.UR(~isNaN);
T = size(gnpn,1);                          % Sample size
Z = [ones(T-1,1) diff(log(gnpn))];
y = diff(u);

Хотя этот пример удаляет отсутствующие значения, программное обеспечение может разместить ряд, содержащий отсутствующие значения в среде Фильтра Калмана.

Чтобы определить, как хорошо модель предсказывает наблюдения, удалите последние 10 наблюдений для сравнения.

numPeriods = 10;                   % Forecast horizon
isY = y(1:end-numPeriods);         % In-sample observations
oosY = y(end-numPeriods+1:end);    % Out-of-sample observations
ISZ = Z(1:end-numPeriods,:);       % In-sample predictors
OOSZ = Z(end-numPeriods+1:end,:);  % Out-of-sample predictors

Задайте содействующие матрицы.

A = [NaN NaN; 0 0];
B = [1; 1];
C = [1 0];
D = NaN;

Задайте модель в пространстве состояний с помощью ssm.

Mdl = ssm(A,B,C,D);

Оцените параметры модели. Задайте компонент регрессии и его начальное значение для оптимизации с помощью аргументов пары "имя-значение" 'Predictors' и 'Beta0', соответственно. Ограничьте оценку σ ко всем положительным, вещественным числам. Для числовой устойчивости задайте Гессиан, когда программное обеспечение вычислит ковариационную матрицу параметра, с помощью аргумента пары "имя-значение" 'CovMethod'.

params0 = [0.3 0.2 0.1]; % Chosen arbitrarily
[EstMdl,estParams] = estimate(Mdl,isY,params0,'Predictors',ISZ,...
    'Beta0',[0.1 0.2],'lb',[-Inf,-Inf,0,-Inf,-Inf],'CovMethod','hessian');
Method: Maximum likelihood (fmincon)
Sample size: 51
Logarithmic  likelihood:     -87.2409
Akaike   info criterion:      184.482
Bayesian info criterion:      194.141
           |      Coeff       Std Err    t Stat     Prob  
----------------------------------------------------------
 c(1)      |  -0.31780       0.19429    -1.63572  0.10190 
 c(2)      |   1.21242       0.48882     2.48031  0.01313 
 c(3)      |   0.45583       0.63930     0.71301  0.47584 
 y <- z(1) |   1.32407       0.26313     5.03201   0      
 y <- z(2) | -24.48733       1.90115   -12.88024   0      
           |                                              
           |    Final State   Std Dev     t Stat    Prob  
 x(1)      |  -0.38117       0.42842    -0.88971  0.37363 
 x(2)      |   0.23402       0.66222     0.35339  0.72380 

EstMdl является моделью ssm, и можно получить доступ к ее свойствам с помощью записи через точку.

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

[fY,yMSE] = forecast(EstMdl,numPeriods,isY,'Predictors0',ISZ,...
    'PredictorsF',OOSZ,'Beta',estParams(end-1:end));

fY является вектором 10 на 1, содержащим предсказанные наблюдения, и yMSE является вектором 10 на 1, содержащим отклонения предсказанных наблюдений.

Получите 95% интервалов прогноза вальдового типа. Постройте предсказанные наблюдения с их истинными значениями и интервалами прогноза.

ForecastIntervals(:,1) = fY - 1.96*sqrt(yMSE);
ForecastIntervals(:,2) = fY + 1.96*sqrt(yMSE);

figure
h = plot(dates(end-numPeriods-9:end-numPeriods),isY(end-9:end),'-k',...
    dates(end-numPeriods+1:end),oosY,'-k',...
    dates(end-numPeriods+1:end),fY,'--r',...
    dates(end-numPeriods+1:end),ForecastIntervals,':b',...
    dates(end-numPeriods:end-numPeriods+1),...
    [isY(end)*ones(3,1),[oosY(1);ForecastIntervals(1,:)']],':k',...
    'LineWidth',2);
xlabel('Period')
ylabel('Change in the unemployment rate')
legend(h([1,3,4]),{'Observations','Forecasted responses',...
    '95% forecast intervals'})
title('Observed and Forecasted Changes in the Unemployment Rate')

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

Смотрите также

| | |

Связанные примеры

Больше о