*! Version 1.0.2 Manh H. B. (hbmanh9492@gmail.com) 15/09/2025
* VAR Residual Heteroskedasticity Tests
cap program drop varlmhet
program define varlmhet, rclass
version 11.0
syntax , [Nocross]
if "`e(cmd)'" != "var" {
display in red as error "Last estimates not var"
exit 301
}
tempname var_res model_f model_r omega omega0 LM lm lm_df lm_p
* Predict e_i, e_ij
qui estimates store `var_res'
forvalues i=1/`e(k_dv)' {
tempvar _e`i'
qui predict double `_e`i'' if e(sample), r eq(#`i')
}
local sigma_ij
forvalues i=1/`e(k_dv)' {
forvalues j=1/`e(k_dv)' {
if `j'>=`i' {
tempvar _e`i'`j'
qui gen double `_e`i'`j''=`_e`i''*`_e`j'' if e(sample)
local sigma_ij `sigma_ij' `_e`i'`j''
}
}
}
* Generating right hand-side variables
* 1.0.1 Allow time series operator in exog() option!
qui tsrevar `e(exog)'
local yvar "`r(varlist)'"
* 1.0.2 Allow time series operator in e(endog)
qui tsrevar `e(endog)'
local endo_var "`r(varlist)'"
* Linear term
forvalues i=1/`e(mlag)' {
foreach var of varlist `endo_var' {
tempvar l`i'_`var'
qui gen double `l`i'_`var'' = 0
qui replace `l`i'_`var'' = `var'[_n-`i'] if _n>`i' & `var'[_n-`i']<.
local yvar `yvar' `l`i'_`var''
}
}
* Auxiliary regression (White, 1980)
* Cross-term
if "`nocross'"=="" {
qui reg3 (`sigma_ij' = c.(`yvar')##c.(`yvar')) ///
if e(sample), ols small
}
else {
* Squared term
local yvar_sq
foreach var of varlist `yvar' {
tempvar `var'_sq
qui gen double ``var'_sq' = `var'^2
local yvar_sq `yvar_sq' ``var'_sq'
}
qui reg3 (`sigma_ij' = `yvar' `yvar_sq') ///
if e(sample), ols small
}
qui estimates store `model_f'
qui reg3 (`sigma_ij' = ) if e(sample), ols small
qui estimates store `model_r'
* LM test for heteroscedasticity (~ EViews version)
qui estimates restore `model_r'
mat `omega0' = e(Sigma)*(e(N)-e(k)/e(k_eq))
qui estimates restore `model_f'
scalar `lm_df' = e(k)-e(k_eq)
mat `omega' = e(Sigma)*(e(N)-e(k)/e(k_eq))
mat `LM' = e(N)*trace((`omega0'-`omega')*invsym(`omega0'))
scalar `lm' = `LM'[1,1]
scalar `lm_p' = 1-chi2(`lm_df', `lm')
qui estimates restore `var_res'
* Display
if "`nocross'"=="" {
di as txt "VAR Residual Heteroscedasticity Tests (Includes Cross Terms)"
}
else {
di as txt "VAR Residual Heteroscedasticity Tests (Excludes Cross Terms)"
}
di as txt "H0: Homoscedasticity"
di as txt _col(5) "Chi2(" %3.0f `lm_df' ") = " ///
as res %10.4f `lm'
di as txt _col(5) "Prob > chi2 = " as res %11.4f `lm_p'
di
ret scalar lm = `lm'
ret scalar df = `lm_df'
ret scalar p = `lm_p'
end