* The Delta method can be used to estimate the standard errors after a regression estimation.
* Imagine you have some parameter G = (3*b0-b1)*b2^2 = 3*b0*b2^2-b1*b2^2
* Where y = bo + b1*x1 + b2*x2 + u
* The delta method can be used to estimate the standard errors of G.
* The delta method states that var_hat(G)=(dG/db) var(b) (dG/db)
* dG/db is a gradient vector:
* dG/db = [dG/db0, dG/db1, dG/db2]
* dG/db = [b2^2, -b2^2, 2*(b0-b1)*b2]
* var_hat(G) = (3*b2^2)^2 * se(b0)^-2 + (-b2^2)^2 * se(b1)^-2 + (2*(b0-b1)*b2)^2 * se(b2)^-2
[There is an error in the code because I failed to include a covariance term for the coefficients. Please see the more recent update on the method.]
clear
set obs 1000
gen x1 = rnormal()
gen x2 = rnormal() * 4
global b0 = 1
global b1 = 1.5
global b2 = .3
local true_G = (3*${b0}-${b1})*${b2}^2
di `true_G'
gen y = ${b0} + ${b1}*x1 + ${b2}*x2 + rnormal()*8
reg y x1 x2
* G = (3*b0-b1)*b2^2 = 3*b0*b2^2 - b1*b2^2
local Ghat = (3*_b[_cons]-_b[x1])*_b[x2]^2
di "Ghat = `Ghat' is our estimate (true = `true_G')"
* Let's see if we can't use the delta method to derive a standard error.
local var_hatG = (3*_b[x2]^2)^2 * _se[_cons]^2 + (-_b[x2]^2)^2 * _se[x1]^2 + (2*(_b[_cons]-_b[x1])*_b[x2])^2 * _se[x2]^2
di "Standard error estimate is " `var_hatG'^.5
* Alternatively, let us attempt to bootstrap our standard errors.
cap program drop deltaOLS
program define deltaOLS, rclass
reg y x1 x2
return scalar Ghat = (3*_b[_cons]-_b[x1])*_b[x2]^2
end
bs Ghat=r(Ghat), rep(500): deltaOLS
* The bootstrap standard errors are similar to that of the delta method's standard errors.
cap program drop deltaMonteCarlo
program define deltaMonteCarlo, rclass
clear
set obs 1000
gen x1 = rnormal()
gen x2 = rnormal() * 4
gen y = ${b0} + ${b1}*x1 + ${b2}*x2 + rnormal()*8
reg y x1 x2
return scalar Ghat = (3*_b[_cons]-_b[x1])*_b[x2]^2
end
simulate Ghat=r(Ghat), reps(500): deltaMonteCarlo
sum
* We can see that our estimates of the standard error via the Delta method and bootstap is quite close to the monte carlo estimates on observed standard errors from 500 replications.
i think you missed number 3 in the last part of dG/db: as following:
ReplyDeletedG/db = [b2^2, -b2^2, 2*(3b0-b1)*b2]