*
* NONLINEAR.RPF
* Example of estimation of the same non-linear model using MAXIMIZE,
* FIND and NLLS with the JACOBIAN option.
*
* Adapted from Greene, Econometric Analysis, 5th Edition, example 17.5
* from pages 498-499.
*
open data tablef9-2[1].txt
data(format=prn,org=columns) 1 25 valueadd capital labor nfirm
*
set y = valueadd/nfirm
set k = capital/nfirm
set l = labor/nfirm
set logk = log(k)
set logl = log(l)
*
* Nonlinear least squares (which is a poor estimator if theta is
* unknown). Because the "dependent variable" is actually a combination
* of two terms, we just define the formula as the residual. If NLLS sees
* a FRML without an explicitly defined dependent variable, it will just
* minimize the sum of squares of the frml itself.
*
nonlin b1 b2 b3 theta
compute b1=b2=b3=theta=0.0
*
frml resid = log(y)+theta*y-b1-b2*logk-b3*logl
nlls(frml=resid)
*************************************************************************
*
* Maximum likelihood estimates. We need to add the variance to the list
* of parameters (if we're doing a joint estimate of all the parameters).
* The log likelihood formula itself uses the resid FRML defined above as
* a building block so we don't have to repeat it.
*
nonlin b1 b2 b3 theta sigsq
frml loglike = log(1/y+theta)+%logdensity(sigsq,resid)
*
* We need to initialize sigsq to a positive number or loglike won't be
* computable at the initial guesses.
*
compute sigsq=%seesq
maximize(method=bfgs) loglike
*************************************************************************
*
* This is an alternative way to do maximum likelihood. This uses NLLS
* with the JACOBIAN option to take care of those terms in the likelihood.
*
nonlin b1 b2 b3 theta
nlls(jacobian=(1/y+theta),frml=resid)
*************************************************************************
*
* This is the same maximum likelihood done by concentrating out the
* beta's and variance, since given theta, the likelihood is just least
* squares.
*
dec real concentrate
nonlin theta
find maximum concentrate
set yadjust = log(y)+theta*y
linreg(noprint) yadjust
# constant logk logl
sstats / log(1/y+theta)>>yterms
compute concentrate=yterms+%logl
end find