* version 1.0 2008-02-18
*!Version 1.1 2019-03-27
* Added possibility to save the variables for the plot
* Added noGraph option to suppress the plot
*! Sune.Karlsson@oru.se
*

*! News impact curve for ARCH type models
*


program define newsimpact
version 9

syntax [namelist(name=savevar id="Saved variables" min=2 max=2)] [, Sigma2(real -1) Range(real -1) noGraph]

if "`e(cmd)'" != "arch" {
  di as err "newsimpact can only be run after {help arch}"
  exit 198
}

foreach v of local savevar {
  capture: confirm variable `v'
  if ( !_rc ) {
	di as err "Variable `v' already exists"
	exit 110
  }
}

if ( "`sigma2'" <= "0" ) {
  // use default, mean of estimated conditional variances
  tempname h
  quietly {
    predict `h' if e(sample), variance
    sum `h', meanonly
  }
  local sigma2 = r(mean)
}
local sdev = sqrt(`sigma2')

local nobs = _N
if ( `nobs' < 101 ) {
  if ( int(`nobs'/2) == `nobs'/2 ) {
    local nobs = `nobs' - 1
  }
}
else {
  local nobs = 101
}
local nobshalf = int(`nobs'/2)

if ( "`range'" <= "0" ) {
  local range = 2
}

local parnames : colfullnames e(b)
local maxlag = 1
// find max lag in parameter list
foreach name of local parnames {
  if regexm( "`name'", ":L([0-9]*)\." ) { 
    local lag = regexs(1)
    if ( "`lag'" == "" ) local lag = 1
    if ( `lag' > `maxlag' ) local maxlag = `lag'
  }
}
local lagplus = `maxlag'+1
local lagplus2 = `maxlag'+2

tempname z ztmp impact itmp
quietly {
  gen `impact' = .
  gen `z' = `range'*(_n-`nobshalf'-1)/`nobshalf' in 1/`nobs'
  gen `ztmp' = `sdev' in 1/`maxlag'
}
quietly: forvalues i = 1/`nobs' {
  replace `ztmp' = `sdev'*`z'[`i'] in `lagplus'
  capture: drop `itmp'
  predict `itmp' in 1/`lagplus2', variance at(`ztmp' `sigma2')
  replace `impact' = `itmp'[`lagplus2'] in `i'
}
label var `z' "News, z(t-1)"
label var `impact' "Response, sigma^2(t)"
//list `impact' `z' in 1/110

disp as text "News impact calculated at sigma^2 = `sigma2'"

if ( "`graph'" == "" ) {
  twoway (line `impact' `z'), title("News impact curve")
}

if ( "`savevar'" != "" ) {
  tokenize `savevar'
  quietly: gen `1' = `impact'
  label var `1' "Response, sigma^2(t)"
  quietly: gen `2' = `z'
  label var `2' "News, z(t-1)"
}

end