- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 2653 个
- 通用积分
- 0.1761
- 学术水平
- 8 点
- 热心指数
- 16 点
- 信用等级
- 11 点
- 经验
- 14084 点
- 帖子
- 235
- 精华
- 0
- 在线时间
- 686 小时
- 注册时间
- 2009-11-16
- 最后登录
- 2026-3-19
- 毕业学校
- Institute of Business Administration, Jahangirnagar University
|
- new; cls;
- library maxlikmt;
- /*
- MS-MIDAS-AR (2-state) template in GAUSS
- ---------------------------------------
- Model:
- y_t = c_{S_t} + phi * y_{t-1} + b_{S_t} * (X_t * w(theta)) + e_t
- e_t | S_t=s ~ N(0, sigma_s^2)
- Regime switching:
- P = [ p11 1-p11
- 1-p22 p22 ]
- Assumptions:
- 1) y : T x 1 low-frequency dependent variable
- 2) ylag : T x 1 lagged y
- 3) Xlags : T x K matrix of aligned high-frequency lags
- Each row already contains the K high-frequency lags
- relevant for the low-frequency observation.
- 4) Common MIDAS weights across regimes (easy to extend later)
- */
- /* ---------- helpers ---------- */
- proc (1) = logistic(x);
- retp(1 ./ (1 + exp(-x)));
- endp;
- proc (1) = logdnorm(y, mu, sig);
- local z;
- z = (y - mu) ./ sig;
- retp(-0.5 * ln(2*pi) - ln(sig) - 0.5 * (z .* z));
- endp;
- proc (1) = expalmon(theta, K);
- local j, z, w;
- j = seqa(0, 1, K); // 0,1,2,...,K-1
- z = theta[1] .* j + theta[2] .* (j .* j);
- z = z - maxc(z); // stabilize exponentials
- w = exp(z);
- retp(w ./ sumc(w));
- endp;
- proc (1) = stationary_probs(p11, p22);
- local den, pi1;
- den = 2 - p11 - p22;
- pi1 = (1 - p22) / den;
- retp(pi1 | (1 - pi1));
- endp;
- /* ---------- log-likelihood ---------- */
- proc lnlk_ms_midas(struct PV p, struct DS d, ind);
- local y, ylag, Xlags, T, K;
- local c1, c2, b1, b2, phi, ls1, ls2, th1, th2, lp11, lp22;
- local s1, s2, p11, p22, P, w, xw;
- local alpha, pred, ll, t, lpdf1, lpdf2, m, dens, ft, mu1, mu2;
- struct modelResults mm;
- y = d[1].dataMatrix;
- ylag = d[2].dataMatrix;
- Xlags = d[3].dataMatrix;
- T = rows(y);
- K = cols(Xlags);
- /* unpack parameters */
- c1 = pvUnpack(p, 1);
- c2 = pvUnpack(p, 2);
- b1 = pvUnpack(p, 3);
- b2 = pvUnpack(p, 4);
- phi = pvUnpack(p, 5);
- ls1 = pvUnpack(p, 6); // log sigma_1
- ls2 = pvUnpack(p, 7); // log sigma_2
- th1 = pvUnpack(p, 8); // exp-almon theta_1
- th2 = pvUnpack(p, 9); // exp-almon theta_2
- lp11 = pvUnpack(p,10); // logit(p11)
- lp22 = pvUnpack(p,11); // logit(p22)
- s1 = exp(ls1);
- s2 = exp(ls2);
- p11 = logistic(lp11);
- p22 = logistic(lp22);
- w = expalmon(th1 | th2, K);
- xw = Xlags * w;
- P = p11~(1-p11) |
- (1-p22)~p22;
- alpha = stationary_probs(p11, p22);
- ll = zeros(T, 1);
- for t (1, T, 1);
- if t > 1;
- pred = P' * alpha;
- else;
- pred = alpha;
- endif;
- mu1 = c1 + phi * ylag[t] + b1 * xw[t];
- mu2 = c2 + phi * ylag[t] + b2 * xw[t];
- lpdf1 = logdnorm(y[t], mu1, s1);
- lpdf2 = logdnorm(y[t], mu2, s2);
- /* log-sum-exp stabilization */
- m = maxc(lpdf1 | lpdf2);
- dens = exp((lpdf1 | lpdf2) - m);
- ft = sumc(pred .* dens);
- if ft <= 1e-300;
- if ind[1];
- mm.function = -1e256 * ones(T,1);
- endif;
- retp(mm);
- endif;
- ll[t] = ln(ft) + m;
- alpha = (pred .* dens) / ft;
- endfor;
- if ind[1];
- mm.function = ll; // observation-wise log-likelihood
- endif;
- retp(mm);
- endp;
- /* ---------- example estimation block ---------- */
- /*
- Replace these with your actual aligned data:
- y : T x 1
- ylag : T x 1
- Xlags : T x K
- */
- /* Example placeholders:
- y = loadd("y.dat");
- ylag = loadd("ylag.dat");
- Xlags = loadd("Xlags.dat");
- */
- struct DS d0;
- d0 = reshape(dsCreate, 3, 1);
- d0[1].dataMatrix = y;
- d0[2].dataMatrix = ylag;
- d0[3].dataMatrix = Xlags;
- struct PV p0;
- p0 = pvPacki(pvCreate, 0.00, "c1", 1);
- p0 = pvPacki(p0, 0.50, "c2", 2);
- p0 = pvPacki(p0, 0.20, "b1", 3);
- p0 = pvPacki(p0, 0.05, "b2", 4);
- p0 = pvPacki(p0, 0.30, "phi", 5);
- p0 = pvPacki(p0, -1.00, "ls1", 6);
- p0 = pvPacki(p0, -0.50, "ls2", 7);
- p0 = pvPacki(p0, 0.05, "th1", 8);
- p0 = pvPacki(p0, -0.01, "th2", 9);
- p0 = pvPacki(p0, 2.00, "lp11", 10);
- p0 = pvPacki(p0, 2.00, "lp22", 11);
- struct maxlikmtControl c0;
- c0 = maxlikmtControlCreate;
- c0.printIters = 1;
- c0.maxIters = 5000;
- c0.tol = 1e-6;
- /* optional: c0.algorithm = "BFGS"; */
- struct maxlikmtResults out;
- out = maxlikmt(&lnlk_ms_midas, p0, d0, c0);
- print "retcode = " out.retcode;
- print "logLik = " out.fct;
- print "estimated parameters:";
- print out.par;
复制代码
|
|