Skip to content

Create sparse transition matrices given state-space vectors, mean, variance

License

Notifications You must be signed in to change notification settings

magerton/MarkovTransitionMatrices.jl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

31 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MarkovTransitionMatrices

Build Status

Coverage Status

codecov.io

This package creates a Markov transition matrix P[i,j] = Pr(state_{t+1}=j | state_t = i) for a discrete process where innovations are Gaussian. The matrix returned is sparse to save space.

IN PROGRESS: better moment matching

Farmer and Toda (2006) show how one can match an arbitrary number of moments from a discrete distribution. Their code is partially translated. See example/bivariate-brownian.jl for an example.

Example: Correlated random walk

To model x_{t+1} = x_t + u_{t+1} where u_{t+1} ∼ N(0,Σ), we first pick a grid:

grid_x1 = 0.0:1.0:10.0
grid_x2 = -1.5:0.5:15.0

Internally, the function will use Base.product() to iterate through all possible states. We then we create functions for the mean and variance given a tuple in the state space.

μ(s) = [s...]
Σ(s) = [1.0 0.5; 0.5 1.0]

Many probabilities are very close to zero and can be eliminated from the matrix without too much impact on numerical accuracy. Here, we drop all probabilities less than 1e-8. Create the transition matrix P as

using MarkovTransitionMatrices
P = markov_transition(μ, Σ, 1e-8, grid_x1, grid_x2)

Example: Markov-switching

We can also model a Markov-switching process with a finite number of regimes r ∈ {1,2,…,k}. Let the transition matrix for the k regimes πswitch = Pr(s_{t+1} = j | s_t = k) be

πswitch = [.9 .1; .4 .6]

The mean and variance functions take two parameters: the regime and state-tuple

μswitch(r::Int, s) = r==1 ? [s...] : [s...] .+ ones(2)
Σswitch(r::Int, s) = r==1 ? eye(2) : [1.0 0.5; 0.5 1.0]
Pswitch = markovswitching_transition(μswitch, Σswitch, πswitch, 1e-8, grid_x1, grid_x2)