* Estimating demand (AIDS) - Part

* Stata simulation and estimation

* v=max{x,y}{x^a * y^b * z^c} s.t. (W=xPx + yPy + zPz)

* since ln is monotonic and increasing this is the same as:

* max{x,y}{a*ln(x)+b*ln(y)+c*ln(z)} s.t. (W=xPx + yPy + zPz)

* L=a*ln(x)+b*ln(y)+c*ln(y) M(W>=xPx + yPy + zPz)

* Lx:= a/x + M*Px=0

* Ly:= b/y + M*Py=0

* Lz:= c/z + M*Pz=0

* LM:= W-(xPx + yPy + zPz)=0

* a/xPx = -M

* b/yPy = -M

* c/zPz = -M

* a/xPx = b/yPy

* xPx/a = yPy/b

* xPx = ayPy/b

* zPz = cyPy/b

* W-(ayPy/b + yPy + cyPy/b) = 0

* W-(a/b + 1 + c/b)yPy = 0

* W-(a/b + b/b + c/b)yPy = 0

* W = ((a+b+c)/b)yPy

* y = W*b/(Py*(a+b+c))

* x = W*a/(Px*(a+b+c))

* z = W*c/(Pz*(a+b+c))

* y = W/(Py(a/b + 1))

* because we know the solutions are symetic

* x = W/(Px(b/a + 1))

clear

* so Let's start the simulation

* Say we have a cross section with 1000 cities

set seed 101

set obs 10000

* first let us set the parameters a and b, these are not observable

gen a = .3

gen b = .4

gen c = .05

* each city faces a different price. the .5 is so that no city

* gets a price too close to zero.

gen Px=runiform()*4.2+3

gen Py=runiform()*4.5+1

gen Pz=runiform()*4.2+2

* each city has a different level of wealth

gen W=runiform()*5+1

* Lets generate the errors in X. We want the errors to be correlated

* which can be gotten at by a little trick but I also wanted the errors

* to be inform. Unfortunately adding together 2 uniform distributions

* will make another uniform distribution

gen rv1=runiform()

gen rv2=runiform()

gen rv3=runiform()

* The correlation between the variables is

gl rho12 = .5

gen v1=(rv1)*5.3

gen v2=(rv1*$rho12 + rv2*(1-$rho12)^.5)*.3

gen v3=(rv1*$rho12 + rv3*(1-$rho12)^.5)*.3

corr v1 v2

* Not quite perfect but a good approximation

* Now let's generate consumption level

gen y = W/Py *b/(a+b+c) + v1

label var y "Food"

gen x = W/Px *a/(a+b+c) + v2

label var x "Entertainment"

gen z = W/Pz *c/(a+b+c) + v3

label var z "Unobserved Remitances"

* Adjust wealth to reflect true wealth

replace W = y*Py + x*Px + z*Pz

sum x y

************************************************************

* simulation END

************************************************************

* One of the difficulties (and strengths) in estimating from simulations is that

* you don't always know when an estimator is performing correctly.

* For instance if we want to estimate demand response to change in price

* dy/dPy then due to the non-linear nature of real demand functions

* the most straightforward regressions are going to give us some funky estimates.

* For example:

reg y W Py

local dydW=_b[W]

local dydPy=_b[Py]

predict y_hat

label var y_hat "OLS fitted values"

* Everything looks good but what does it mean?

* The true effect of dy/dW is

* dy/dW=1/Py *b/(a+b+c)

sum Py

gen b_abc=b/((a+b+c)*r(mean))

sum b_abc

di "So and estimate of `dydW' is looking pretty close to " r(mean)

* This is expected because y is linear in W.

* {remember y = W*b/(Py*(a+b+c)) = (Py^-1) * W * b/(a+b+c) }

* However, check out what happens when you take dy/dPy

* dy/dPy = (-1)*(Py^-2) * W * b/(a+b+c)

gen dydPy_true = (-1)*(Py^-2) * W * b/(a+b+c)

sum dydPy_true

di "The estimate of `dydPy' is looking pretty close to " r(mean) " as well"

* We can see that the OLS estimate is biased upwards because E(d g(y)/dPy)) > g(E(dy/dPy))

* when g is convex (Jensen's inequality). However, the degree of the bias is not

* so large as to make us worry.

* An alternative approach which is rather appealing is taking the log of everything

* ln(y) = By1 ln(W) - By2 ln(Py) + ln(b/(a+b+c))

* ln(x) = Bx1 ln(W) - Bx2 ln(Px) + ln(a/(a+b+c))

gen lny=ln(y)

gen lnx=ln(x)

gen lnW=ln(W)

gen lnPy=ln(Py)

gen lnPx=ln(Px)

* This really not so useful with the Cobb-Douglas. However, it does give us a method of checking

* if we think our demand function is Cobb-Douglas:

reg lny lnW lnPy

* We might attempt to use the constants to get a grasp of the consumer parameters

* ln(b/(a+b+c)) = `b_abc', b/(a+b+c) = exp(`b_abc')

di exp(_b[_cons])

sum b_abc

predict lny_hat

gen y_ln_exp_hat = exp(lny_hat)

label var y_ln_exp_hat "OLS fitted values form Log regression"

two (line y Py, sort) (line y_hat Py, sort color(blue) ) (line y_ln_exp_hat Py, sort color(red))

reg lnx lnW lnPx

local a_abc=_b[_cons]

predict lnx_hat

gen x_ln_exp_hat = exp(lnx_hat)

* If there was no bias in the estimates then we expect By1 = By2 = Bx1 = Bx2 =1

* But the ln function is concave therefore our estimates will be downward biased by

* Jensen's inequality. In this case all of the estimates seem to be biased by at least 50%

*******************************************************************************************

* So in practice what do people do?

* A common model is the AIDS (Almost Ideal Demand System) to estimate share of demand as

* a function of price and expenditure

* Lets see how it performs at estimating the expenditure function (assume we know z and Pz)

* First LAI

* generate share values

gen sy = Py*y/W

label var sy "Share of expenditures on y"

gen sx = Px*x/W

gen sz = Pz*z/W

sum s*

gen lnPz = ln(Pz)

* Then generate lnP, the price index (P)

gen lnP = sx*lnPx + sy*lnPy + sz*lnPz

* Not let's generate the Beta term

gen lnW_P = ln(W)-lnP

* So to estimate AIDS, which is share as a function of price

reg sx lnPx lnPy lnPz lnW_P

predict sx_hat

reg sy lnPx lnPy lnPz lnW_P

predict sy_hat

label var sy_hat "y hat from AIDS"

reg sz lnPx lnPy lnPz lnW_P

predict sz_hat

two (line sy Py, sort) (line sy_hat Py, sort)

* It seems the AIDS model fits pretty well.

## No comments:

## Post a Comment