▼
Friday, May 25, 2012
Estimating Random Coefficients in a panel data
* Imagine that you are concerned that each of your individual panel blocks has a unique random coefficient.
* This might be reasonable if say you are wondering what the effect on employment will be if you increase the federal minimum wage.
* States that already have a minimum wage is higher than the expected increase will probably not find much change while states that are much below the intended increase might find a large change.
* Note that if you define your x variable reasonably well in this case you might not even worry about random coefficients.
* Let us start by setting up the simulation.
clear
set seed 11
set obs 50
* Generate 50 states
gen state=_n
* Now let us speficy a random number of observations per state
gen nobs = rpoisson(15)*4
* Now lets specify a random coefficient per state for the policy change.
gen b=-1+rnormal()
* Now let's expand our sample
expand nobs
gen x=rnormal()*3 + 10
gen y= b*x + rnormal()*3
* Some states have 1 observation while others have 12
* In Econometrics terms this is what we are worrying about:
* Y=Xb + e e is a random variable
* b = B + u u is a random variable
* Therefore:
* Y=X(B+u) + e
* Y=XB + Xu + e
* Y=XB + v ; v=(Xu + e)
xtmixed y x || state: x, nocon
reg y x
* We can see that both xtmixed and normal OLS work pretty well.
* This is primarily because v is uncorrelated with x
* Image now that b is correlated.
gen b2=-1+rnormal()*2+x-10
sum b2
* b2 still has an average effect of -1
gen y2= b2*x + rnormal()*3
reg y2 x
* We can see that OLS is biased positively because:
corr b2 x
xtmixed y2 x || state: x, nocon
* xtmixed does seems to improve the outcome because xtmixed state: x allows v to be correlation with x.
* However let's test this theory with a Monte Carlo estiamtion:
* First we need to define a program for stata to repeat
cap program drop xtmixed_monte_carlo
program define xtmixed_monte_carlo, rclass
clear
* remove the set see option
set obs 50
* Generate 50 states
gen state=_n
* Now let us speficy a random number of observations per state
gen nobs = rpoisson(15)*4
* Now lets specify a random coefficient per state for the policy change.
gen b=-1+rnormal()
* Now let's expand our sample
expand nobs
gen x=rnormal()*3 + 10
gen y= b*x + rnormal()*3
* Some states have 1 observation while others have 12
* In Econometrics terms this is what we are worrying about:
* Y=Xb + e e is a random variable
* b = B + u u is a random variable
* Therefore:
* Y=X(B+u) + e
* Y=XB + Xu + e
* Y=XB + v ; v=(Xu + e)
xtmixed y x || state: x, nocon
* Now we define a return command that will return the cofficients of interest.
return scalar XTM1 = _b[x]
reg y x
* Now we define a return command that will return the cofficients of interest.
return scalar OLS1 = _b[x]
* We can see that both xtmixed and normal OLS work pretty well.
* This is primarily because v is uncorrelated with x
* Imagine now that b is correlated.
gen b2=-1+rnormal()*2+(x-10)
sum b2
* b2 still has an average effect of -1
gen y2= b2*x + rnormal()*3
reg y2 x
* We can see that OLS is biased positively because:
* Now we define a return command that will return the cofficients of interest.
return scalar OLS2 = _b[x]
corr b2 x
xtmixed y x || x: R.state, nocon
* Now we define a return command that will return the cofficients of interest.
return scalar XTM2 = _b[x]
end
xtmixed_monte_carlo
* We can see the coefficient estimates of our first simulation run.
* This might take a little while. This command will replate the entire simulation 50 times with the estimates as well.
simulate OLS1=r(OLS1) OLS2=r(OLS2) XTM1=r(XTM1) XTM2=r(XTM2), reps(50): xtmixed_monte_carlo
sum
* We can see that clearly OLS and Xtmixed are both biased because of the correlation between u and x.
* However, they appear to work quite well at identifying the average coefficient when the correlation does not work.
* What xtmixed helps do is to identify the variance of u as well.
simulate OLS1=r(OLS1) OLS2=r(OLS2) XTM1=r(XTM1) XTM2=r(XTM2), reps(500): xtmixed_monte_carlo
No comments:
Post a Comment