Calculate the marginal cost reductions necessary to restore premerger prices (CMCR), or the net Upwards Pricing Pressure (UPP) in a merger involving firms playing a differentiated products Bertrand pricing game.
1 2 3 4 5 6 7 8 9  cmcr.bertrand(prices, margins, diversions, ownerPre,
ownerPost=matrix(1,ncol=length(prices), nrow=length(prices)),
labels=paste("Prod",1:length(prices),sep=""))
upp.bertrand(prices, margins, diversions, ownerPre,
ownerPost=matrix(1,ncol=length(prices), nrow=length(prices)),
mcDelta=rep(0,length(prices)),
labels=paste("Prod",1:length(prices),sep=""))


Let k denote the number of products produced by the merging parties. 
prices 
A lengthk vector of product prices. 
margins 
A lengthk vector of product margins. 
diversions 
A k x k matrix of diversion ratios with diagonal elements equal to 1. 
ownerPre 
EITHER a vector of length k whose values indicate which of the merging parties produced a product premerger OR a k x k matrix of premerger ownership shares. 
ownerPost 
A k x k matrix of postmerger ownership shares. Default is a k x k matrix of 1s. 
mcDelta 
A vector of length k where each element equals the proportional change in a product's marginal costs due to the merger. Default is 0, which assumes that the merger does not affect any products' marginal cost. 
labels 
A lengthk vector of product labels. 
All ‘prices’ elements must be positive, all ‘margins’ elements must be between 0 and 1, and all ‘diversions’ elements must be between 0 and 1 in absolute value. In addition, offdiagonal elements (i,j) of ‘diversions’ must equal an estimate of the diversion ratio from product i to product j (i.e. the estimated fraction of i's sales that go to j due to a small increase in i's price). Also, ‘diversions’ elements are positive if i and j are substitutes and negative if i and j are complements.
‘ownerPre’ will typically be a vector whose values equal 1 if a product is produced by firm 1 and 0 otherwise, though other values including firm name are acceptable. Optionally, ‘ownerPre’ may be set equal to a matrix of the merging firms premerger ownership shares. These ownership shares must be between 0 and 1.
‘ownerPost’ is an optional argument that should only be specified if one party to the acquisition is assuming partial control of the other party's assets. ‘ownerPost’ elements must be between 0 and 1.
cmcr.bertrand
returns a lengthk vector whose values equal the percentage change in each products'
marginal costs that the merged firms must achieve in order to offset a
price increase.
upp.bertrand
returns a lengthk vector whose values equal
the generalized pricing pressure (GePP) for each of the merging's parties' products, net any efficiency claims. GePP is a generalization of Upwards Pricing Pressure (UPP) that accomodates multiproduct firms.
Charles Taragin charles.taragin@usdoj.gov
Farrell, Joseph and Shapiro, Carl (2010). “Antitrust Evaluation of Horizontal Mergers: An Economic Alternative to Market Definition.” The B.E. Journal of Theoretical Economics, 10(1), pp. 139.
Jaffe, Sonia and Weyl Eric (2012). “The FirstOrder Approach to Merger Analysis.” SSRN eLibrary
Werden, Gregory (1996). “A Robust Test for Consumer Welfare Enhancing Mergers Among Sellers of Differentiated Products.” The Journal of Industrial Economics, 44(4), pp. 409413.
cmcr.cournot
for a homogeneous products Cournot
version of CMCR, and cmcrmethods
for calculating
CMCR and UPP after calibrating demand system parameters and simulating a merger.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35  ## Let k_1 = 1 and and k_2 = 2 ##
p1 = 50; margin1 = .3
p2 = c(45,70); margin2 = c(.4,.6)
isOne=c(1,0,0)
diversions = matrix(c(1,.5,.01,.6,1,.1,.02,.2,1),ncol=3)
cmcr.bertrand(c(p1,p2), c(margin1,margin2), diversions, isOne)
upp.bertrand(c(p1,p2), c(margin1,margin2), diversions, isOne)
## Calculate the necessary percentage cost reductions for various margins and
## diversion ratios in a twoproduct merger where both products have
## equal prices and diversions (see Werden 1996, pg. 412, Table 1)
margins = seq(.4,.7,.1)
diversions = seq(.05,.25,.05)
prices = rep(1,2) #assuming prices are equal, we can set product prices to 1
isOne = c(1,0)
result = matrix(ncol=length(margins),nrow=length(diversions),dimnames=list(diversions,margins))
for(m in 1:length(margins)){
for(d in 1:length(diversions)){
dMatrix = diag(2)
dMatrix[2,1] < dMatrix[1,2] < diversions[d]
firmMargins = rep(margins[m],2)
result[d,m] = cmcr.bertrand(prices, firmMargins, dMatrix, isOne)[1]
}}
print(round(result,1))

Questions? Problems? Suggestions? Tweet to @rdrrHQ or email at ian@mutexlabs.com.
All documentation is copyright its authors; we didn't write any of that.