Work with State Transitions

This example shows how to work with transition data from an empirical array of state counts, and create a discrete-time Markov chain (dtmc) model characterizing state transitions. For each quarter in 1857–2019, the example categorizes the state of the US economy as experiencing a recession or expansion by using historical recession periods defined by the National Bureau of Economic Research (NBER). Then, the example forms the empirical transition matrix by counting the quarter-to-quarter transitions of the economic state.

Load and Process Data

Load the historical, NBER-defined recession start and end dates.

load Data_Recessions

The Recessions variable in the workspace is a 33-by-2 matrix of serial date numbers. Rows of Recessions correspond to successive periods of recession, and columns 1 and 2 contain the start and end dates, respectively. For more details, enter Description at the command line.

Because MATLAB® datetime arrays enable you to work with date data efficiently, convert Recessions to a datetime array. Specify the date format yyyy-MM-dd. Visually compare the data types of the first few periods and the last few periods.

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

Create Array of Visited States

Assume that the sampling period begins on NBERRec(1,1) = 1857-06-15 and ends on 2019-05-03. Create a datetime array of all consecutive quarters in the interval 1857-06-15 though 2019-05-03.

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

Identify which quarters occur during a recession.

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

Create a MATLAB® timetable containing a variable that identifies the economic state of each quarter in the sampling period. Display the first few observations and the last few observations in the timetable.

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 is a data set of the observed, quarterly economic states, from which transitions can be counted.

Count State Transitions

Consider creating a 2-by-2 matrix containing the number of:

  • Transitions from a recession to an expansion

  • Transitions from an expansion to a recession

  • Self-transitions of recessions

  • Self-transitions of expansions

Row j and column j of the matrix correspond to the same economic state, and element (j,k) contains the number of transitions from state j to state k.

First, assign indices to members of the state space.

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

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

The state indices idxstate correspond to states (rows and columns) of the transition matrix, and states defines the indices. P(1,1) is the number of self-transitions of recessions, P(1,2) is the number of transitions from a recession to an expansion, and so on. Therefore, to count the transition types in the data efficiently, for every transition t to t+1, tally the observed transition by indexing into the transition matrix using state indices at times t (row) and t+1 (column).

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 is the matrix of observed transitions. P(1,2) = 33 means that the US economy transitioned from a recession to an expansion 33 times between 15-Jun-1857 and 03-May-2019.

Create Discrete-Time Markov Chain

Create a discrete-time Markov chain model characterized by the transition matrix 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 is a dtmc object. dtmc normalizes P to create the right-stochastic transition matrix mc.P (each row sums to 1). The element mc.P(1,2) = 0.1618 means that the empirical probability of transitioning to an expansion at time t + 1, given that the US economy is in a recession at time t, is 0.1618.

Plot a directed graph of the Markov chain.

graphplot(mc,'LabelEdges',true)

The Markov chain suggests that the current economic state tends to persist, from quarter to quarter.

See Also

Objects

Functions

Related Topics