SupplyChain-Functions: Supply Chain Merger Simulation

SupplyChain-FunctionsR Documentation

Supply Chain Merger Simulation

Description

Calibrates consumer demand using (Nested) Logit and then simulates the price effect of a merger between two firms under the assumption that all firms in the market are playing a differentiated products Bertrand pricing game.

Let k denote the number of products produced by all firms playing the Bertrand pricing game below.

Usage

vertical.barg(
  supplyDown = c("bertrand", "2nd"),
  sharesDown,
  pricesDown,
  marginsDown,
  ownerPreDown,
  ownerPostDown,
  nests = rep(NA, length(pricesDown)),
  diversions = diversions,
  mcDeltaDown = rep(0, length(pricesDown)),
  pricesUp,
  marginsUp,
  ownerPreUp,
  ownerPostUp,
  mcDeltaUp = rep(0, length(pricesUp)),
  normIndex = ifelse(isTRUE(all.equal(sum(sharesDown), 1, check.names = FALSE)), 1, NA),
  subset = rep(TRUE, length(pricesDown)),
  insideSize = NA_real_,
  priceOutside = 0,
  priceStartDown = pricesDown,
  priceStartUp = pricesUp,
  isMax = FALSE,
  constrain = c("global", "pair", "wholesaler", "retailer"),
  control.slopes,
  control.equ,
  labels = paste0("Prod", 1:length(pricesUp)),
  ...
)

Arguments

supplyDown

A length 1 character vector that specifies whether the downstream game that firms are playing is a Nash-Bertrand Pricing game ("bertrand”) or a 2nd score auction ("2nd"). Default is "bertrand".

sharesDown

A length k vector of product (quantity) shares. Values must be between 0 and 1.

pricesDown

A length k vector of downstream product prices.

marginsDown

A length k vector of downstream product margins in levels (e.g. dollars), some of which may equal NA.

ownerPreDown

A vector of length k whose values indicate which downstream firm produced a product pre-merger.

ownerPostDown

A vector of length k whose values indicate which downstream firm produced a product post-merger.

nests

A length k factor of product nests.

diversions

A k x k matrix of diversion ratios with diagonal elements equal to -1. Default is missing, in which case diversion according to share is assumed.

mcDeltaDown

A vector of length k where each element equals the proportional change in a downstream firm's product-level marginal costs due to the merger. Default is 0, which assumes that the merger does not affect any products' marginal cost.

pricesUp

A length k vector of upstream product prices.

marginsUp

A length k vector of upstream product margins in levels (e.g. dollars), some of which may equal NA.

ownerPreUp

A vector of length k whose values indicate which upstream firm produced a product pre-merger.

ownerPostUp

A vector of length k whose values indicate which upstream firm produced a product after the merger.

mcDeltaUp

A vector of length k where each element equals the proportional change in a upstream firm's product-level marginal costs due to the merger. Default is 0, which assumes that the merger does not affect any products' marginal cost.

normIndex

An integer equalling the index (position) of the inside product whose mean valuation will be normalized to 1. Default is 1, unless ‘shares’ sum to less than 1, in which case the default is NA and an outside good is assumed to exist.

subset

A vector of length k where each element equals TRUE if the product indexed by that element should be included in the post-merger simulation and FALSE if it should be excluded.Default is a length k vector of TRUE.

insideSize

An integer equal to total pre-merger units sold. If shares sum to one, this also equals the size of the market.

priceOutside

A length 1 vector indicating the price of the outside good. Default is 0.

priceStartDown

A length k vector of starting values used to solve for downstream equilibrium prices. Default is the ‘pricesDown’ vector.

priceStartUp

A length k vector of starting values used to solve for upstream equilibrium price. Default is the ‘pricesUp’ vector.

isMax

If TRUE, checks to see whether computed price equilibrium locally maximizes firm profits and returns a warning if not. Default is FALSE.

constrain

Specify calibration strategy for estimating bargaining power parameter. "global" (default) assumes bargaining parameter is the same across all participants,"pair" assumes that all wholesaler/retailer pairs have a distinct parameter,"wholesaler" assumes that each wholesaler's parameter is identical across negotiations, "retailer" assumes that each retailer's parameter is identical across negotiations.

control.slopes

A list of optim control parameters passed to the calibration routine optimizer (typically the calcSlopes method).

control.equ

A list of BBsolve control parameters passed to the non-linear equation solver (typically the calcPrices method).

labels

A k-length vector of labels. Default is "Prod#", where ‘#’ is a number between 1 and the length of ‘prices’.

...

Additional options to feed to the BBsolve optimizer used to solve for equilibrium prices.

Details

Using product prices, quantity shares and all of the product margins from at least one firm, logit is able to recover the price coefficient and product mean valuations in a Logit demand model. logit then uses these calibrated parameters to simulate a merger between two firms.

Value

When 'supplyDown' equals "bertand", vertical.barg returns an instance of class VertBargBertLogit. When 'supplyDown' equals "2nd", vertical.barg returns an instance of class VertBarg2ndLogit

Author(s)

Charles Taragin ctaragin+antitrustr@gmail.com

References

Sheu, G. and Taragin, C. (2021), Simulating mergers in a vertical supply chain with bargaining. The RAND Journal of Economics, 52: 596-632.doi: 10.1111/1756-2171.12385.

Examples

## Vertical supply with 2 upstream firms,
## 2 downstream firms, each offering 
## a single product.

shareDown <- c( 0.1293482, 0.1422541, 0.4631014, 0.2152962)
marginDown <- c( 0.2067533, 0.2572215, 0.3082511, 0.3539681)
priceDown <- c( 63.08158, 50.70465, 95.82960, 83.45267)
ownerPreDown <- paste0("D",rep(c(1,2),each=2))
marginUp <- c(0.5810900, 0.5331135, 0.5810900, 0.5331135)
priceUp <- c( 40.11427, 27.73734, 40.11427, 27.73734)
ownerPreUp <- paste0("U",rep(c(1,2),2))
priceOutSide <- 10


## Simulate an upstream horizontal merger
ownerPostDown <- ownerPreDown
ownerPostUp <- rep("U1",length(ownerPreUp))


simres_up <- vertical.barg(sharesDown =shareDown,
pricesDown = priceDown,
marginsDown = marginDown,
ownerPreDown = ownerPreDown,
ownerPostDown = ownerPreDown,
pricesUp = priceUp,
marginsUp = marginUp,
ownerPreUp = ownerPreUp,
ownerPostUp = ownerPostUp,
priceOutside = priceOutSide)


print(simres_up)
summary(simres_up)

## Simulate a downstream horizontal merger
ownerPostUp <- ownerPreUp
ownerPostDown <- ownerPreDown
ownerPostDown <- rep("D1",length(ownerPreDown))

simres_down <- vertical.barg(sharesDown =shareDown,
pricesDown = priceDown,
marginsDown = marginDown,
ownerPreDown = ownerPreDown,
ownerPostDown = ownerPostDown,
pricesUp = priceUp,
marginsUp = marginUp,
ownerPreUp = ownerPreUp,
ownerPostUp = ownerPreUp,
priceOutside = priceOutSide)


print(simres_down)
summary(simres_down)


## Simulate a vertical merger
ownerPostUp <- ownerPreUp
ownerPostDown <- ownerPreDown
ownerPostDown[ownerPostDown == "D1"] <- "U1"

simres_vert <- vertical.barg(sharesDown =shareDown,
pricesDown = priceDown,
marginsDown = marginDown,
ownerPreDown = ownerPreDown,
ownerPostDown = ownerPostDown,
pricesUp = priceUp,
marginsUp = marginUp,
ownerPreUp = ownerPreUp,
ownerPostUp = ownerPreUp,
priceOutside = priceOutSide)


print(simres_vert)
summary(simres_vert)

antitrust documentation built on Aug. 24, 2022, 9:05 a.m.