* 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