------------------------------------------------------------------------------------------------------ log: c:\Imbook\bwebpage\Section2\mma05p4margeffects.txt log type: text opened on: 17 May 2005, 13:57:02 . . ********** OVERVIEW OF MMA05P4MARGINALEFFECTS.DO ********** . . * STATA Program . * copyright C 2005 by A. Colin Cameron and Pravin K. Trivedi . * used for "Microeconometrics: Methods and Applications" . * by A. Colin Cameron and Pravin K. Trivedi (2005) . * Cambridge University Press . . * Chapter 5.9.4 pp.162-3 . * Marginal effects analysis for a nonlinear model (here exponential regression). . . * Provides . * (1) Sample average marginal effect using derivative . * (2) Sample average marginal effect using first difference . * (3) Marginal effect evaluated at the sample mean . * (4) Marginal effects (1)-(3) when model estimated by Stata ml command . * using generated data (see below) . . * Related programs: . * mma05p1mle.do OLS and MLE for the same data . * mma05p2nls.do NLS, WNLS, FGNLS for same data using nl command . * mma05p3nlsbyml.do NLS for same data using ml command . . * To run this program you need data and dictionary files . * mma05data.asc ASCII data set generated by mma05p1mle.do . . ********** SETUP ********** . . set more off . version 8 . . ********** READ IN DATA and SUMMARIZE ********** . . * Model is y ~ exponential(exp(a + bx)) . * x ~ N[mux, sigx^2] . * f(y) = exp(a + bx)*exp(-y*exp(a + bx)) . * lnf(y) = (a + bx) - y*exp(a + bx) . * E[y] = exp(-(a + bx)) note sign reversal for the mean . * V[y] = exp(-(a + bx)) = E[y] . * Here a = 2, b = -1 and x ~ N[mux=1, sigx^21] . * and Table 5.7 uses N=10,000 . . * Data was generated by program mma05p1mle.do . infile y x using mma05data.asc (10000 observations read) . . * Descriptive Statistics . describe Contains data obs: 10,000 vars: 2 size: 120,000 (98.8% of memory free) ------------------------------------------------------------------------------- storage display value variable name type format label variable label ------------------------------------------------------------------------------- y float %9.0g x float %9.0g ------------------------------------------------------------------------------- Sorted by: Note: dataset has changed since last saved . summarize Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- y | 10000 .6194352 1.291416 .0000445 30.60636 x | 10000 1.014313 1.004905 -2.895741 4.994059 . . ********** MARGINAL EFFECTS for CHAPTER 5.9.4 ********** . . ** (1) DERIVATIVE METHOD FOR SAMPLE AVERAGE MARGINAL EFFECT . . * (1A) METHOD A: Use analytical results . * Since E[y] = exp(-(a + bx)) Note: here sign reversal for the mean !! . * dE[y]/dx = -b*exp(-(a + bx)) = -b*E[y] . . * Estimate the model . * The Stata code for exponential regression is unusual as st command . * Need to declare data to be st data with dependent variable y . stset y failure event: (assumed to fail at time=y) obs. time interval: (0, y] exit on or before: failure ------------------------------------------------------------------------------ 10000 total obs. 0 exclusions ------------------------------------------------------------------------------ 10000 obs. remaining, representing 10000 failures in single record/single failure data 6194.352 total analysis time at risk, at risk from t = 0 earliest observed entry t = 0 last observed exit t = 30.60636 . quietly streg x, distribution(exponential) nohr . gen dEydxanalyticalderivative = -_b[x]*exp(-_b[_cons] - _b[x]*x) . * Alternative is to (1) predict the mean and (2) multiply by -_b[x] . quietly sum dEydxanalyticalderivative . scalar mesaad = r(mean) . di "Sample average marginal effect by analytical derivative = " mesaad Sample average marginal effect by analytical derivative = .60976598 . . * (1B) METHOD B: Use numerical derivative (here one-sided) . * This is same as first difference code, except have small change in x . * Note: precision problems can arise with small changes in x . * The following code tries to minimize such problems . * Change in x will be 0.0001 times the standard deviation of x . egen sdx = sd(x) . quietly streg x, distribution(exponential) nohr . * Need to tell streg to predict the mean as this is not the default. . predict y0, mean time . gen xoriginal = x . replace x = x+0.0001*sdx (10000 real changes made) . predict y1, mean time . gen dEydxnumericalderivative = (y1 - y0)/(0.0001*sdx) . quietly sum dEydxnumericalderivative . scalar mesand = r(mean) . di "Sample average marginal effect by numerical derivative = " mesand Sample average marginal effect by numerical derivative = .60949044 . replace x = xoriginal (10000 real changes made) . drop xoriginal sdx y0 y1 . . ** (2) FINITE DIFFERENCE METHOD FOR SAMPLE AVERAGE MARGINAL EFFECT . . streg x, distribution(exponential) nohr /* y is dependent variable */ failure _d: 1 (meaning all fail) analysis time _t: y Iteration 0: log likelihood = -20754.005 Iteration 1: log likelihood = -17232.884 Iteration 2: log likelihood = -15760.556 Iteration 3: log likelihood = -15752.193 Iteration 4: log likelihood = -15752.19 Iteration 5: log likelihood = -15752.19 Exponential regression -- log relative-hazard form No. of subjects = 10000 Number of obs = 10000 No. of failures = 10000 Time at risk = 6194.352464 LR chi2(1) = 10003.63 Log likelihood = -15752.19 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ _t | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- x | -.9896276 .0098692 -100.27 0.000 -1.008971 -.9702842 _cons | 1.982921 .0141496 140.14 0.000 1.955188 2.010654 ------------------------------------------------------------------------------ . . * The following method can be used following many stata estimation commands . * 1. Predict y using sample data. . * Need to say predict the mean as this is not the streg default. . predict y0, mean time . * 2. Predict y with regressor of x increased by one . gen xoriginal = x . replace x = x+1 (10000 real changes made) . predict y1, mean time . replace x = xoriginal /* Put x back to initial value for later analysis */ (10000 real changes made) . * 3. Calculate difference . gen dEydxfinitedifference = y1 - y0 . quietly sum dEydxfinitedifference . scalar mesafd = r(mean) . di "Sample average marginal effect by first differences = " mesafd Sample average marginal effect by first differences = 1.0414485 . drop xoriginal y0 y1 . . ** (3) DERIVATIVE METHOD FOR MARGINAL EFFECT AT SAMPLE MEAN . . * (3A) Use Stata command mfx . quietly streg x, distribution(exponential) nohr . * Need to tell mfx to predict the mean as this is not the streg default. . mfx compute, dydx predict(mean time) Marginal effects after ereg y = predicted mean _t (predict, mean time) = .37563828 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- x | .371742 .00525 70.81 0.000 .361452 .382032 1.01431 ------------------------------------------------------------------------------ . di "Marginal effect by analytical derivative at mean of x using mfx: " Marginal effect by analytical derivative at mean of x using mfx: . matrix list e(Xmfx_dydx) symmetric e(Xmfx_dydx)[1,1] x r1 .371742 . . * (3B) Write ones own code . quietly streg x, distribution(exponential) nohr . quietly sum x . scalar meanx = r(mean) . scalar dEydxatmeanx = -_b[x]*exp(-_b[_cons] - _b[x]*meanx) . di "Marginal effect by analytical derivative at mean of x done manually: " Marginal effect by analytical derivative at mean of x done manually: . di dEydxatmeanx .371742 . . ** (4) MARGINAL EFFECTS AFTER ML COMMAND . . * Preceding (1) - (3) presume there is a built-in command to get MLE. . * Now consider ML estimation using Stata's ml command. . * After ml command cannot use predict or mfx. . * Need to be more manual, as follows. . . * Estimate model by ml: for details see mma0p1mle.do . program define mleexp0 1. version 8.0 2. args lnf theta /* Must use lnf while could use name other than theta */ 3. quietly replace `lnf' = `theta' - $ML_y1*exp(`theta') 4. end . quietly ml model lf mleexp0 (y = x) . quietly ml search . quietly ml maximize . . * Note that here the mean is in fact exp(-a-b*x) . . * (1A) Sample average marginal effect by calculus methods . gen mldEydxanalyticalderivative = -_b[x]*exp(-_b[_cons] - _b[x]*x) . quietly sum mldEydxanalyticalderivative . scalar mlmesaad = r(mean) . di "Sample average marginal effect by analytical derivative = " mlmesaad Sample average marginal effect by analytical derivative = .60976598 . . * (1B) Sample average marginal effect by numerical derivative . egen sdx = sd(x) . gen y0 = exp(-_b[_cons] - _b[x]*x) . gen xoriginal = x . replace x = x+0.0001*sdx (10000 real changes made) . gen y1 = exp(-_b[_cons] - _b[x]*x) . gen mldEydxnumericalderivative = (y1 - y0)/(0.0001*sdx) . quietly sum mldEydxnumericalderivative . scalar mlmesand = r(mean) . di "ML sample average marginal effect by numerical derivative = " mlmesand ML sample average marginal effect by numerical derivative = .60949063 . replace x = xoriginal (10000 real changes made) . drop xoriginal sdx y0 y1 . . * (2) Sample average marginal effect by increase x by one unit (finite difference) . gen mldEydxfinitedifference = exp(-_b[_cons]-_b[x]*(x+1)) - exp(-_b[_cons]-_b[x]*x) . quietly sum mldEydxfinitedifference . scalar mlmesafd = r(mean) . di "Sample average marginal effect by first differnce = " mlmesafd Sample average marginal effect by first differnce = 1.0414485 . . * (3) Marginal effect estimated at the sample mean of x . quietly sum x . scalar meanx = r(mean) . scalar mldEydxatmeanx = -_b[x]*exp(-_b[_cons] - _b[x]*meanx) . di "ML marginal effect at mean of x by analytical derivative: " ML marginal effect at mean of x by analytical derivative: . di mldEydxatmeanx .371742 . . ********** DISPLAY RESULTS on p.162-3 ********** . . di "Marginal Effects: (1A) Analytical deriv (1B) Numerical Deriv (2) First diff" Marginal Effects: (1A) Analytical deriv (1B) Numerical Deriv (2) First diff . sum dEydxfinitedifference dEydxanalyticalderivative dEydxnumericalderivative Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- dEydxfinit~e | 10000 1.041449 1.373144 .01325 32.59646 dEydxanaly~e | 10000 .609766 .8039727 .0077578 19.08516 dEydxnumer~e | 10000 .6094904 .8035654 .0077479 19.11325 . . di "KEY RESULTS FOR CHAPTER 5.9.4 pp.162-3 FOLLOW" KEY RESULTS FOR CHAPTER 5.9.4 pp.162-3 FOLLOW . di "(1A) Sample average marginal effect by analytical derivative = " mesaad (1A) Sample average marginal effect by analytical derivative = .60976598 . di "(1B) Sample average marginal effect by numerical derivative = " mesand (1B) Sample average marginal effect by numerical derivative = .60949044 . di "(2) Sample average marginal effect by first differences = " mesafd (2) Sample average marginal effect by first differences = 1.0414485 . di "(3) Marginal effect at mean of x by analytical derivative = " dEydxatmeanx (3) Marginal effect at mean of x by analytical derivative = .371742 . . ********** CLOSE OUTPUT ********** . log close log: c:\Imbook\bwebpage\Section2\mma05p4margeffects.txt log type: text closed on: 17 May 2005, 13:57:06 ----------------------------------------------------------------------------------------------------