| [136] | [+] lgrunfeld | |||
| master.do:24 | ||||
| → | ch14.8.do | ↘ | ||
|
mm_suregubmata |
[55] | |||
|
mm_suregubmata |
[134] | |||
ch14.8.do open
file:script:do
| # | content |
|---|---|
| 1 [+] | * ITSP 14.8 - |
| 3 [+] | mata: mata clear |
| 5 [+] | /* // generate residual series local minn = . local maxn = 0 forv i=1/`neq' { local dv : word `i' of `eqlist' local eq`i' = "`dv' `ind`i''" qui { reg `dv' `ind`i'' tempvar touse`i' es eps`i' predict double `eps`i'' if e(sample), resid g byte `touse`i'' = cond(e(sample),1,.) su `eps`i'', meanonly local maxn = max(`maxn',r(N)) local minn = min(`minn',r(N)) } } tempname sigma matrix `sigma' = J(`neq',`neq',0) // generate pairwise correlation matrix of resids; // for comparison with sureg, use divisor N local neq1 = `neq'-1 forv i = 1/`neq1' { forv j = 2/`neq' { qui correlate `eps`i'' `eps`j'', cov mat `sigma'[`i',`i'] = r(Var_1)*(r(N)-1)/(r(N)) mat `sigma'[`j',`j'] = r(Var_2)*(r(N)-1)/(r(N)) mat `sigma'[`i',`j'] = r(cov_12)*(r(N)-1)/(r(N)) mat `sigma'[`j',`i'] = `sigma'[`i',`j'] } } mata: mm_suregub(`neq',"`eqlist'","`sigma'") di _n "Seemingly unrelated regressions for an unbalanced panel" di _n "Min obs per unit = `minn'" di "Max obs per unit = `maxn'" mat b = r(b) mat V = r(V) eret clear // mat list b // mat list V eret post b V eret local cmd "suregub" eret local minobs `minn' eret local maxobs `maxn' eret display end */ |
| 55 [+] | do mm_suregub.mata |
| 57 [+] | type mm_suregub.mata |
/* version 10.1 |
|
| 60 [+] | mata block (71 lines) |
| 131 [+] | */ |
* webuse grunfeld, clear |
|
| 134 [+] | do mm_suregub.mata |
| 136 [+] | use grunfeld , |
| 137 [+] | drop in 75/80 |
| 138 [+] | drop in 41/43 |
| 139 [+] | drop in 18/20 |
| 140 [+] | keep if company <= 4 |
| 141 [+] | drop time |
| 142 [+] | reshape wide invest mvalue kstock , |
| 143 [+] | list year invest* , |
| 145 [+] | suregub (invest1 mvalue1 kstock1) (invest2 mvalue2 kstock2) /// (invest3 mvalue3 kstock3) (invest4 mvalue4 kstock4) |
* ITSP 14.8 -
mata: mata clear
/*
// generate residual series
local minn = .
local maxn = 0
forv i=1/`neq' {
local dv : word `i' of `eqlist'
local eq`i' = "`dv' `ind`i''"
qui {
reg `dv' `ind`i''
tempvar touse`i' es eps`i'
predict double `eps`i'' if e(sample), resid
g byte `touse`i'' = cond(e(sample),1,.)
su `eps`i'', meanonly
local maxn = max(`maxn',r(N))
local minn = min(`minn',r(N))
}
}
tempname sigma
matrix `sigma' = J(`neq',`neq',0)
// generate pairwise correlation matrix of resids;
// for comparison with sureg, use divisor N
local neq1 = `neq'-1
forv i = 1/`neq1' {
forv j = 2/`neq' {
qui correlate `eps`i'' `eps`j'', cov
mat `sigma'[`i',`i'] = r(Var_1)*(r(N)-1)/(r(N))
mat `sigma'[`j',`j'] = r(Var_2)*(r(N)-1)/(r(N))
mat `sigma'[`i',`j'] = r(cov_12)*(r(N)-1)/(r(N))
mat `sigma'[`j',`i'] = `sigma'[`i',`j']
}
}
mata: mm_suregub(`neq',"`eqlist'","`sigma'")
di _n "Seemingly unrelated regressions for an unbalanced panel"
di _n "Min obs per unit = `minn'"
di "Max obs per unit = `maxn'"
mat b = r(b)
mat V = r(V)
eret clear
// mat list b
// mat list V
eret post b V
eret local cmd "suregub"
eret local minobs `minn'
eret local maxobs `maxn'
eret display
end
*/
do mm_suregub.mata
type mm_suregub.mata
/*
version 10.1
mata:
void mm_suregub(real scalar neq,
string scalar eqlist,
string scalar ssigma)
{
pointer (real matrix) rowvector eq
pointer (real matrix) rowvector xx
pointer (real matrix) rowvector yy
eq = xx = yy = J(1, neq, NULL)
isigma = invsym(st_matrix(ssigma))
nrow = 0
ncol = 0
string rowvector coefname, eqn
string matrix mstripe
// equation loop 1
for(i = 1; i <= neq; i++) {
lt = "touse" + strofreal(i)
touse = st_local(lt)
st_view(tt, ., touse)
le = "eq" + strofreal(i)
eqv = st_local(le)
vars = tokens(eqv)
v = vars[|1, .|]
// pull in full matrix, including missing values
st_view(eqq, ., v)
eq[i] = &(tt:* eqq)
// matrix eq[i] is [y|X] for ith eqn
eqname = v[1]
stripe = v[2::cols(v)], "_cons"
coefname = coefname, stripe
eqn = eqn, J(1, cols(v), eqname)
// form X, assuming constant term
nrow = nrow + rows(*eq[i])
iota = J(rows(*eq[i]), 1, 1)
xx[i] = &((*eq[i])[| 1,2 \ .,. |], iota)
ncol = ncol + cols(*xx[i])
// form y
yy[i] = &(*eq[i])[.,1]
}
XX = J(ncol, ncol, 0)
YY = J(ncol, 1, 0)
ii = 0
// equation loop 2
for(i=1; i<=neq; i++) {
i2 = cols(*xx[i])
xi = *xx[i]
jj = 0
for(j=1; j<=neq; j++) {
xj = *xx[j]
j2 = cols(*xx[j])
yj = *yy[j]
XX[| ii+1, jj+1 \ ii+i2, jj+j2 |] = isigma[i, j]:* cross(xi, xj)
YY[| ii+1, 1 \ ii+i2, 1 |] = YY[| ii+1, 1 \ ii+i2, 1 |] + ///
isigma[i, j]:* cross(xi, yj)
jj = jj + j2
}
ii = ii + i2
}
// compute SUR beta (X' [Sigma^-1 # I] X)^-1 (X' [Sigma^-1 # I] y)
vee = invsym(XX)
beta = vee * YY
st_matrix("r(b)", beta')
mstripe=eqn', coefname'
st_matrixcolstripe("r(b)", mstripe)
st_matrix("r(V)", vee)
st_matrixrowstripe("r(V)", mstripe)
st_matrixcolstripe("r(V)", mstripe)
}
end
*/
* webuse grunfeld, clear
do mm_suregub.mata
use grunfeld, clear
drop in 75/80
drop in 41/43
drop in 18/20
keep if company <= 4
drop time
reshape wide invest mvalue kstock, i(year) j(company)
list year invest*, sep(0)
suregub (invest1 mvalue1 kstock1) (invest2 mvalue2 kstock2) ///
(invest3 mvalue3 kstock3) (invest4 mvalue4 kstock4)