First I will give an example where I seem to obtain correct results. Consider the diabetes data from Stata:
Code:
webuse nhanes2f, clear
diabetes = F(b0 + b1*age + b2*female + b3*(female*age))
where F is the standard normal CDF.
The marginal effect of age for male should be
F'(b0+b1+b2+b3)(b1)
and the marginal effect of age for female should be
F'(b0+b1+b2+b3)(b1+b3)
where F' is the standard normal PDF.
After running the regression:
Code:
qui probit diabetes i.female##c.age
Code:
predict phat if e(sample), xb gen index = normalden(phat) gen dydx_age_male = index*(_b[age]) if female == 0 gen dydx_age_female = index*(_b[age] + _b[1.female#c.age]) if female == 1
Code:
. sum dydx_age_male dydx_age_female
Variable | Obs Mean Std. Dev. Min Max
-------------+---------------------------------------------------------
dydx_age_m~e | 4,909 .002704 .002162 .0002435 .0070914
dydx_age_f~e | 5,426 .0023238 .001393 .0005265 .0048638
Code:
. margins, dydx(age) at(female = (0 1))
Average marginal effects Number of obs = 10,335
Model VCE : OIM
Expression : Pr(diabetes), predict()
dy/dx w.r.t. : age
1._at : female = 0
2._at : female = 1
------------------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
age |
_at |
1 | .002729 .0002578 10.59 0.000 .0022237 .0032342
2 | .0023102 .0002168 10.66 0.000 .0018853 .002735
------------------------------------------------------------------------------
But when I try the same approach with a similar model on different data set, I get very wrong answers:
Code:
sysuse auto, clear
gen mpg_discrete = cond(mpg > 25, 1, 0) // make up a binary variable
qui probit mpg_discrete i.foreign##c.gear_ratio
predict phat if e(sample), xb
gen index = normalden(phat)
gen dydx_gear_ratio_domestic = index*(_b[gear_ratio]) if foreign == 0
gen dydx_gear_ratio_foreign = index*(_b[gear_ratio] + _b[1.foreign#c.gear_ratio]) if foreign == 1
. sum dydx_gear_ratio_domestic dydx_gear_ratio_foreign
Variable | Obs Mean Std. Dev. Min Max
-------------+---------------------------------------------------------
dydx_gear_~c | 52 .3923934 .2875949 .0146149 .9461553
dydx_gear_~n | 22 .3982511 .0766482 .2494647 .4690799
. margins, dydx(gear_ratio) at(foreign=(0 1))
Average marginal effects Number of obs = 74
Model VCE : OIM
Expression : Pr(mpg_discrete), predict()
dy/dx w.r.t. : gear_ratio
1._at : foreign = 0
2._at : foreign = 1
------------------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
gear_ratio |
_at |
1 | .4946714 .103051 4.80 0.000 .2926952 .6966477
2 | .2608279 .1207171 2.16 0.031 .0242268 .497429
------------------------------------------------------------------------------
I must be doing something wrong, but I can't figure out what exactly.
Furthermore, I am confused now as to what Stata is calculating when levels of the dummy are not specified to margins. For instance, going back to the first model, if you run
Code:
. margins, dydx(age)
Average marginal effects Number of obs = 10,335
Model VCE : OIM
Expression : Pr(diabetes), predict()
dy/dx w.r.t. : age
------------------------------------------------------------------------------
| Delta-method
| dy/dx Std. Err. z P>|z| [95% Conf. Interval]
-------------+----------------------------------------------------------------
age | .0025044 .0001667 15.02 0.000 .0021777 .0028311
------------------------------------------------------------------------------
No comments:
Post a Comment