Note: This FAQ is for Stata 10 and older versions of Stata. In Stata 11,
the **margins** command replaced **mfx**.

Title | Scaling and marginal effects | |

Author | May Boggess, StataCorp | |

Date | April 2004; updated September 2004; minor revisions September 2005 |

It means that **mfx** has
run into trouble, but it’s the kind of trouble you can usually fix quite
easily. Let’s look at an example:

. sysuse auto, clear(1978 Automobile Data). generate mpg2=mpg*mpg . mlogit rep78 mpg mpg2 turn, nologMultinomial logistic regression Number of obs = 69 LR chi2(12) = 44.42 Prob > chi2 = 0.0000 Log likelihood = -71.481648 Pseudo R2 = 0.2371 ------------------------------------------------------------------------------ rep78 | Coef. Std. Err. z P>|z| [95% Conf. Interval] -------------+---------------------------------------------------------------- 1 | mpg | 1.582486 2.374699 0.67 0.505 -3.071838 6.23681 mpg2 | -.0309519 .0553442 -0.56 0.576 -.1394246 .0775209 turn | .2116734 .3392475 0.62 0.533 -.4532395 .8765863 _cons | -30.37028 30.59297 -0.99 0.321 -90.3314 29.59083 -------------+---------------------------------------------------------------- 2 | mpg | .7890715 .824858 0.96 0.339 -.8276205 2.405763 mpg2 | -.0116654 .0198124 -0.59 0.556 -.050497 .0271663 turn | .4555263 .2210946 2.06 0.039 .0221889 .8888636 _cons | -31.30217 15.53334 -2.02 0.044 -61.74695 -.8573931 -------------+---------------------------------------------------------------- 4 | mpg | -.3924813 .6002901 -0.65 0.513 -1.569028 .7840657 mpg2 | .0089306 .0133784 0.67 0.504 -.0172906 .0351517 turn | -.1758045 .1274112 -1.38 0.168 -.4255259 .0739169 _cons | 10.59927 10.0245 1.06 0.290 -9.048393 30.24693 -------------+---------------------------------------------------------------- 5 | mpg | -3.074932 1.142964 -2.69 0.007 -5.3151 -.8347631 mpg2 | .0633047 .0234417 2.70 0.007 .0173599 .1092495 turn | -.757644 .2742985 -2.76 0.006 -1.295259 -.2200287 _cons | 62.32653 22.10485 2.82 0.005 19.00182 105.6512 ------------------------------------------------------------------------------ (rep78==3 is the base outcome). mfx, predict(p outcome(1)) varlist(mpg) tracelvl(1)calculating dydx (nonlinear method) ------------------------- variable | dy/dx ---------+--------------- mpg | .03299 ------------------------- calculating standard errors (nonlinear method) mpg ... continuous 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mpg: Std. Err. = .0247271 Marginal effects after mlogit y = Pr(rep78==1) (predict, p outcome(1)) = .01857657 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | .0329856 .02473 1.33 0.182 -.015479 .08145 21.2899 ------------------------------------------------------------------------------

So far, everything is looking OK. Let’s see if we can create a problem:

. sysuse auto, clear(1978 Automobile Data). replace mpg=mpg*100(74 real changes made). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 turn . mfx, predict(p outcome(1)) varlist(mpg)Marginal effects after mlogit y = Pr(rep78==1) (predict, p outcome(1)) = .01857657 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | .0003299 .00025 1.33 0.182 -.000155 .000814 2128.99 ------------------------------------------------------------------------------

It is still working OK. We can see the effect of dividing **mpg** by 100:
the marginal effect and its standard error are both divided by 100, which
means we get the same test statistic and *p*-value. This is all
reasonable. Let’s try a little harder:

. sysuse auto, clear(1978 Automobile Data). replace mpg=mpg*10000mpg was int now long (74 real changes made). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 turn . mfx, predict(p outcome(1)) varlist(mpg)Marginal effects after mlogit y = Pr(rep78==1) (predict, p outcome(1)) = .01857655 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | 3.30e-06 .00000 1.32 0.187 -1.6e-06 8.2e-06 212899 ------------------------------------------------------------------------------

The marginal effect and its standard error are both divided by 10,000, and the test statistic is almost the same. Let’s try once more:

. sysuse auto, clear(1978 Automobile Data). replace mpg=mpg*1000000000mpg was int now double (74 real changes made). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 turn . mfx, predict(p outcome(1)) varlist(mpg) tracelvl(1)calculating dydx (nonlinear method) ------------------------- variable | dy/dx ---------+--------------- mpg | 3.3e-11 ------------------------- calculating standard errors (nonlinear method) mpg ... continuous 1 warning: derivative missing; try rescaling variable mpg mpg: Std. Err. = . Marginal effects after mlogit y = Pr(rep78==1) (predict, p outcome(1)) = .01857659 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | 3.30e-11 . . . . . 2.1e+10 ------------------------------------------------------------------------------

Now, Stata is upset. If you run this example yourself, you will see that the
word “rescaling” is in blue, which means you can click it to
display a help file with an explanation of the warning. The message says
**mfx** suspects the variable **mpg** is the culprit.
Let’s try a slightly different scale and see what happens when we
calculate the marginal effect for **turn**:

. sysuse auto, clear(1978 Automobile Data). replace mpg=mpg*10000mpg was int now long (74 real changes made). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 turn . mfx, predict(p outcome(1)) varlist(turn) tracelvl(1)calculating dydx (nonlinear method) ------------------------- variable | dy/dx ---------+--------------- turn | .00507 ------------------------- calculating standard errors (nonlinear method) turn ... continuous 1 2 warning: derivative missing; try rescaling variable mpg2 turn: Std. Err. = . Marginal effects after mlogit y = Pr(rep78==1) (predict, p outcome(1)) = .01857655 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- turn | .005067 . . . . . 39.7971 ------------------------------------------------------------------------------

This time, **mpg** slipped through without a problem, but **mpg2** was
still troubled.

It is interesting to use the **tracelvl(3)** on the above command to see
how many iterations **mfx** is going through in its attempts to reach a
solution.

The lesson here is that the marginal effect depends on scale because a marginal effect is a derivative, which is a slope. Remember, in the easiest case of a straight line, the slope is the change in y for a one-unit change in x. If you change the scale of x (by multiplying or dividing it by a number), the slope will change accordingly.

Using **summarize**, you can check to see if any of your
variables are very, very small or very, very large. If so, you can really
make **mfx**’s job easier by multiplying or dividing the offending
variables appropriately.

This advice is worth remembering, even if you didn’t get the scale warning
message. **mfx** is pretty smart, but how do we know it can always
tell when it’s in trouble? When using the **tracelvl(3)** option, we can
see how much effort **mfx** had to put in to get the second derivatives.
Many iterations, together with the very, very small numbers in the results,
would be reason enough to check if rescaling would be appropriate. Then,
you can summarize your data before you run your model and rescale any poorly
scaled variables. Then, you can use option **tracelvl(3)** when running
**mfx** to watch for large numbers of iterations and very large or small
numbers coming up in the computation of the second derivative.

You may be wondering why **mfx** continued trying to calculate standard
errors after it had already figured out there was a scaling problem, since
in the previous example it couldn’t compute any standard errors at
all. Well, it is possible to only have trouble with some variables and not
with others. If you are interested in the marginal effect of only some of
the variables, it may not matter to you that it is having trouble at one of
the other variables.

Here’s an example that has trouble at only two variables:

. sysuse auto, clear(1978 Automobile Data). drop if rep78<=2(10 observations deleted). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 displacement . mfx, predict(p outcome(3))Marginal effects after mlogit y = Pr(rep78==3) (predict, p outcome(3)) = .52038591 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | .2610697 .19241 1.36 0.175 -.116047 .638186 21.5932 mpg2 | -.0058319 .00416 -1.40 0.161 -.013979 .002316 503.22 displa~t | .002884 .00189 1.53 0.126 -.000813 .006581 192.237 ------------------------------------------------------------------------------. sysuse auto, clear(1978 Automobile Data). drop if rep78<=2(10 observations deleted). replace mpg=mpg*10000mpg was int now long (64 real changes made). generate mpg2=mpg*mpg . quietly mlogit rep78 mpg mpg2 displacement . mfx, predict(p outcome(3))warning: derivative missing; try rescaling variable mpg warning: derivative missing; try rescaling variable mpg2 Marginal effects after mlogit y = Pr(rep78==3) (predict, p outcome(3)) = .52038589 ------------------------------------------------------------------------------ variable | dy/dx Std. Err. z P>|z| [ 95% C.I. ] X ---------+-------------------------------------------------------------------- mpg | .0000261 .00002 1.36 0.174 -.000012 .000064 215932 mpg2 | -5.83e-11 . . . . . 5.0e+10 displa~t | .002884 . . . . . 192.237 ------------------------------------------------------------------------------

Although the standard errors for **mpg2** and **displacement** cannot
be calculated, the test statistic and *p*-value for the variable
**mpg** are the same as the first time, which is what we wanted. Also,
the marginal effect and standard error of **mpg** are divided by 10,000,
as we would expect.