xtnb_lf.ado

来自「是一个经济学管理应用软件 很难找的 但是经济学学生又必须用到」· ADO 代码 · 共 136 行

ADO
136
字号
*! version 2.0.1  17mar1999
program define xtnb_lf  /* random-effects xtnbreg log likelihood */
        version 6
	args todo b lnf g H

        tempvar lam sumlam sumy f
	tempname r s lngrs
	mleval `lam' = `b', eq(1)
	mleval `r' = `b', eq(2) scalar
	mleval `s' = `b', eq(3) scalar

	local bound 20
	if abs(`r') > `bound' { scalar `r' = sign(`r')*`bound' }
	if abs(`s') > `bound' { scalar `s' = sign(`s')*`bound' }

	scalar `r' = exp(`r')
	scalar `s' = exp(`s')
	scalar `lngrs' = lngamma(`r'+`s') - lngamma(`r') - lngamma(`s')

	local y "$ML_y1"
	local by "by $S_XTby"

	quietly {

/* Calculate the log-likelihood. */

		replace `lam' = exp(`lam') if $ML_samp
		`by': gen double `sumlam' = cond(_n==_N,sum(`lam'),.) /*
		*/ if $ML_samp
		`by': gen double `sumy' = cond(_n==_N,sum(`y'),.) if $ML_samp

					/* Note: missing values for _n < _N
					   makes evaluations of below fast
					*/

		`by': gen double `f' = cond(_n==_N, sum(cond(`y'==0, 0, /*
		*/ lngamma(`lam'+`y') - lngamma(`lam') - lngamma(`y'+1))) /*
		*/ + `lngrs' + lngamma(`r'+`sumlam') + lngamma(`s'+`sumy') /*
		*/ - lngamma(`r'+`s'+`sumlam'+`sumy'), 0) if $ML_samp

		capture assert `f' < 0 if `sumy'!=.
		if _rc {
			scalar `lnf' = .
			exit
		}

		mlsum `lnf' = `f'

		if `todo' == 0 | `lnf'==. { exit }

/* Calculate gradient. */

		drop `f'
		tempname g1 g2 g3 digr digs
		tempvar dfr dfs
		`by': gen double `dfr' = digamma(`r'+`sumlam') /*
		*/ - digamma(`r'+`s'+`sumlam'+`sumy') if _n==_N & $ML_samp
		`by': replace `dfr' = `dfr'[_N]
		`by': gen double `dfs' = digamma(`s'+`sumy') /*
		*/ - digamma(`r'+`s'+`sumlam'+`sumy') if _n==_N & $ML_samp

		mlvecsum `lnf' `g1' = `lam'*(`dfr'+ digamma(`lam'+`y') /*
		*/ - digamma(`lam')), eq(1)

		scalar `digr' = digamma(`r'+`s') - digamma(`r')
		mlvecsum `lnf' `g2' = cond(`sumy'!=., /*
		*/ `r'*(`digr'+`dfr'), 0), eq(2)

		scalar `digs' = digamma(`r'+`s') - digamma(`s')
		mlvecsum `lnf' `g3' = cond(`sumy'!=., /*
		*/ `s'*(`digs'+`dfs'), 0), eq(3)

		mat `g' = (`g1',`g2',`g3')

		if `todo' == 1 | `lnf'==. { exit }

/* Calculate negative hessian. */

		tempname d11 d11i d12 d13 d22 d23 d33 trig
		tempvar triall
		`by': gen double `triall' = trigamma(`r'+`s'+`sumlam'+`sumy') /*
		*/ if _n==_N & $ML_samp
		`by': replace `triall' = `triall'[_N]

		scalar `trig' = trigamma(`r'+`s') - trigamma(`s')
		mlmatsum `lnf' `d33' = cond(`sumy'!=., /*
		*/ -`s'*(`digs' + `dfs' + `s'*(`trig' + /*
		*/ trigamma(`s'+`sumy') - `triall')), 0), eq(3)

		`by': replace `dfs' = trigamma(`r'+`sumlam') /*
		*/ if _n==_N & $ML_samp
		`by': replace `dfs' = `dfs'[_N]

		scalar `trig' = trigamma(`r'+`s') - trigamma(`r')
		mlmatsum `lnf' `d22' = cond(`sumy'!=., /*
		*/ -`r'*(`digr' + `dfr' + `r'*(`trig' + /*
		*/ `dfs' - `triall')), 0), eq(2)

		scalar `trig' = trigamma(`r'+`s')
		mlmatsum `lnf' `d23' = cond(`sumy'!=., /*
		*/ -`r'*`s'*(`trig'-`triall'), 0), eq(2,3)

		mlmatsum `lnf' `d12' = -`r'*`lam'*(`dfs'-`triall'), eq(1,2)
		mlmatsum `lnf' `d13' = `s'*`lam'*`triall', eq(1,3)

		replace `dfr' = `dfr' + digamma(`lam'+`y') /*
		*/ - digamma(`lam') + `lam'*(trigamma(`lam'+`y') /*
		*/ - trigamma(`lam')) if $ML_samp

		local names : colnames(`b')
		tokenize `names'
		local n : word count `names'
		local i 1
		while `i' <= `n' - 2 {
			if "``i''"=="_cons" { local `i' 1 }

			`by': replace `sumlam' = sum(`lam'*``i'') if $ML_samp
			`by': replace `sumlam' = -`lam'*(`dfr'*``i'' /*
			*/ + (`dfs'-`triall')*`sumlam'[_N]) if $ML_samp

			mlvecsum `lnf' `d11i' = `sumlam'

			if `lnf'==. { exit }

			mat `d11' = nullmat(`d11') \ `d11i'

			local i = `i' + 1
		}

		mat `d11' = 0.5*(`d11' + `d11'') /* make perfectly symmetric */

		mat `H' = (`d11',`d12',`d13' \ `d12'',`d22',`d23' /*
		*/       \ `d13'',`d23',`d33')
	}
end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?