* VEC Residual Heteroskedasticity Tests * Version 1.0.2 Manh H. B. 15/09/2025 * Following Doornik (1996) * Mod 1.0.1 to replace all global macros by local macros * Mod 1.0.2 to replace allow time series operator in e(endog) cap program drop veclmhet program define veclmhet, rclass version 11.0 syntax , [Nocross] if "`e(cmd)'" != "vec" { display in red as error "Last estimates not vec" exit 301 } tempname vec_res model_f model_r veclag omega omega0 LM lm lm_df lm_p if "`e(trend)'"=="trend" { tempvar _trend qui gen `_trend' = _n local yvar `_trend' } else { local yvar } * Predict e_i, e_ij qui estimates store `vec_res' forvalues i=1/`e(k_dv)' { tempvar _e`i' qui predict double `_e`i'' /*if e(sample)*/, r eq(#`i') } * Predict _ce_i forvalues i=1/`e(k_ce)' { tempvar _ce`i' l_ce`i' qui predict double `_ce`i'' /*if e(sample)*/, ce eq(#`i') qui gen double `l_ce`i'' = 0 qui replace `l_ce`i'' = `_ce`i''[_n-1] if `_ce`i''[_n-1]<. local yvar `yvar' `l_ce`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 * Linear term *local yvar `yvar' * 1.0.2 Allow time series operator in e(endog) qui tsrevar `e(endog)' local endo_var "`r(varlist)'" scalar `veclag' = e(n_lags) - 1 local mlag = `veclag' forvalues i=1/`mlag' { foreach var of varlist `endo_var' { tempvar dl`i'_`var' qui gen double `dl`i'_`var'' = dl`i'.`var' local yvar `yvar' `dl`i'_`var'' } } * Auxiliary regression (White, 1980) * Cross-term if "`nocross'"=="" { qui reg3 (`sigma_ij' = c.(`yvar')##c.(`yvar' `e(sindicators)')) /// 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' `e(sindicators)') /// 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 `vec_res' if "`nocross'"=="" { di as txt "VEC Residual Heteroscedasticity Tests (Includes Cross Terms)" } else { di as txt "VEC 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