*! version 1.0 JPR 17-Feb-93. STB-12: sqv7 program define cusumb version 3.0 local varlist "req ex min(2) max(2)" local if "opt" local in "opt" #delimit ; local options "YFit(string) noGraph noCAlc GEN(string) Symbol(string) Connect(string) *" ; #delimit cr parse "`*'" parse "`varlist'", parse(" ") if "`yfit'"!="" { confirm var `yfit' } if "`gen'"!="" { confirm new var `gen' } tempvar y x cusum quietly { gen `y' = `1' `if' `in' gen `x' = `2' if `y'!=. replace `y' = . if `x'==. sum `x' local obs = _result(1) if `obs'<3 { exit 2001 } local jx = .00001*(_result(6)-_result(5)) sort `y' `x' /* To avoid ties and ensure a unique sort order for x, randomly jitter x by .00001 times its range using a fixed seed */ set seed 111 replace `x' = `x'+uniform()*`jx' sort `x' sum `y' local mean = _result(3) if _result(5)<0 | _result(6)>1 { di in red "Yvar has values outside range [0,1]" error 2002 } if "`yfit'"!="" { gen `cusum' = sum(`yfit'-`y') } else { gen `cusum' = sum(`mean'-`y') } local cl : variable label `1' if "`cl'"=="" { local cl "`1'" } label var `cusum' "Cusum (`cl')" _crcslbl `x' `2' } if "`graph'"!="nograph" { if "`symbol'"=="" { local symbol "." } if "`connect'"=="" { local connect "l" } graph `cusum' `x', s(`symbol') c(`connect') `options' } mac def S_1 `obs' mac def S_2 `mean' if "`calc'"!="nocalc" { /* P value for linear and quadratic cusums. Note that in log(cusum)-X*log(n), X is about pi/6. */ quietly { sum `cusum' local mcusl = max(-_result(5), _result(6)) local lp = -abs(log(`mean'/(1-`mean'))) local mcusm = -1.0605-(`lp'^2)*(0.12684+0.010437*`lp') local mcuss = 0.3130+0.004261*`lp' local zl = (log(`mcusl')-0.5236*log(`obs')-`mcusm') /* */ /`mcuss' replace `y' = `cusum'-`cusum'[`obs'-_n] sum `y' local mcusq = max(-_result(5), _result(6)) local mcusm = -1.1196-(`lp'^2)*(0.12093+0.009744*`lp') local mcuss = 0.3269+0.006547*`lp' local zq = (log(`mcusq')-0.5236*log(`obs')-`mcusm') /* */ /`mcuss' } local skip = 8-length("`1'") #delimit ; di in gr _n "Variable | Obs" _col(21) "Pr(1)" _col(29) "CusumL" _col(39) "zL" _col(45) "Pr>zL" _col(53) "CusumQ" _col(63) "zQ" _col(69) "Pr>zQ" _n "---------+" _dup(63) "-" ; di in gr _skip(`skip') "`1' |" in ye %6.0f `obs' %9.4f `mean' %9.2f `mcusl' %8.3f `zl' %7.3f normprob(-`zl') %9.2f `mcusq' %8.3f `zq' %7.3f normprob(-`zq') ; #delimit cr mac def S_3 `mcusl' mac def S_4 `zl' mac def S_5 = normprob(-`zl') mac def S_6 `mcusq' mac def S_7 `zq' mac def S_8 = normprob(-`zq') } if "`gen'"!="" { rename `cusum' `gen' } end