* Production Possibility Frontier

* Stata simulation and estimation

* This simulatoin estimates a production possibility frontier model

* while simultaneously estimating the effects of market power

* on productivity. It loosely models the paper by Saleem Shaik,

* Albert Allen, Seanicaa Edwards, and James Harris 2009

* "Market Structure Conduct Performance Hypothesis Revisited Using

* Stochastic Frontier Efficiency Analysis"

* v represents firm or time specific random errors

* u represents technical inefficiencies

* Performance(u)=f(X1)

* Output(Y2)=f(X2;B)+v-u

* We want to ask if performance u is explained by: market share and

* market concentration

* u = intercept + B1 mshare + B2 Mconc + e

* Y = intercept + A1 labor + A2 capital + v - u

* They model different firms in different industries which they

* hope have the same production structure but different market shares

* and market concentration.

* Set the random seed

set seed 101

* I simulate 10 firms in 7 different industries

clear

set obs 10

forv i=1/7 {

* Generate labels for each firm in each industry _# refers to the different

* industries

* Generate market shares using a beta distribution. The mean is about .1

* but it ranges from 0 to 1

gen share_`i' = rbeta(2,5)

* Create a measure of total market share

egen total_share_`i' = sum(share_`i')

* Standardize the shares so that they add up to 1

replace share_`i' = share_`i'/total_share_`i'

* Drop total share

drop total_share_*

* Order firms from largest to smallest

gsort -share_`i'

* Label the firms according to size

gen firm_`i'=_n

* Create concentration index CRM

gen CRM_`i' = sum(share_`i')

* But we will only use CR4

gen CR4_temp = CRM_`i' if firm_`i'==4

egen CR4_`i' = mean(CR4_temp)

drop CR4_temp

}

sum

* Now we want to create 1000 orders per firm

expand 1000

forv i=1/7 {

* Let's create vectors of input per observation

gen labor_`i'=runiform()*10

gen capital_`i'=runiform()*10

* Larger firms (share) tend to get larger contracts

qui replace labor_`i'=labor_`i'+6*share_`i'

qui replace capital_`i'=capital_`i'+6*share_`i'

* u is the half normal function plus some extra terms

* that Shaik uses. The argument is that larger firms (large share)

* are large because they are efficient but that high

* market concentration leads to greater inefficiency.

gen u_`i' = 1+abs(rnormal()*5) - 2*share_`i' + CR4_`i'

* v is normally distributed

gen v_`i' = rnormal()*20

* Now we are ready to formulate our production model

gen y_`i' = 5*labor_`i' + 5*capital_`i' + 10*((labor_`i')*(capital_`i'))^.75 - u_`i' + v_`i'

}

* Unfortunately our data is wide now when we want to use the xtfrontier command.

* So we will transform from wide to tall with the reshape command

* This is neccessary

gen obs_num = _n

reshape long share_ firm_ CRM_ CR4_ labor_ capital_ u_ v_ y_, i(obs_num) j(industry)

sort industry obs_num

* I will map out the production possibility frontier

xtile x_y= y, nquantiles(50)

xtile x_labor=labor, nquantiles(50)

xtile x_capital=capital, nquantiles(50)

foreach i in 5 10 15 20 25 30 35 40 45 {

bysort x_labor: egen min_labor_`i'=mean(labor) if x_y==`i'

bysort x_labor: egen min_capital_`i'=mean(capital) if x_y==`i'

gen min_capital_`i'2=min_capital_`i'^2

gen min_capital_`i'3=min_capital_`i'^3

gen min_capital_`i'4=min_capital_`i'^4

gen min_capital_`i'5=min_capital_`i'^5

qui reg min_labor_`i' min_capital_`i' min_capital_`i'2 ///

min_capital_`i'3 min_capital_`i'4 min_capital_`i'5

predict min_labor_fit_`i'

label var min_labor_fit_`i' "`=`i'*2'% percentile"

}

* Creates a noisy graph of production possibilities

twoway (line min_labor_20 min_capital_20) ///

(line min_labor_30 min_capital_30) ///

(line min_labor_40 min_capital_40) ///

, title(Production Possibility Frontier) ///

* A smoother graph is found by using the fitted values from the previous regression.

twoway (line min_labor_fit_5 min_capital_5, sort) ///

(line min_labor_fit_10 min_capital_10, sort) ///

(line min_labor_fit_15 min_capital_15, sort) ///

(line min_labor_fit_20 min_capital_20, sort) ///

(line min_labor_fit_25 min_capital_25, sort) ///

(line min_labor_fit_30 min_capital_30, sort) ///

(line min_labor_fit_35 min_capital_35, sort) ///

(line min_labor_fit_40 min_capital_40, sort) ///

(line min_labor_fit_45 min_capital_45, sort) ///

, title(Production Possibility Frontier) ///

* Now to remove the unneccessary _s from the variables

foreach v in share_ firm_ CRM_ CR4_ labor_ capital_ u_ v_ y_ {

* This command will find the first instance of _ in the `v' and replace it empty

local v_temp = subinstr("`v'","_","",1)

rename `v' `v_temp'

}

gen labor_capital = (labor*capital)^.75

* This is pretty similar to doing a single OLS regression:

reg y labor capital CR4 share

* This is pretty similar to doing a single OLS regression:

reg y labor capital labor_capital CR4 share

* However, you can see that the simultaneous equation estimate is able to get at what

* we are interested in, "How does market share and concentration predict performance?"

* The OLS regression is only trying to predict output which ends up with a weaker estimate.

* Set the different industries as the panel variable

xtset industry

* First step; I will estimate the production fontier model, with a max number of

* interations of 10.

xtfrontier y labor capital, ti iter(10)

xtfrontier y labor capital labor_capital, ti

* Stata simulation and estimation

* This simulatoin estimates a production possibility frontier model

* while simultaneously estimating the effects of market power

* on productivity. It loosely models the paper by Saleem Shaik,

* Albert Allen, Seanicaa Edwards, and James Harris 2009

* "Market Structure Conduct Performance Hypothesis Revisited Using

* Stochastic Frontier Efficiency Analysis"

* v represents firm or time specific random errors

* u represents technical inefficiencies

* Performance(u)=f(X1)

* Output(Y2)=f(X2;B)+v-u

* We want to ask if performance u is explained by: market share and

* market concentration

* u = intercept + B1 mshare + B2 Mconc + e

* Y = intercept + A1 labor + A2 capital + v - u

* They model different firms in different industries which they

* hope have the same production structure but different market shares

* and market concentration.

* Set the random seed

set seed 101

* I simulate 10 firms in 7 different industries

clear

set obs 10

forv i=1/7 {

* Generate labels for each firm in each industry _# refers to the different

* industries

* Generate market shares using a beta distribution. The mean is about .1

* but it ranges from 0 to 1

gen share_`i' = rbeta(2,5)

* Create a measure of total market share

egen total_share_`i' = sum(share_`i')

* Standardize the shares so that they add up to 1

replace share_`i' = share_`i'/total_share_`i'

* Drop total share

drop total_share_*

* Order firms from largest to smallest

gsort -share_`i'

* Label the firms according to size

gen firm_`i'=_n

* Create concentration index CRM

gen CRM_`i' = sum(share_`i')

* But we will only use CR4

gen CR4_temp = CRM_`i' if firm_`i'==4

egen CR4_`i' = mean(CR4_temp)

drop CR4_temp

}

sum

* Now we want to create 1000 orders per firm

expand 1000

forv i=1/7 {

* Let's create vectors of input per observation

gen labor_`i'=runiform()*10

gen capital_`i'=runiform()*10

* Larger firms (share) tend to get larger contracts

qui replace labor_`i'=labor_`i'+6*share_`i'

qui replace capital_`i'=capital_`i'+6*share_`i'

* u is the half normal function plus some extra terms

* that Shaik uses. The argument is that larger firms (large share)

* are large because they are efficient but that high

* market concentration leads to greater inefficiency.

gen u_`i' = 1+abs(rnormal()*5) - 2*share_`i' + CR4_`i'

* v is normally distributed

gen v_`i' = rnormal()*20

* Now we are ready to formulate our production model

gen y_`i' = 5*labor_`i' + 5*capital_`i' + 10*((labor_`i')*(capital_`i'))^.75 - u_`i' + v_`i'

}

* Unfortunately our data is wide now when we want to use the xtfrontier command.

* So we will transform from wide to tall with the reshape command

* This is neccessary

gen obs_num = _n

reshape long share_ firm_ CRM_ CR4_ labor_ capital_ u_ v_ y_, i(obs_num) j(industry)

sort industry obs_num

* I will map out the production possibility frontier

xtile x_y= y, nquantiles(50)

xtile x_labor=labor, nquantiles(50)

xtile x_capital=capital, nquantiles(50)

foreach i in 5 10 15 20 25 30 35 40 45 {

bysort x_labor: egen min_labor_`i'=mean(labor) if x_y==`i'

bysort x_labor: egen min_capital_`i'=mean(capital) if x_y==`i'

gen min_capital_`i'2=min_capital_`i'^2

gen min_capital_`i'3=min_capital_`i'^3

gen min_capital_`i'4=min_capital_`i'^4

gen min_capital_`i'5=min_capital_`i'^5

qui reg min_labor_`i' min_capital_`i' min_capital_`i'2 ///

min_capital_`i'3 min_capital_`i'4 min_capital_`i'5

predict min_labor_fit_`i'

label var min_labor_fit_`i' "`=`i'*2'% percentile"

}

* Creates a noisy graph of production possibilities

twoway (line min_labor_20 min_capital_20) ///

(line min_labor_30 min_capital_30) ///

(line min_labor_40 min_capital_40) ///

, title(Production Possibility Frontier) ///

* A smoother graph is found by using the fitted values from the previous regression.

twoway (line min_labor_fit_5 min_capital_5, sort) ///

(line min_labor_fit_10 min_capital_10, sort) ///

(line min_labor_fit_15 min_capital_15, sort) ///

(line min_labor_fit_20 min_capital_20, sort) ///

(line min_labor_fit_25 min_capital_25, sort) ///

(line min_labor_fit_30 min_capital_30, sort) ///

(line min_labor_fit_35 min_capital_35, sort) ///

(line min_labor_fit_40 min_capital_40, sort) ///

(line min_labor_fit_45 min_capital_45, sort) ///

, title(Production Possibility Frontier) ///

* Now to remove the unneccessary _s from the variables

foreach v in share_ firm_ CRM_ CR4_ labor_ capital_ u_ v_ y_ {

* This command will find the first instance of _ in the `v' and replace it empty

local v_temp = subinstr("`v'","_","",1)

rename `v' `v_temp'

}

gen labor_capital = (labor*capital)^.75

* This is pretty similar to doing a single OLS regression:

reg y labor capital CR4 share

* This is pretty similar to doing a single OLS regression:

reg y labor capital labor_capital CR4 share

* However, you can see that the simultaneous equation estimate is able to get at what

* we are interested in, "How does market share and concentration predict performance?"

* The OLS regression is only trying to predict output which ends up with a weaker estimate.

* Set the different industries as the panel variable

xtset industry

* First step; I will estimate the production fontier model, with a max number of

* interations of 10.

xtfrontier y labor capital, ti iter(10)

xtfrontier y labor capital labor_capital, ti

* I have not got this to work entirely the way I would like it to. I might return to this in the future.

informative post! Could you please continue?

ReplyDelete