*! Version 1.0.1   2601 rjs/cfb
* Multivariate Ljung-Box statistic (see p. 22 in Johansen (1995)).
* Programmed by Richard Sperling on 1/13/01
* Verified on 1/13/01 using Danish data in section 2.4.1
* 1.0.1: 2601 corrected for if touse

program define wntstmvq, rclass
	version 6
	syntax varlist(ts) [if] [in] [,Lags(integer -1) Varlags(integer 0)]
	marksample touse
	_ts timevar, sort
	markout `touse' `timevar'
	tsreport if `touse', report
	if r(N_gaps) {
		di in red "sample may not contain gaps"
		exit
	}
	tempname C0 C0inv LB mattmp
	local count: word count `varlist'
	if `count'<2 {
		di in red "at least two variables must be specified"
		exit
		}
	local count1 = `count'+1
*060102: added if `touse'
	qui mat accum `C0' = `varlist' if `touse', noc
	local nobs=r(N)
	mat `C0' = 1/`nobs' * `C0'
	mat `C0inv' = syminv(`C0')
* if no lag option provided, use formula from ac for max lag
	if(`lags'<1) {
		local lags = min(`nobs'/2 - 2 ,40)
		}
* Initialize Ljung-Box statistic (LB)
	scalar `LB' = 0
	local i 1
	while `i' <= `lags' {
		local lagvlst `varlist'
		local j 1
		while `j'<=`count' {
			local vv: word `j' of `varlist'
			local lagvlst  " `lagvlst' L`i'.`vv'"
			local j = `j'+1
			}
*060102: added if `touse'
		qui mat accum `mattmp' = `lagvlst' if `touse', noc
  		mat `mattmp' = 1/`nobs' * `mattmp'[1..`count', `count1'...]
		mat `mattmp' = `mattmp' * `C0inv' * (`mattmp')' * `C0inv'
		scalar `LB' = `LB' + 1/(`nobs' - `i') * trace(`mattmp')
		local i = `i' + 1
	}

	return scalar stat = `nobs' * (`nobs' + 2) * `LB'
	return scalar df = `count'^2*(`lags'-`varlags')
	return scalar p = chiprob(return(df),return(stat))
	return scalar k = `count'
	return scalar s = `lags'
	return scalar nobs = `nobs'
	di _n in gr "Multivariate Ljung-Box statistic (`count' variables, `lags' lags): " /*
	*/ in ye %10.4f return(stat)
	di in gr "Prob > chi2(" in ye return(df) in gr ") = " in ye %6.4f return(p)

end
exit

* The asymptotic distribution is chi-square with p^2 * (s - k) df, where:
* p = dimension of VAR model (here p = 4)
* s = # of lags to use in calculating LB (here s = 13)
* k = # of lags in original VAR model (here k = 2)