📄 nl.ado
字号:
noi di in gr /*
*/ "Iteration " `its' ": " _c
if "`trace'"!="" {
noi di
}
}
local j 1
foreach parm of local params {
* name is `parm'
* value is ${`param'}
local parmcol = colnumb(`parmvec', "`parm'")
sca `old_pj' = `parmvec'[1,`parmcol']
if "`trace'" != "" {
noi di in gr _col(12) "`parm' = " /*
*/ in ye %9.0g `old_pj'
}
scalar `incr' = `delta'*(abs(`old_pj')+`delta')
matrix `parmvec'[1, `parmcol'] = `old_pj'+`incr'
if `type' < 3 {
capture replace `YHATi' = `expr'
if _rc {
local rc = _rc
noi di in red "`funcerr'"
capture noisily replace /*
*/ `YHATi' = `expr'
}
}
else {
capture nl`expr' `YHATi' `t3rhs' /*
*/ `wtexp' if `touse', /*
*/ at(`parmvec') `options'
if _rc {
local rc = _rc
noisily di as error /*
*/ "nl`expr' returned " _rc
}
}
cap assert `YHATi'<. if `touse'
if _rc {
noi di in red /*
*/ "cannot calculate derivatives"
exit 481
}
if `logtsf' {
* could use dln(f(x))/dx =
* (1/f(x)) df(x)/dx here
replace `J`j''=ln( /*
*/ (`YHATi'-`lnlsq')/(`YHAT'-`lnlsq') /*
*/ ) / `incr' if `touse'
}
else replace `J`j''= (`YHATi'-`YHAT')/`incr' /*
*/ if `touse'
* replace param j with nonincremented value
matrix `parmvec'[1,`parmcol'] = `old_pj'
local j = `j' + 1
}
/*
Update parameter estimates and test for convergence
by max proportional iterative change in each param.
See Gallant p 29.
*/
reg `RESID' `Jnames' `wtexp' if `touse', nocons
scalar `ssr' = .
scalar `f' = 1
while (`ssr' > `old_ssr') { /* backup loop */
local cnvrge 1 /* parameter convergence flag */
if (`f'!=1) {
local j 1
foreach parm of local params {
local parmcol = /*
*/ colnumb(`parmvec', "`parm'")
mat `parmvec'[1,`parmcol'] = /*
*/ `op`j''
local j=`j'+1
}
}
local j 1
foreach parm of local params {
local parmcol = /*
*/ colnumb(`parmvec', "`parm'")
scalar `op`j''=`parmvec'[1,`parmcol']
matrix `parmvec'[1,`parmcol'] = /*
*/ `op`j''+`f'*_coef[`J`j'']
if `f'*abs(_coef[`J`j'']) > /*
*/ `eps'*(abs(`op`j'')+`tau') {
local cnvrge 0
}
local j=`j'+1
}
cap _estimates hold `hest'
if `type' < 3 {
capture replace `YHAT' = `expr'
if _rc {
local rc = _rc
noi di as error "`funcerr'"
capture noisily replace /*
*/ `YHAT' = `expr'
cap _estimates unhold `hest'
}
}
else {
capture nl`expr' `YHAT' `t3rhs' /*
*/ `wtexp' if `touse', /*
*/ at(`parmvec') `options'
if _rc {
local rc = _rc
noi di as error /*
*/ "nl`func' returned " _rc
cap _estimates unhold `hest'
}
}
cap _estimates unhold `hest'
cap assert `YHAT'<. if `touse'
if _rc==0 {
if `logtsf' {
replace `RESID' = `YVAR' - /*
*/ log(`YHAT'-`lnlsq')/*
*/ if `touse'
}
else replace `RESID' = `YVAR'-`YHAT' /*
*/ if `touse'
_est hold `dbeta'
reg `RESID' `Z' `wtexp' if `touse', nocons
scalar `ssr' = e(rss)*`gm2'
_est unhold `dbeta'
if "`ssr'"=="" {
scalar `ssr' = . /* bug fix */
}
}
scalar `f'=`f'/2
} /* backup loop */
if "`log'"=="" {
if "`trace'"!="" {
local trcol "_col(42)"
local trnl "_n"
}
noi di in gr `trcol' /*
*/ "`scaled'residual SS = " /*
*/ in ye %9.0g `old_ssr' `trnl'
}
if abs(`old_ssr'-`ssr') > /*
*/ `eps'*(`old_ssr'+`tau') {
local cnvrge 0
}
scalar `old_ssr' = `ssr'
local done `cnvrge'
local its = `its'+1
if `its' >= `iterate' {
local done 1
}
}
/*
End of main loop.
*/
/*
Check if sd(any derivative vector) = 0, i.e. that
that parameter is a 'regression constant'
to reasonable accuracy.
*/
if "`constant'" != "" {
local const 0
}
else if "`hasconstant'" != "" {
local const 1 /* Syntax parsing above ==> know true */
local j 1
while `j' <= `np' {
if "`hasconstant'" == /*
*/ "`:word `j' of `params''" {
local consj `j'
}
loc j = `j'+1
}
}
else {
local const 0 /* Until we find one, assume no */
local j 1
local consj 0
while `j' <= `np' {
* name is ``j''
* value is ${``j''}
qui sum `J`j'' if `touse'
if sqrt(r(Var)) < `eps'*(abs(r(mean))+`tau') {
local const 1
local consj `j'
}
local j = `j'+1
}
}
/*
Total sum of squares
*/
if `const' == 0 {
tempvar yvarsq
gen double `yvarsq' = `YVAR'^2
summ `yvarsq' `wtexp' if `touse'
scalar `sstot' = r(sum)
if "`weight'" == "iweight" {
local dftot = r(sum_w)
}
else {
local dftot = r(N)
}
}
else {
summ `YVAR' `wtexp' if `touse'
if "`weight'" == "iweight" {
local dftot = r(sum_w) - 1
}
else {
local dftot = r(N) - 1
}
scalar `sstot' = r(Var)*`dftot'
}
scalar `sstot' = `sstot'*`gm2' /* Undo lnlsq() */
/*
Perform reg using final residuals (last ssr is still valid),
calc ANOVA table and display results.
*/
qui reg `RESID' `Jnames' `wtexp' if `touse', /*
*/ `robust' cluster(`cluster') `hc2' `hc3' nocons
local dfm = e(df_m)-`const'
tempname bvec VCE
matrix `bvec' = get(_b)
matrix `VCE' = get(VCE)
* matrix `VCE' = (e(df_r) / (e(df_r)+1)) * `VCE'
matrix rownames `VCE' = `params'
matrix colnames `VCE' = `params'
matrix colnames `bvec' = `params'
tempname Fstat
if "`robust'`cluster'`hc2'`hc3'" != "" {
/* Do a robust Wald test. The prev. reg gave us
the cov matrix, and the estimated betas from
that reg are (virtually) zero. Thus, we can
test if those reg coeffs. equal the NL betas */
local j 1
while `j' <= `np' {
if `j' != `consj' {
loc jn : word `j' of `Jnames'
local parn : word `j' of `params'
local parmcol = /*
*/ colnumb(`parmvec',"`parn'")
qui test `jn' = /*
*/ `=`parmvec'[1, `parmcol']',/*
*/ not accum
}
local j = `j'+1
}
test
sca `Fstat' = r(F)
}
else {
sca `Fstat' = ( (`sstot'-`ssr') / `dfm' ) / /*
*/ ( `ssr' / (`dftot' - `dfm') )
}
local k 1
foreach parm of local params {
local parmcol = colnumb(`parmvec', "`parm'")
matrix `bvec'[1,`k'] = `parmvec'[1,`parmcol']
local k=`k'+1
}
tempname msr
local tdf = `dftot' - `dfm'
scalar `msr' = `ssr' / `tdf'
if "`cluster'" != "" {
local tdf = e(N_clust) - 1
local dftot = e(N_clust)
}
ereturn post `bvec' `VCE', /*
*/ obs(`nobs') dof(`tdf') dep(`yname') esamp(`touse')
ereturn scalar df_m = `dfm'
ereturn scalar df_r = `tdf'
ereturn scalar df_t = `dftot'
ereturn scalar mss = `sstot'-`ssr'
ereturn scalar mms = e(mss)/e(df_m)
ereturn scalar msr = `msr'
ereturn scalar rmse = sqrt(e(msr))
ereturn scalar F = `Fstat'
ereturn scalar r2 = 1-`ssr'/`sstot'
ereturn scalar r2_a = 1-(1-e(r2))*`dftot'/e(df_r)
/*
calc -2(log likelihood) allowing for possible transformation
(formula may need rechecking, esp when weights present)
*/
ereturn scalar dev = `nobs'*(1+log(2*_pi*`ssr'/`nobs')-`mnlnwt')
} /* capture */
if _rc {
local rc=_rc
capture _est unhold `dbeta'
error `rc'
}
if "`leave'"~="" {
tokenize `params'
local j 1
while "``j''"~="" {
rename `J`j'' ``j''
local j = `j' + 1
}
}
ereturn matrix init = `initvec'
ereturn scalar converge = `cnvrge'
ereturn scalar N = `nobs'
ereturn scalar rss = `ssr'
ereturn scalar df_t = `dftot'
ereturn scalar tss = `sstot'
ereturn local depvar "`yname'"
if "`consj'" != "" {
ereturn scalar cj = `consj'
}
else {
ereturn scalar cj = 0
}
ereturn local params "`params'"
ereturn local sexp "`origexp'"
ereturn scalar gm_2 = `gm2'
ereturn scalar k = `np'
ereturn local options "`options'"
ereturn local title "`title'"
ereturn local title_2 "`title2'"
ereturn scalar ic = `its'
ereturn local type `type'
if "`type'" == "3" {
ereturn local rhs "`t3rhs'"
ereturn local funcprog "nl`expr'"
}
if `"`robust'`cluster'"' != "" {
ereturn local vcetype "Robust"
}
if `"`hc2'"' != "" {
ereturn local vcetype "Robust HC2"
}
if `"`hc3'"' != "" {
ereturn local vcetype "Robust HC3"
}
if `"`cluster'"' != "" {
ereturn local clustvar "`cluster'"
ereturn scalar N_clust = `dftot'
}
ereturn scalar log_t = `logtsf'
if `logtsf' == 1 {
ereturn scalar lnlsq = `lnlsq'
}
if "`weight'`exp'" != "" {
ereturn local wtype "`weight'"
ereturn local wexp "`exp'"
}
ereturn local predict nl_p
ereturn local cmd "nl" /* must be last */
NLout `level'
end
program define NLout
args level
local robust
local cluster
if substr("`e(vcetype)'", 1, 6) == "Robust" {
local robust "robust"
}
if "`e(clustvar)'" != "" {
local cluster "cluster"
}
#delimit ;
di ;
if `"`robust'"' != "" | `"`cluster'"' != "" {;
di in gr "Nonlinear regression with robust standard errors" _c;
};
else {;
di in gr " Source {c |} SS df MS" _c;
};
di in gr _col(54) "Number of obs = " in ye %9.0f e(N) ;
if `"`robust'"' == "" & `"`cluster'"' == "" {;
di in gr "{hline 13}{c +}{hline 30}" _c;
};
di in gr _col(54) "F(" %3.0f e(df_m) "," %6.0f e(df_r)
") = " in ye %9.2f e(F) ;
if `"`robust'"' == "" & `"`cluster'"' == "" {;
di in gr " Model {c |} " in ye %11.0g e(mss)
" " %5.0f e(df_m) " " %11.0g e(mms) _c;
};
di in gr _col(54) "Prob > F = "
in ye %9.4f Ftail(e(df_m),e(df_r),e(F)) ;
if `"`robust'"' == "" & `"`cluster'"' == "" {;
di in gr " Residual {c |} " in ye %11.0g e(rss) " "
%5.0f e(df_r) " " %11.0g e(msr) _c;
};
di in gr _col(54) "R-squared = " in ye %9.4f e(r2) ;
if `"`robust'"' == "" & `"`cluster'"' == "" {;
di in gr "{hline 13}{c +}{hline 30}" _c;
di in gr _col(54) "Adj R-squared = " in ye %9.4f e(r2_a) ;
};
if `"`robust'"' == "" & `"`cluster'"' == "" {;
di in gr " Total {c |} " in ye %11.0g e(tss)
" " %5.0f e(df_t) " " %11.0g e(tss)/e(df_t) _c;
};
di in gr _col(54) "Root MSE = " in ye %9.0g e(rmse) ;
di in gr _col(54) "Res. dev. = " in ye %9.0g e(dev) ;
#delimit cr
/*
Display coefficients, standard errors and ci's
*/
tempname invt
scalar `invt' = invttail(e(df_r), (1-`level'/100)/2)
di in gr "`e(title)'"
if "`e(title_2)'" != "" {
di "`e(title_2)'"
}
ereturn di, level(`level')
if e(cj) ~= 0 {
local word : word `e(cj)' of `e(params)'
di in gr /*
*/ "* Parameter `word' taken as constant term in model & ANOVA table"
}
di in gr /*
*/ " (SEs, P values, CIs, and correlations are asymptotic approximations)"
if e(converge) ~= 1 {
error 430
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -