我正在尝试调试我的mata编程以进行第一次gmm估计。但是,我一直遇到顺应性错误。谁能发现问题并帮助修复我的编程?非常感谢帮助和建议。以下是代码:
clear
clear all
/* GMM with mata */
set more off
clear
set obs 500
set seed 6789
gen x2 = rnormal()
gen x3 = rnormal()
gen x4 = rnormal()
gen z1 = rnormal()
gen z2 = rnormal()
gen z3 = rnormal()
gen IQ = rnormal()
gen x1 = z1 + z2 + z3 + IQ + rnormal()
gen y1 = 0.5 + 2*x1 + 2*x2 + 2*x3 + IQ + rnormal()
gen y2 = 0.2 + 4*x1 + 4*x3 + IQ + rnormal()
gen y3 = 0.1 + 3*x2 + 2*x4 + IQ + rnormal()
gen one = 1
global depvar1 "y1"
global depvar2 "y2"
global depvar3 "y3"
global xvars1 "x1 x2 x3 one"
global xvars2 "x1 x3 one"
global xvars3 "x2 x4 one"
global zvars1 "x2 x3 z1 z2 z3 one"
global zvars2 "x3 z1 z2 z3 one"
global zvars3 "x2 x4 one"
mata
mata clear
y1 = NULL
y2 = NULL
y3 = NULL
X1 = NULL
X2 = NULL
X3 = NULL
Z1 = NULL
Z2 = NULL
Z3 = NULL
st_view(y1,.,"$depvar1")
st_view(y2,.,"$depvar2")
st_view(y3,.,"$depvar3")
st_view(X1,.,"$xvars1")
st_view(X2,.,"$xvars2")
st_view(X3,.,"$xvars3")
st_view(Z1,.,"$zvars1")
st_view(Z2,.,"$zvars2")
st_view(Z3,.,"$zvars3")
/* obtain number of individuals */
N = rows(y1)
/* Define y */
for (i=1;i<=N;i++) {
if (i==1) y=(y1[i]\y2[i]\y3[i])
else y = (y\y1[i]\y2[i]\y3[i])
}
/* Define X */
for (i=1;i<=N;i++) {
if (i==1) X=(blockdiag(X1[i,], blockdiag(X2[i,],X3[i,]))) /*12192017:fixing blockdiag by knp*/
else {
X = (X\(blockdiag(X1, blockdiag(X2[i,],X3[i,])))) /*12192017:fixing blockdiag by knp*/
}
}
/* Define Z */
for (i=1;i<=N;i++) {
if (i==1) Z=(blockdiag(Z1[i,], blockdiag(Z2[i,],Z3[i,]))) /*12192017:fixing blockdiag by knp*/
else {
Z = (Z\(blockdiag(Z1[i,], blockdiag(Z2[i,],Z3[i,])))) /*12192017:fixing blockdiag by knp*/
}
}
/* Start with an identity matrix weighting matrix */
Wopt = I(cols(Z))
/* perform GMM optimisation */
function oiv_gmm0(transmorphic M, real scalar todo,
real rowvector b, q,S) {
y1 = moptimize_util_depvar(M,1)
y2 = moptimize_util_depvar(M,2)
y3 = moptimize_util_depvar(M,3)
xb1 = moptimize_util_xb(M,b,1)
xb2 = moptimize_util_xb(M,b,2)
xb3 = moptimize_util_xb(M,b,3)
st_view(Z1,.,moptimize_util_userinfo(M, 2))
st_view(Z2,.,moptimize_util_userinfo(M, 4))
st_view(Z3,.,moptimize_util_userinfo(M, 6))
N = rows(y1)
/* define xb */
for (i=1;i<=N;i++) {
if (i==1) xb=(xb1[i]\xb2[i]\xb3[i])
else xb = (xb\xb1[i]\xb2[i]\xb3[i])
}
/* Define y */
for (i=1;i<=N;i++) {
if (i==1) y=(y1[i]\y2[i]\y3[i])
else y = (y\y1[i]\y2[i]\y3[i])
}
/* Define Z */
for (i=1;i<=N;i++) {
if (i==1) Z=(blockdiag(Z1[i,], blockdiag(Z2[i,],Z3[i,]))) /*12192017:fixing blockdiag by knp*/
else {
Z = (Z\(blockdiag(Z1[i,], blockdiag(Z2[i,],Z3[i,])))) /*12192017:fixing blockdiag by knp*/
}
}
e = y - xb
q = Z'*e
}
M = moptimize_init()
moptimize_init_evaluator(M, &oiv_gmm0())
moptimize_init_evaluatortype(M, "q0")
moptimize_init_ndepvars(M, 3)
moptimize_init_depvar(M, 1, "y1")
moptimize_init_depvar(M, 2, "y2")
moptimize_init_depvar(M, 3, "y3")
moptimize_init_eq_indepvars(M, 1, "x1 x2 x3")
moptimize_init_eq_indepvars(M, 2, "x1 x3")
moptimize_init_eq_indepvars(M, 3, "x2 x4")
moptimize_init_userinfo(M, 1, ("x1", "x2", "x3","one"))
moptimize_init_userinfo(M, 2, ("x2", "x3","z1","z2","z3","one"))
moptimize_init_userinfo(M, 3, ("x1", "x3", "one"))
moptimize_init_userinfo(M, 4, ("x3","z1","z2","z3","one"))
moptimize_init_userinfo(M, 5, ("x2", "x4", "one"))
moptimize_init_userinfo(M, 6, ("x2", "x4", "one"))
moptimize_init_gnweightmatrix(M,Wopt)
moptimize_init_which(M, "min")
moptimize_init_technique(M, "gn")
moptimize(M)
b_gmm = moptimize_result_coefs(M)'
u_gmm = y - X*b_gmm
我在最后一行u_gmm上遇到问题(符合性错误)。非常感谢帮助调试此问题。
非常感谢, katryn