GitHub

@@ -62,6 +62,8 @@ import quantecon as qe

6262

from numba import jit

6363

from typing import NamedTuple, Optional, Tuple

6464

from collections import namedtuple

65+66+

rng = np.random.default_rng()

6567

```

66686769

## VAR model setup

@@ -217,7 +219,7 @@ def log_likelihood_path(X, model):

217219218220

return log_L

219221220-

def simulate_var(model, T, N_paths=1):

222+

def simulate_var(model, T, rng, N_paths=1):

221223

"""

222224

Simulate paths from the VAR model

223225

"""

@@ -227,13 +229,13 @@ def simulate_var(model, T, N_paths=1):

227229228230

for i in range(N_paths):

229231

# Draw initial state

230-

x = mvn.rvs(mean=model.μ_0, cov=model.Σ_0)

232+

x = mvn.rvs(mean=model.μ_0, cov=model.Σ_0, random_state=rng)

231233

x = np.atleast_1d(x)

232234

paths[i, 0] = x

233235234236

# Simulate forward

235237

for t in range(T):

236-

w = np.random.randn(m)

238+

w = rng.standard_normal(m)

237239

x = model.A @ x + model.C @ w

238240

paths[i, t+1] = x

239241

@@ -322,7 +324,7 @@ Let's generate 100 paths of length 200 from model $f$ and compute the likelihood

322324

# Simulate from model f

323325

T = 200

324326

N_paths = 100

325-

paths_from_f = simulate_var(model_f, T, N_paths)

327+

paths_from_f = simulate_var(model_f, T, rng, N_paths)

326328327329

L_ratios_f = compute_likelihood_ratio_var(paths_from_f, model_f, model_g)

328330

@@ -384,8 +386,8 @@ Let's generate 50 paths of length 50 from both models and compute the likelihood

384386

T = 50

385387

N_paths = 50

386388387-

paths_from_f = simulate_var(model2_f, T, N_paths)

388-

paths_from_g = simulate_var(model2_g, T, N_paths)

389+

paths_from_f = simulate_var(model2_f, T, rng, N_paths)

390+

paths_from_g = simulate_var(model2_g, T, rng, N_paths)

389391390392

# Compute likelihood ratios

391393

L_ratios_ff = compute_likelihood_ratio_var(paths_from_f, model2_f, model2_g)

@@ -453,11 +455,11 @@ def model_selection_analysis(T_values, model_f, model_g, N_sim=500):

453455454456

for T in T_values:

455457

# Simulate from model f

456-

paths_f = simulate_var(model_f, T, N_sim//2)

458+

paths_f = simulate_var(model_f, T, rng, N_sim//2)

457459

L_ratios_f = compute_likelihood_ratio_var(paths_f, model_f, model_g)

458460459461

# Simulate from model g

460-

paths_g = simulate_var(model_g, T, N_sim//2)

462+

paths_g = simulate_var(model_g, T, rng, N_sim//2)

461463

L_ratios_g = compute_likelihood_ratio_var(paths_g, model_f, model_g)

462464463465

# Decision rule: choose f if log L_T >= 0

@@ -683,12 +685,12 @@ def create_samuelson_var_model(a, b, γ, G, σ, stationary_init=False,

683685684686

return model, G_obs, info

685687686-

def simulate_samuelson(model, G_obs, T, N_paths=1):

688+

def simulate_samuelson(model, G_obs, T, rng, N_paths=1):

687689

"""

688690

Simulate Samuelson model

689691

"""

690692

# Simulate state paths

691-

states = simulate_var(model, T, N_paths)

693+

states = simulate_var(model, T, rng, N_paths)

692694693695

# Extract observables using G matrix

694696

if N_paths == 1:

@@ -731,8 +733,8 @@ T = 50

731733

N_paths = 50

732734733735

# Get both states and observables

734-

states_f, obs_f = simulate_samuelson(model_sam_f, G_obs_f, T, N_paths)

735-

states_g, obs_g = simulate_samuelson(model_sam_g, G_obs_g, T, N_paths)

736+

states_f, obs_f = simulate_samuelson(model_sam_f, G_obs_f, T, rng, N_paths)

737+

states_g, obs_g = simulate_samuelson(model_sam_g, G_obs_g, T, rng, N_paths)

736738737739

output_paths_f = obs_f[:, :, 0]

738740

output_paths_g = obs_g[:, :, 0]

Read the original on github.com ↗