# libraries
## Needed packages
packages <- c("tidyverse",
              "JuliaCall",
              "magrittr",
              "broom",
              "car")
## check for not installed packages and install them
not_installed <- packages[!(packages %in% installed.packages())]
### check if not_installed is not empty
if( length(not_installed) != 0 )
install.packages(not_installed, dependencies = TRUE)
## load all needed packages
lapply(packages, function(x) library(x, character.only = TRUE))
# knitr options
knitr::opts_chunk$set(fig.pos = 'H', out.extra = '')
knitr::opts_chunk$set(echo = TRUE)
knitr::opts_chunk$set(out.width = '75%', fig.align = 'center' ) 
knitr::opts_chunk$set(comment=NA)

Problem 3

The inverse demand is given by:

\[ P = a_0 -a_1Q + \nu \qquad(1)\]

While the total costs of firms is given by:

\[ C = (b_0-b_1Q+\eta)Q + F \qquad(2)\]

a

To calculate the elasticity of demand, we simply take the logarithm of price (\(P>0\) is assumed) and then take the derivative. The result would be as bellow:

\[ \frac{1}{P} = \frac{-a_1Q'}{a_0 - a_1Q + \nu} \]

Therefore, elasticity is:

\[ \mathcal{E} = - \frac{a_0 -a_1Q + \nu}{a_1Q} \qquad(3)\]

From the above expression, we can see that an increase in \(\nu\) increases the absolute value of \(\mathcal{E}\). An increase in Q in the equivalent expression of \(\mathcal{E} = -(-1 +\frac{a_0+\nu}{a_1 Q})\) results in the decrease of \(\mathcal{E}\). This corresponds to our understanding of linear demand where somewhere in the middle of the curve \(|\mathcal{E}| = 1\) while for smaller Q we have \(|\mathcal{E}| > 1\) and for larger Q, the demand is inelastic.

b

In the Cournot case, the problem of the firm is as such:

\[ \pi_i(q_i,q_{-i}) = P(Q)q_i -C(q_i) \] Where

\[ Q = \sum_{i=1}^n q_i \qquad(4)\]

The first order condition is:

\[ \frac{\partial\pi_i}{\partial q_i} = \frac{dP(Q)}{dQ}\frac{\partial Q(\vec{q})}{\partial q_i}q_i + P(Q) - \frac{d C(q_i)}{d q_i} \qquad(5)\]

From eq. 4, we have that \(\frac{\partial Q}{\partial q_i} = 1\). Therefore:

\[ \frac{\partial\pi_i}{\partial q_i} = - a_1q_i + (a_0 - a_1Q + \nu) - (- 2b_1q+(b_0+\eta)) =0 \qquad(6)\]

In Cournot, we have symmetry and \(Q=Nq\). We can therefore obtain the optimal choice of \(q\) for firm \(i\) in a Cournot competition given the previous functional forms:

\[ q^* = \frac{(a_0-b_0)+(\nu-\eta)}{(N+1)a_1-2b_1} \qquad(7)\]

c and d

To find the number of firms entering the market, we need to set \(\pi\) to zero which gives us the value for \(N\).

Code

# [Juila Code]

using SymPy

# initial variables

P, a_0, a_1, ν, Q, C, η, F, b_0, b_1, N, q, π = 
    symbols("P, a_0, a_1, ν, Q, C, η, F, b_0, b_1, N, q, π");

q = ( (a_0-b_0)+(ν-η) )/( a_1*(N+1)-2*b_1);

Q = N*q;

P = a_0 - a_1*Q + ν;

C = (b_0 - b_1*q + η)*q + F;

π = P*q - C; 

# substitute b_1 = 0

π = subs(π,b_1,0); 
simplify(π);

show(stdout, "text/latex", π)

\[\begin{equation*}- F - \frac{\left(b_{0} + η\right) \left(a_{0} - b_{0} - η + ν\right)}{a_{1} \left(N + 1\right)} + \frac{\left(- \frac{N \left(a_{0} - b_{0} - η + ν\right)}{N + 1} + a_{0} + ν\right) \left(a_{0} - b_{0} - η + ν\right)}{a_{1} \left(N + 1\right)}\end{equation*}\]


# solve for n in profit equal to zero.

N_s1, N_s2 = symbols("N_s1, N_s2");

N_s1 = solve(π,N)[1]; 
N_s1 = simplify(N_s1);
N_s2 = solve(π,N)[2]; 
N_s2 = simplify(N_s2);

show(stdout, "text/latex", N_s1)

\[\begin{equation*}\frac{- F a_{1} + a_{0} \sqrt{F a_{1}} - b_{0} \sqrt{F a_{1}} - η \sqrt{F a_{1}} + ν \sqrt{F a_{1}}}{F a_{1}}\end{equation*}\]

show(stdout, "text/latex", N_s2)

\[\begin{equation*}\frac{- F a_{1} - a_{0} \sqrt{F a_{1}} + b_{0} \sqrt{F a_{1}} + η \sqrt{F a_{1}} - ν \sqrt{F a_{1}}}{F a_{1}}\end{equation*}\]


## substitute expressions


### Set b_1 to zero and N to N_star.

P = subs(P,b_1,0); 
P = subs(P,N,N_s1); 
P = simplify(P);

show(stdout, "text/latex", P)

\[\begin{equation*}\frac{F a_{1}}{\sqrt{F a_{1}}} + b_{0} + η\end{equation*}\]


# Lerner index

Lerner, MC = symbols("Lerner, MC");

MC = b_0 + η;

Lerner = (P-MC)/(P); 
Lerner = simplify(Lerner);

show(stdout, "text/latex", Lerner)

\[\begin{equation*}\frac{F a_{1}}{F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)}\end{equation*}\]


# Herfindahl index

Herfindahl = 1/N_s1; 
Herfindahl = collect(Herfindahl,sqrt(F*a_1));

show(stdout, "text/latex", Herfindahl)

\[\begin{equation*}\frac{F a_{1}}{- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)}\end{equation*}\]


# elasticity

elasticity = (-1/a_1)*(P/Q);

elasticity = subs(elasticity,N,N_s1); 
elasticity = subs(elasticity,b_1,0);
elasticity = simplify(elasticity);
elasticity = collect(elasticity,sqrt(F*a_1));

show(stdout, "text/latex", elasticity)

\[\begin{equation*}\frac{F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)}{F a_{1} + \sqrt{F a_{1}} \left(- a_{0} + b_{0} + η - ν\right)}\end{equation*}\]


# L'/L and H'/H

rate_F_Lerner = diff(Lerner,F)/Lerner;
rate_F_Herfindahl = diff(Herfindahl,F)/Herfindahl;

show(stdout, "text/latex", rate_F_Lerner)

\[\begin{equation*}\frac{\left(F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)\right) \left(\frac{F a_{1} \left(- a_{1} - \frac{\sqrt{F a_{1}} \left(b_{0} + η\right)}{2 F}\right)}{\left(F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)\right)^{2}} + \frac{a_{1}}{F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)}\right)}{F a_{1}}\end{equation*}\]

show(stdout, "text/latex", rate_F_Herfindahl)

\[\begin{equation*}\frac{\left(- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)\right) \left(\frac{F a_{1} \left(a_{1} - \frac{\sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)}{2 F}\right)}{\left(- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)\right)^{2}} + \frac{a_{1}}{- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)}\right)}{F a_{1}}\end{equation*}\]


rate_nu_Lerner = diff(Lerner,ν)/Lerner;
rate_nu_Herfindahl = diff(Herfindahl,ν)/Herfindahl;

show(stdout, "text/latex", rate_nu_Lerner)

\[\begin{equation*}0\end{equation*}\]

show(stdout, "text/latex", rate_nu_Herfindahl)

\[\begin{equation*}- \frac{\sqrt{F a_{1}}}{- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)}\end{equation*}\]


rate_eta_Lerner = diff(Lerner,η)/Lerner;
rate_eta_Herfindahl = diff(Herfindahl,η)/Herfindahl;

show(stdout, "text/latex", rate_eta_Lerner)

\[\begin{equation*}- \frac{\sqrt{F a_{1}}}{F a_{1} + \sqrt{F a_{1}} \left(b_{0} + η\right)}\end{equation*}\]

show(stdout, "text/latex", rate_eta_Herfindahl)

\[\begin{equation*}\frac{\sqrt{F a_{1}}}{- F a_{1} + \sqrt{F a_{1}} \left(a_{0} - b_{0} - η + ν\right)}\end{equation*}\]


Results

The second result for \(N^*\) is not valid because then \(q_i\) will become negative. Therefore, the value for N is:

\[ N^* = \frac{(a_0-b_0)+(\nu-\eta)}{\sqrt{F a_1}} -1 \qquad(8)\]

Therefore, price is given by:

\[ P^* = (b_0+\eta) + \sqrt{F a_1} \qquad(9)\]

The Lerner index is therefore:

\[ LI = \frac{\sqrt{F a_1}}{(b_0+\eta)+\sqrt{F a_1}} \qquad(10)\]

The Herfindahl index, given by \(R_H = \sum_{i=1}^{N}\alpha_i^2\) considering the symmetry, \(\frac{q}{Q}=\frac{1}{N}\) it is only equal to \(\sum_{i=1}^{N}\frac{1}{N^2}\). That is, \(R_H = \frac{1}{N}\):

\[ R_H = \frac{\sqrt{F a_1}}{(a_0-b_0)+(\nu-\eta)-\sqrt{F a_1}} \qquad(11)\]

The elasticity will therefore be:

\[ \mathcal{E} = - \frac{(b_0 + \eta) + \sqrt{F a_1}}{(a_0-b_0) + (\nu-\eta) + \sqrt{F a_1}} \qquad(12)\]

e

From eq. 12, we can see that whether \(\mathcal{E}\) is nonincreasing or nondecreasing with respect to F will depend on the exact values of the other parameters in \(\mathcal{E}\). We can also see that its absolute value is decreasing in \(\nu\) while increasing in \(\eta\) (because of the negative sign of \(\eta\) in the denominator which results in a positive nominator in the derivative of elasticity w.r.t to \(\eta\)). One intuition for this result can be that higher \(\nu\) allows higher prices to be set by firms while higher \(\eta\) means higher costs on the firms part resulting in less market influence and a more elastic demand.

From the previous computations, there was no case where the rate of change in the Lerner index was equal to the Herfindahl index in any of the partial derivative directions. Specifically, if we take eq. 9 as correct, we can see that \(\nu\) does not appear in \(P^*\). Moreover, the marginal cost with \(b_1 = 0\) is independent of \(Q\) and therefore of \(\nu\). That is, the Lerner index is independent of \(\nu\) while \(R_H\), being the inverse of \(N\) is directly influenced by \(\nu\). The presence of \(\nu\) in the latter index results in completely different rates of change between the two indices.

f

In collusion, firms are completely aware of each other’s costs and revenues. Therefore, they “trust” that optimizing their total profit will act in their best interest:

\[ \begin{gathered} \underset{\vec{q}}{max}\,\Pi = \sum_{i=1}^{N} P(Q)q_i -C(q_i) \\ \overset{(\ref{eq:Q})}{=} P(Q)Q - \sum_{i\neq j}^{N-1}C(q_i) - C(q_j) \end{gathered} \]

The first order conditions are therefore as such:

\[ \begin{gathered} \frac{\partial \Pi}{\partial q_j} = \frac{d(P(Q)Q)}{dQ}\frac{\partial Q(\vec{q})}{\partial q_j} - \frac{\partial C(q_j)}{\partial q_j} \qquad\qquad \forall\, j \in \{1,...N\} \\ = (a_0+\nu) -2a_1Q -(b_0+\eta) \\ = 0 \end{gathered} \qquad(13)\]

In the case of collusion, production is lower while firms enjoy higher profits. Welfare is smaller with no competition between firms. Technically, since all firms have the same cost functional form, the solution can be considered as the profit maximization of a single firm with the total costs of all firms. Therefore, the solution to the \(N\) equations of eq. 13 are not unique and each firm can produce whatever amount it wants as long as the sum of production equals \(Q\). However, by imposing symmetry, we can conclude that each firms produces \(q= \frac{Q}{N}\):

\[ \begin{gathered} Q^* = \frac{(a_0-b_0)+(\nu-\eta)}{2a_1} \\ \Rightarrow q^* = \frac{(a_0-b_0)+(\nu-\eta)}{(2N)a_1} \end{gathered} \qquad(14)\] We can see that compared to eq. 7, production has reduced.

Code

# [Julia Code]

using SymPy

# initial variables

P, a_0, a_1, ν, Q, C, η, F, b_0, N, q, π = 
    symbols("P, a_0, a_1, ν, Q, C, η, F, b_0, N, q, π");

Q = ( (a_0-b_0)+(ν-η) )/( 2*a_1 );

q = Q/N;

P = a_0 - a_1*Q + ν;

C = (b_0 + η)*q + F;

π = P*q - C; 

MC = b_0 + η;

Lerner = (P-MC)/(P); 
Lerner = simplify(Lerner);

show(stdout, "text/latex", Lerner)

\[\begin{equation*}\frac{a_{0} - b_{0} - η + ν}{a_{0} + b_{0} + η + ν}\end{equation*}\]


elasticity = (-1/a_1)*(P/Q);

show(stdout, "text/latex", elasticity)

\[\begin{equation*}- \frac{2 \left(\frac{a_{0}}{2} + \frac{b_{0}}{2} + \frac{η}{2} + \frac{ν}{2}\right)}{a_{0} - b_{0} - η + ν}\end{equation*}\]


Results

The Herfindahl index is not uniquely obtainable and there is no unique solution to market share of each firm. This is because all firms have the same cost functions resulting in the same foc for all firms. That is, it does not matter how much each firm produces as long as they produce the amount needed for the PMP of the collusion since all their costs are similar anyway. However, acknowledging symmetry, we again can argue that:

\[ R_{H\,collusive}= \frac{1}{N} \qquad(15)\]

Regardless of the symmetry assumption, the Lerner index is:

\[ LI_{collusive} = \frac{(a_0-b_0)+(\nu-\eta)}{(a_0+b_0)+(\nu + \eta)} \qquad(16)\]

and the price elasticity is:

\[ \mathcal{E}_{collusive} = - \frac{(a_0+b_0)+(\nu+\eta)}{(a_0-b_0)+(\nu-\eta)} \qquad(17)\]

g

Considering the new demand functional form given by:

\[ \ln P = c_0 - c_1 \ln Q + \xi \]

First let us obtain the elasticity:

\[ \begin{gathered} \frac{1}{P} = -c_1\frac{Q'}{Q} \\ \Rightarrow \mathcal{E} = -\frac{1}{c_1} \end{gathered} \qquad(18)\]

The foc is again given by eq. 5 and once again we can substitute from eq. 4 to find:

\[ \frac{\partial \pi_i}{\partial q_i} = \frac{dP}{dQ}\frac{Q}{N} + P - (b_0 + \eta) = 0 \] Where we have considered the symmetry of the solution beforehand. That is, \(q_i = Q/N\).

Now we can substitute for the value of elasticity to directly obtain our \(P^*\):

\[ \begin{gathered} \frac{Q}{NQ'} + P = (b_0 + \eta) \\ \overset{(\ref{eq:elasticitylogdem})}{\Rightarrow} \frac{(b_0 + \eta)}{P} = \frac{-c_1}{N} +1 \end{gathered} \]

Therefore:

\[ P^* = \frac{(b_0+\eta)(N)}{N-c_1} \qquad(19)\]

The Lerner index, given by \(LI = \frac{P-MC}{P}\) is then:

\[ LI = \frac{c_1}{N} \qquad(20)\]

And the Herfindahl index, assuming symmetry is simply:

\[ R_H = \frac{1}{N} \]

We also need to solve for the collusion case as before. Considering the general foc given by eq. 13 and substituting \(\frac{\partial Q}{\partial q}=1\) from Cournot, we arrive at:

\[ \begin{gathered} \frac{\partial \Pi}{\partial q_i} = \frac{dP}{dQ}Q + P - (b_0+\eta) = 0 \\ \Rightarrow \frac{(b_0+\eta)}{P} = 1 -c_1 \end{gathered} \] Therefore \(P^*\) is:

\[ P^*_{collusive} = \frac{(b_0+\eta)}{1-c_1} \qquad(21)\]

Which can be shown to be greater than eq. 19, as expected from collusion.

The Lerner index therefore is:

\[ LI_{collusive} = c_1 \qquad(22)\]

And Herfindahl, as before, is only obtainable by assuming symmetry:

\[ R_{H\,collusive} = \frac{1}{N} \qquad(23)\]

The collusion elasticity remains the same due to the functional form of the demand:

\[ \mathcal{E}_{collusive} = -\frac{1}{c_1} \qquad(24)\]

The results appear as if we truly are dealing with a single monopolistic firm with \(N=1\).

Regarding the rates of changes of \(LI\) and \(R_H\), it is clear from the derived expressions that neither are functions of either of the mentioned parameters and therefore, both have equal rates of change equal to zero, with regard to a change in either of the mentioned parameters.

Problem 4

First, we generate the data as instructed:

a and b

N_cities <- 1000

N_firms <- sample(1:10, N_cities, replace = T)

N_collusive_cities <- 500

cities <- tibble(N_firms)

cities <- cities %>% add_column(active_antitrust = 
                                    c(rep(FALSE,N_collusive_cities),
                                      rep(TRUE,N_cities-N_collusive_cities)))

cities <- cities %>% mutate(colluded = !active_antitrust & N_firms <= 8)

Now we write the expressions previously obtained for the log demand problem:

LI_expr <- quote( c_1/N_firms )
R_H_expr <- quote( 1/N_firms )
Elast_expr <- quote( -1/c_1 )

LI_collusive_expr <- quote( c_1 )
R_H_collusive_expr <- quote( 1/N_firms )
Elast_collusive_expr <- quote( -1/c_1 )

For the log demand we assign the given values to the parameters:

# We show F with F_ since F stands for FALSE in r
c_0 <- 1; c_1 <- 0.9; xi <- 0
F_ <- 1; b_0 <- 1; b_1 <- 0; eta <- 0

Now to calculate the given variables:

cities_logdem <- cities %>% mutate(LI = if_else(!colluded, eval(LI_expr), eval(LI_collusive_expr)),
                            R_H = if_else(!colluded, eval(R_H_expr), eval(R_H_collusive_expr)), 
                            Elast = if_else(!colluded, eval(Elast_expr), eval(Elast_collusive_expr)))

c

Now we need to add the log of Herfindahl index. We also need to add the error term to the log of our calculated LI for the regression:

cities_logdem <- cities_logdem %>% mutate(logR_H = log(R_H))
cities_logdem <- cities_logdem %>% mutate(logLI_disturbed = log(LI) + runif(N_cities,-0.05,0.05))

It is now possible to regress for the three cases and test the coefficient of \(log\,R_H\):

# coeff for collusive test
model_logdem_no_antitrust <- lm(logLI_disturbed ~ logR_H, cities_logdem %>% filter(active_antitrust==FALSE)) 
tidy(model_logdem_no_antitrust) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) 0.5056410 0.0852943 5.92819 0
logR_H 0.6720588 0.0506271 13.27470 0
glance(model_logdem_no_antitrust) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.2613661 0.2598829 176.2176
linearHypothesis(model_logdem_no_antitrust,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] FALSE
# coeff for noncollusive test
model_logdem_antitrust <- lm(logLI_disturbed ~ logR_H, cities_logdem %>% filter(active_antitrust==TRUE)) 
tidy(model_logdem_antitrust) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -0.1022943 0.0029624 -34.53034 0
logR_H 1.0010737 0.0018102 553.01616 0
glance(model_logdem_antitrust) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.9983743 0.998371 305826.9
linearHypothesis(model_logdem_antitrust,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] TRUE
# coeff for entire data test
model_logdem_all <- lm(logLI_disturbed ~ logR_H, cities_logdem)
tidy(model_logdem_all) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) 0.1579861 0.0602675 2.621414 0.0088898
logR_H 0.8045427 0.0362879 22.171099 0.0000000
glance(model_logdem_all) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.3300024 0.3293311 491.5576
linearHypothesis(model_logdem_all,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] FALSE

We can see from the above results that there is high correlation between \(\ln R_H\) and \(\ln LI\). Of course, the structure-conduct-performance paradigm does not indicate any causality only that there is correlation. Indeed, neither of the two indices truly “cause” each other, instead, they are both simultaneously derived from the optimization solution of the firms given the specific game-theoretic framework.

What we can observe from the regression results is that lack of competition greatly disturbs this correlation. The segment of cities with no active antitrust have the highest possibility-compared to the other two segments of the data-to behave non-competitively. Therefore, this segment of the data has the lowest coefficient estimate value.

For the segment of cities with no collusion possibility, the regression is a nearly-exact fit. This is clear from the expressions that were derived for the two indices for the Cournot case. This is also the only case where the desired null hypothesis is not rejected.

For the entire data, again, the estimated coefficient value has reduced due to the presence of cities with no anti-trust.

d

For the linear case, we previously obtained the expressions for the two indices and elasticity. Now, we write them as expressions in code.

LI_lin_expr <- quote( sqrt(F_*a_1)/((b_0+eta)+sqrt(F_*a_1)) )
R_H_lin_expr <- quote( sqrt(F_*a_1)/((a_0-b_0)+(nu-eta)-sqrt(F_*a_1)) )
Elast_lin_expr <- quote(- ((b_0+eta)+sqrt(F_*a_1))/((a_0-b_0)+(nu-eta)+sqrt(F_*a_1)) )

LI_collusive_lin_expr <- quote( ((a_0-b_0)+(nu-eta))/((a_0+b_0)+(nu + eta)) )
R_H_collusive_lin_expr <- 1/N_firms
Elast_collusive_lin_expr <- quote(- ((a_0+b_0)+(nu+eta))/((a_0-b_0)+(nu-eta)) )

One issue here is whether to treat the Cournot N endogenously, as given above, or to treat it as exogenous since the number of firms in each city is given. Since we are required to treat N as endogenous in the next problem, here, we will treat it as exogenous. The Lerner index in this case will be:

\[ \frac{(a_0+\nu)-(b_0+\eta)}{(a_0+\nu)+N(b_0+\eta)} \]

While the Herfindahl index will simply be \(1/N\). Therefore, the “exogenous” expressions are as such:

LI_exg_lin_expr <- quote( ( (a_0+nu)-(b_0+eta) )/( (a_0+nu)+N_firms*(b_0+eta) ) ) 
R_H_exg_lin_expr <- quote(1/N_firms)

Our values for the parameters are given as bellow:

F_ <- 1; b_0 <- 1; b_1 <- 0; eta <- 0
a_0 <- 3; a_1 <- 1; nu <- 0

Now we can calculate the needed values:

cities <- cities %>% mutate(LI = if_else(!colluded, eval(LI_exg_lin_expr), eval(LI_collusive_lin_expr)),
                            R_H = if_else(!colluded, eval(R_H_exg_lin_expr), eval(R_H_collusive_lin_expr)))

Now we need to add log of Herfindahl index. We also need to add the error term to the log of our calculated LI for the regression:

cities <- cities %>% mutate(logR_H = log(R_H))
cities <- cities %>% mutate(logLI_disturbed = log(LI) + runif(N_cities,-0.05,0.05))

It is now possible to regress for the three cases and test the coefficient of \(log\,R_H\):

# coeff for collusive test
model_no_antitrust <- lm(logLI_disturbed ~ logR_H, cities %>% filter(active_antitrust==FALSE)) 
tidy(model_no_antitrust) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -0.3817245 0.0432103 -8.834116 0
logR_H 0.3406471 0.0256478 13.281746 0
glance(model_no_antitrust) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.2615711 0.2600883 176.4048
linearHypothesis(model_no_antitrust,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] FALSE
# coeff for non-collusive test
model_antitrust <- lm(logLI_disturbed ~ logR_H, cities %>% filter(active_antitrust==TRUE)) 
tidy(model_antitrust) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -0.5837794 0.0066535 -87.74079 0
logR_H 0.5272330 0.0040656 129.68138 0
glance(model_antitrust) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.9712392 0.9711815 16817.26
linearHypothesis(model_antitrust,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] FALSE
# coeff for entire data test
model_all <- lm(logLI_disturbed ~ logR_H, cities)
tidy(model_all) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -0.5006331 0.0288049 -17.38017 0
logR_H 0.4203286 0.0173438 24.23510 0
glance(model_all) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.370482 0.3698513 587.34
    linearHypothesis(model_all,"logR_H = 1") %>% extract2("Pr(>F)") %>% extract(2) %>%
    is_greater_than(0.05)
[1] FALSE

We can see again that the greatest coefficient is for cities with no collusion.

Regarding the different demand functional form that has resulted in a lower coefficient value in this case, this is what can be said. As we mentioned before, the linear demand function has varying market elasticity at different quantities and prices. This “differentiation” is absent in the case of a log-log specification for demand. That is to say, the customers, at every price and quantity, only are inclined to change their quantity demanded by a fixed multiple of the percent change in prices. In other words, all customers have the exact same willingness to pay in the log-log specification. This is in contrast to the linear demand. In the linear demand, the customers are differentiated by their willingness to pay. The customers at the “top” of the demand curve, where quantity sold is still small, will have to pay more for a similar increase in quantity (for instance, one unit purchase) than those lying further down the demand curve. That is, the firm first sells its product to the most willing customers and then the less willing and so on until the sell becomes inelastic at the very last units sold. In this scenario, customers have been vertically differentiated.

This in turn, makes the market less competitive because it is giving more power to the firm by allowing it to sell some units of its good at a higher price. In the case of collusion we observed a reduction in the value of the coefficient estimate because the competitiveness of the market had been jeopardized in the absence of anti-trust. In this scenario, the degree of competitiveness comes under harm as a result of people’s differentiated willingness to pay for the firm’s product which in turn requires a no-perfect-competition treatment of the problem.

e

See previous sections. Also, should the likelihood of collusion decrease, we will expect higher coefficient estimates (closer to 1). Their competitiveness can exactly be compared as explained in the previous sections. Although, it should be added that one needs to view SCP as only explaining correlation. The only reason that a lower coefficient estimate can be interpreted as less competitiveness is because it deviates from results obtained in our PMP and game-theoretic framework. It does not explain causality as it is only a reduced form. Without the theory, we cannot interpret the coefficient as such. Moreover, extending this line of reasoning to more general models can be tricky simply because we have not really proved our model as a unique framework for the analysis of competitiveness.

Problem 5

We essentially only need to follow the same previous procedures as not much has changed in this case. The only major difference will be that now we treat \(N\) as endogenous and therefore use the non-exogenous expressions for the indices. First we need to alter our data accordingly. Firstly, we need to clear the previous variables in order to avoid any conflicts:

rm(F_, b_0, b_1, eta, a_0, a_1, nu)

a

Now to construct the new data:

F_ <- 1; b_0 <- 1; b_1 <- 0; a_0 <- 5; a_1 <- 1

cities_p5 <- cities %>% mutate(nu = runif(N_cities,-1,1), eta = rep(0,N_cities))

# all firms play Cournot
cities_p5 <- cities_p5 %>% mutate(LI = eval(LI_lin_expr),
                                  R_H = eval(R_H_lin_expr), Elast = eval(Elast_lin_expr))

# calculate logs
cities_p5 <- cities_p5 %>% mutate(logR_H = log(R_H))
cities_p5 <- cities_p5 %>% mutate(logLI_disturbed = log(LI) + runif(N_cities,-0.05,0.05))

We can now create the model:

model_p5_a <- lm(logLI_disturbed ~ logR_H, cities_p5) 
tidy(model_p5_a) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -0.6962409 0.0048467 -143.6529029 0.0000000
logR_H -0.0030761 0.0044025 -0.6987004 0.4849021
glance(model_p5_a) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.0004889 -0.0005126 0.4881822

We can see that the coefficient on \(Log R_H\) is almost insignificant both in magnitude and statistically. This is because \(LI\) is not a function of \(\nu\) and also, independent of \(N\). Therefore, without the disturbance it would have been a constant for all cities. This is why the intercept alone can explain most of its variation. However, if we were to omit the intercept, the coefficient on \(Log R_H\) would have been significant with an r-squared of around 0.9.

b

We do the same again but this time with \(\eta\):

cities_p5 <- cities %>% mutate(eta = runif(N_cities,-1,1), nu = rep(0,N_cities))

# all firms play Cournot
cities_p5 <- cities_p5 %>% mutate(LI = eval(LI_lin_expr), 
                                  R_H = eval(R_H_lin_expr), Elast = eval(Elast_lin_expr))

# calculate logs
cities_p5 <- cities_p5 %>% mutate(logR_H = log(R_H))
cities_p5 <- cities_p5 %>% mutate(logLI_disturbed = log(LI) + runif(N_cities,-0.05,0.05))

Now to see the new model:

model_p5_b <- lm(logLI_disturbed ~ logR_H, cities_p5)
tidy(model_p5_b) %>% knitr::kable()
term estimate std.error statistic p.value
(Intercept) -2.289778 0.0133159 -171.9585 0
logR_H -1.521995 0.0120241 -126.5791 0
glance(model_p5_b) %>% extract(c(1,2,4)) %>% knitr::kable()
r.squared adj.r.squared statistic
0.941364 0.9413053 16022.27

In this case, there is true variation in \(LI\) and therefore, the coefficient of \(log R_H\) is significant with a high value of r-squared.

An interesting fact to consider in this case is that the coefficient of \(Log R_H\) is negative while in previous models, it was positive. This is a further indicator of the fact that there is no causal relation between \(LI\) and \(R_H\). Here, \(R_H\) has negative effect on \(LI\) as it would seem (interpreted as percent change of course). This is because in this new modeling, we have considered N to be endogenous. That is, we have taken another step toward a structural model from our previous reduced form. Again, the reduced form was only capable of informing us of the possible correlation in our data but not of any causal relationship. That is why, even though both models showed a correlation between the two indices, one showed a positive relation while the other showed a negative one. Ultimately, the correctness and true interpretation of the coefficient will rely on a structural model, whether N is taken as endogenous or not. The reduced form can only inform of the possible correlations and not the exact mechanisms and directions that one variable affects the other one.

c

See above. Also, we can see that the effect of \(\nu\) and \(\eta\) are quite similar and were it not for the fact that in the first generated data, the intercept explained most of \(log LI\), there would have been similar (albeit opposite in direction) effects for \(Log R_H\) on \(Log LI\). Of course, we previously discussed mathematically the effect of both these parameters on the two indices and elasticity. Those discussions hold in this case as well.