exponenta event banner

Работа с переходами состояний

В этом примере показано, как работать с данными перехода из эмпирического массива подсчетов состояний и создавать дискретную цепочку Маркова (dtmc) модель, характеризующая переходы состояний. Для каждого квартала в 1857-2019 годах пример классифицирует состояние экономики США как переживающее рецессию или экспансию, используя исторические периоды рецессии, определенные Национальным бюро экономических исследований (NBER). Затем пример формирует эмпирическую матрицу перехода путем подсчета переходов из четверти в четверть экономического состояния.

Загрузка и обработка данных

Загрузите исторические даты начала и окончания рецессии, определенные NBER.

load Data_Recessions

Recessions переменная в рабочей области представляет собой матрицу номеров серийных дат 33 на 2. Ряды Recessions соответствуют последовательным периодам рецессии, а столбцы 1 и 2 содержат даты начала и окончания соответственно. Для получения дополнительной информации введите Description в командной строке.

Потому что MATLAB ®datetime массивы позволяют эффективно работать с данными даты, конвертировать Recessions в datetime массив. Укажите формат даты yyyy-MM-dd. Визуальное сравнение типов данных первых нескольких периодов и последних нескольких периодов.

NBERRec = datetime(Recessions,'ConvertFrom',"datenum",...
    "Format","yyyy-MM-dd");
disptbl = table(Recessions,NBERRec);
head(disptbl,3)
ans=3×2 table
           Recessions                  NBERRec        
    ________________________    ______________________

    6.7842e+05    6.7897e+05    1857-06-15  1858-12-15
    6.7964e+05    6.7988e+05    1860-10-15  1861-06-15
    6.8128e+05    6.8226e+05    1865-04-15  1867-12-15

tail(disptbl,3)
ans=3×2 table
           Recessions                  NBERRec        
    ________________________    ______________________

    7.2703e+05    7.2727e+05    1990-07-15  1991-03-15
    7.3092e+05    7.3117e+05    2001-03-15  2001-11-15
    7.3339e+05    7.3394e+05    2007-12-15  2009-06-15

Создание массива посещенных состояний

Предположим, что период выборки начинается с NBERRec(1,1) = 1857-06-15 и заканчивается на 2019-05-03. Создание массива datetime для всех последовательных кварталов в интервале 1857-06-15 через 2019-05-03.

timeline = NBERRec(1,1):calquarters(1):datetime("2019-05-03");
T = numel(timeline); % Sample size

Определите, какие кварталы происходят во время рецессии.

isrecession = @(x)any(isbetween(x,NBERRec(:,1),NBERRec(:,2)));
idxrecession = arrayfun(isrecession,timeline);

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

EconState = repmat("Expansion",T,1); % Preallocation
EconState(idxrecession) = "Recession";

Tbl = timetable(EconState,'RowTimes',timeline);
head(Tbl,3)
ans=3×1 timetable
       Time        EconState 
    __________    ___________

    1857-06-15    "Recession"
    1857-09-15    "Recession"
    1857-12-15    "Recession"

tail(Tbl,3)
ans=3×1 timetable
       Time        EconState 
    __________    ___________

    2018-09-15    "Expansion"
    2018-12-15    "Expansion"
    2019-03-15    "Expansion"

Tbl представляет собой набор данных наблюдаемых квартальных экономических состояний, из которых можно отсчитывать переходы.

Подсчет переходов состояний

Рекомендуется создать матрицу 2 на 2, содержащую число:

  • Переход от рецессии к расширению

  • Переход от экспансии к рецессии

  • Самопереходы спадов

  • Самопереходы расширений

Строка j и столбец j матрицы соответствуют одному и тому же экономическому состоянию, а элемент (j, k) содержит число переходов из состояния j в состояние k.

Сначала назначьте индексы членам пространства состояний.

[idxstate,states] = grp2idx(Tbl.EconState);
states
states = 2x1 cell
    {'Recession'}
    {'Expansion'}

numstates = numel(states);
P = zeros(numstates); % Preallocate transition matrix

Индексы состояния idxstate соответствуют состояниям (строкам и столбцам) матрицы перехода, и states определяет индексы. P(1,1) - количество самопереходов спадов, P(1,2) - количество переходов от рецессии к расширению и так далее. Следовательно, для эффективного подсчета типов перехода в данных для каждого перехода t к t + 1 подсчитывают наблюдаемый переход путем индексирования в матрицу перехода с использованием индексов состояния в моменты времени t (строка) и t + 1 ( столбец).

for t = 1:(T - 1)
    P(idxstate(t),idxstate(t+1)) = P(idxstate(t),idxstate(t+1)) + 1;
end

array2table(P,'VariableNames',states,'RowNames',states)
ans=2×2 table
                 Recession    Expansion
                 _________    _________

    Recession       171           33   
    Expansion        32          411   

P - матрица наблюдаемых переходов. P(1,2) = 33 означает, что экономика США перешла от рецессии к экспансии 33 время между 15-Jun-1857 и 03-May-2019.

Создание цепи Маркова дискретного времени

Создание дискретной модели цепи Маркова, характеризующейся матрицей перехода P.

mc = dtmc(P,'StateNames',states);
array2table(mc.P,'VariableNames',states,'RowNames',states)
ans=2×2 table
                 Recession    Expansion
                 _________    _________

    Recession     0.83824      0.16176 
    Expansion    0.072235      0.92777 

mc является dtmc объект. dtmc нормализует P для создания правой стохастической матрицы перехода mc.P (каждая строка суммируется до 1). Элемент mc.P(1,2) = 0.1618 означает, что эмпирическая вероятность перехода к расширению в момент времени t + 1, учитывая, что экономика США находится в рецессии в момент времени t, составляет 0,1618.

Постройте направленный график цепи Маркова.

graphplot(mc,'LabelEdges',true)

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

Цепочка Маркова предполагает, что нынешнее экономическое состояние имеет тенденцию сохраняться, от квартала к кварталу.

См. также

Объекты

Функции

Связанные темы