In Stata 11, the margins command replaced mfx.
Title | Marginal effects after estimations with offsets | |
Author | May Boggess, StataCorp |
The command mfx evaluates at the mean value of the offset. Let’s see how this works in an example:
. sysuse auto, clear (1978 Automobile Data) . probit foreign weight mpg, offset(turn) nolog Probit estimates Number of obs = 74 Wald chi2(2) = 440.82 Log likelihood = -130.53661 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ foreign | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- weight | -.008765 .0005981 -14.65 0.000 -.0099373 -.0075928 mpg | -.1921153 .0527769 -3.64 0.000 -.2955561 -.0886746 _cons | -10.73888 2.721338 -3.95 0.000 -16.0726 -5.405153 turn | (offset) ------------------------------------------------------------------------------ Note: 8 failures and 0 successes completely determined. . mfx, predict(p) Marginal effects after probit y = Pr(foreign) (predict, p) = .04973232 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- weight | -.0009001 .00031 -2.89 0.004 -.001511 -.00029 3019.46 mpg | -.0197293 .00802 -2.46 0.014 -.03544 -.004019 21.2973 turn | (offset) 39.6486 ------------------------------------------------------------------------------ . summarize turn Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- turn | 74 39.64865 4.399354 31 51 . replace turn=r(mean) turn was int now float (74 real changes made) . quietly summarize weight . quietly replace weight=r(mean) . quietly summarize mpg . quietly replace mpg=r(mean) . predict y, p . list y in 1 +----------+ | y | |----------| 1. | .0497323 | +----------+
In the above example, we demonstrated that the value y (above the table in the mfx output) is the value you obtain when you predict at the average values of the covariates and the average value of the offset. In the next example, we will go further and calculate the marginal effects of two dichotomous variables by hand:
. clear . set obs 50 obs was 0, now 50 . set seed 85642 . generate y=uniform()>0.5 . generate x1=uniform()>0.5 . generate x2=uniform()>0.5 . generate off=uniform()*30+50 . probit y x1 x2, offset(off) nolog Probit estimates Number of obs = 50 Wald chi2(2) = 58.13 Log likelihood = -286.69439 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ y | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- x1 | 3.081539 .4533974 6.80 0.000 2.192896 3.970181 x2 | -1.103905 .4571051 -2.41 0.016 -1.999815 -.2079954 _cons | -68.40088 .4041975 -169.23 0.000 -69.19309 -67.60867 off | (offset) ------------------------------------------------------------------------------ Note: 10 failures and 3 successes completely determined. . mfx, predict(p) Marginal effects after probit y = Pr(y) (predict, p) = .08459144 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- x1*| .6777208 .11014 6.15 0.000 .461848 .893594 .4 x2*| -.1832137 .09128 -2.01 0.045 -.362116 -.004311 .52 off | (offset) 66.3675 ------------------------------------------------------------------------------ (*) dy/dx is for discrete change of dummy variable from 0 to 1 . summarize off Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- off | 50 66.36746 8.437674 50.19214 79.75008 . replace off=r(mean) (50 real changes made) . quietly { . summarize x1 . local mean1=r(mean) . summarize x2 . local mean2=r(mean) . replace x1=`mean1' . replace x2=`mean2' . predict p, p . noisily display _n "y = " p _n y = .08459145 . replace x1=0 . predict p0,p . replace x1=1 . predict p1, p . noisily display _n "marginal effect x1 = " p1-p0 _n marginal effect x1 = .67772082 . drop p1 p0 . replace x1=`mean1' . replace x2=0 . predict p0,p . replace x2=1 . predict p1, p . noisily display _n "marginal effect x2 = " p1-p0 marginal effect x2 = -.18321373 . }
The above example gives you the idea of what to do if you want to evaluate marginal effects at a value of the offset that is not the mean. You can replace the offset by the value you want before running mfx, as follows:
. sysuse auto, clear (1978 Automobile Data) . replace weight=weight/1000 weight was int now float (74 real changes made) . probit foreign weight length, offset(turn) nolog Probit estimates Number of obs = 74 Wald chi2(2) = 511.38 Log likelihood = -129.03886 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ foreign | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- weight | -3.277497 .8475066 -3.87 0.000 -4.938579 -1.616414 length | -.1330356 .0294001 -4.52 0.000 -.1906588 -.0754124 _cons | -5.978285 3.276507 -1.82 0.068 -12.40012 .4435497 turn | (offset) ------------------------------------------------------------------------------ Note: 1 failure and 0 successes completely determined. . mfx, predict(p) Marginal effects after probit y = Pr(foreign) (predict, p) = .10979816 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- weight | -.6154742 .19077 -3.23 0.001 -.989375 -.241573 3.01946 length | -.0249825 .00869 -2.87 0.004 -.042023 -.007942 187.932 turn | (offset) 39.6486 ------------------------------------------------------------------------------ . replace turn=41 (70 real changes made) . mfx, predict(p) Marginal effects after probit y = Pr(foreign) (predict, p) = .54924357 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- weight | -1.297558 .34523 -3.76 0.000 -1.9742 -.620918 3.01946 length | -.0526687 .01159 -4.54 0.000 -.075384 -.029954 187.932 turn | (offset) 41 ------------------------------------------------------------------------------
If you have used exposure() rather than offset(), then mfx will evaluate at the exp(average of ln(exposure)). For example,
. webuse airline, clear . poisson injur XYZ, exposure(n) nolog Poisson regression Number of obs = 9 LR chi2(1) = 1.77 Prob > chi2 = 0.1836 Log likelihood = -23.027177 Pseudo R2 = 0.0370 ------------------------------------------------------------------------------ injuries | Coef. Std. Err. z p>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- XYZowned | .3808084 .2780192 1.37 0.171 -.1640993 .9257161 _cons | 4.061204 .147442 27.54 0.000 3.772223 4.350185 n | (exposure) ------------------------------------------------------------------------------ . mfx, predict(n) Marginal effects after poisson y = predicted number of events (predict, n) = 6.4864947 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z p>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- XYZowned*| 2.647899 2.14322 1.24 0.217 -1.55274 6.84854 .333333 ln(n) | (offset) -2.31842 ------------------------------------------------------------------------------ (*) dy/dx is for discrete change of dummy variable from 0 to 1 . generate offset=ln(n) . summarize offset Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- offset | 9 -2.318418 .5339422 -2.98975 -1.571179 . replace n=exp(r(mean)) (9 real changes made) . replace XYZ=0 (3 real changes made) . predict n0, n . replace XYZ=1 (9 real changes made) . predict n1, n . display _n "marginal effect XYZ = " n1-n0 marginal effect XYZ = 2.6478992
Some multiple-equation estimators allow more than one offset. Let's look at an example using hetprob. First, we will create some data and run the model:
. clear . set obs 1000 obs was 0, now 1000 . set seed 1234567 . generate x = 1-2*uniform() . generate xhet=uniform() . generate sigma=exp(1.5*xhet) . generate p=normal((0.3+2*x)/sigma) . generate y = cond(uniform()<=p,1,0) . generate off1=uniform()+0.5 . generate off2=uniform()+0.6 . hetprob y x, het(xhet, offset(off2)) offset(off1) nolog Heteroskedastic probit model Number of obs = 1000 Zero outcomes = 452 Nonzero outcomes = 548 Wald chi2(1) = 79.18 Log likelihood = -576.5979 Prob > chi2 = 0.0000 ------------------------------------------------------------------------------ y | Coef. Std. Err. z p>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- y | x | 6.658445 .7482918 8.90 0.000 5.19182 8.12507 _cons | -.3720305 .2473793 -1.50 0.133 -.856885 .1128241 off1 | (offset) -------------+---------------------------------------------------------------- lnsigma2 | xhet | 1.724798 .2680221 6.44 0.000 1.199484 2.250112 off2 | (offset) ------------------------------------------------------------------------------ Likelihood-ratio test of lnsigma2=0: chi2(1) = 101.70 Prob > chi2 = 0.0000
Now we will run mfx with the predict(xb) option, which is the linear predictor from the first equation:
. mfx, predict(xb) Marginal effects after hetprob y = Linear prediction (predict, xb) = .76705778 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z p>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- x | 6.658445 .74829 8.90 0.000 5.19182 8.12507 .020114 xhet | 0 0 . . 0 0 .502716 off1 | (offset1) 1.00516 off2 | (offset2) 1.09709 ------------------------------------------------------------------------------ . summarize x if e(sample) Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- x | 1000 .0201138 .5846345 -.9999619 .9977288 . scalar meanx=r(mean) . summarize off1 if e(sample) Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- off1 | 1000 1.005162 .2875233 .5014016 1.497421 . scalar meanoff1=r(mean) . display _n "pred xb = " meanx*_b[x]+_b[_cons] + meanoff1 pred xb = .76705774
Let’s finish with a more complicated prediction option. By differentiating the formula for the probability of success, we can verify that mfx is correctly calculating the marginal effect. The formula for the probability of success is in [R] hetprob:
meanx*_b[x]+_b[_cons] + meanoff1 p = normal( ------------------------------------------ ) exp(meanxhet*_b[lnsigma2:xhet] + meanoff2)
where normal() is the cumulative distribution function for the standard normal distribution. The derivative is
dp _b[x] -- = ------------------------------------------ dx exp(meanxhet*_b[lnsigma2:xhet] + meanoff2) meanx*_b[x]+_b[_cons] + meanoff1 * normalden( ------------------------------------------ ) exp(meanxhet*_b[lnsigma2:xhet] + meanoff2)
where normalden() is the probability density function for the standard normal distribution. Let’s use these formulas to check mfx:
. mfx, predict(p) Marginal effects after hetprob y = Pr(y) (predict, p) = .54284206 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z p>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- x | .3704576 .03237 11.44 0.000 .307015 .4339 .020114 xhet | -.0736092 .02423 -3.04 0.002 -.121095 -.026124 .502716 off1 | (offset1) 1.00516 off2 | (offset2) 1.09709 ------------------------------------------------------------------------------ . summarize xhet if e(sample) Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- xhet | 1000 .5027165 .2938006 .0004071 .9983656 . scalar meanxhet=r(mean) . summarize off2 if e(sample) Variable | Obs Mean Std. Dev. Min Max -------------+-------------------------------------------------------- off2 | 1000 1.097091 .2822951 .6011194 1.597888 . scalar meanoff2=r(mean) . scalar predy=normal((meanx*_b[x]+_b[_cons] + > meanoff1)/exp(_b[lnsigma2:xhet]*meanxhet +meanoff2)) . display _n "pred y = " predy pred y = .54284206 . scalar dpdx=_b[x]*normalden((meanx*_b[x]+_b[_cons] + > meanoff1)/exp(_b[lnsigma2:xhet]*meanx > het +meanoff2))/exp(_b[lnsigma2:xhet]*meanxhet +meanoff2) . display _n "dpdx = " dpdx dpdx = .37045757