mergeron 2024.739125.3__py3-none-any.whl → 2024.739127.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mergeron might be problematic. Click here for more details.

mergeron/gen/upp_tests.py CHANGED
@@ -7,11 +7,12 @@ from generated market data.
7
7
  from collections.abc import Sequence
8
8
  from contextlib import suppress
9
9
  from pathlib import Path
10
- from typing import Literal, TypeAlias, TypedDict
10
+ from typing import Any, Literal, TypedDict
11
11
 
12
12
  import numpy as np
13
13
  import tables as ptb # type: ignore
14
14
  from numpy.random import SeedSequence
15
+ from numpy.typing import NDArray
15
16
 
16
17
  from .. import ( # noqa
17
18
  VERSION,
@@ -40,7 +41,7 @@ __version__ = VERSION
40
41
  ptb.parameters.MAX_NUMEXPR_THREADS = 8
41
42
  ptb.parameters.MAX_BLOSC_THREADS = 4
42
43
 
43
- SaveData: TypeAlias = Literal[False] | tuple[Literal[True], ptb.File, ptb.Group]
44
+ type SaveData = Literal[False] | tuple[Literal[True], ptb.File, ptb.Group]
44
45
 
45
46
 
46
47
  class INVRESCntsArgs(TypedDict, total=False):
@@ -53,7 +54,7 @@ class INVRESCntsArgs(TypedDict, total=False):
53
54
  saved_array_name_suffix: str
54
55
 
55
56
 
56
- def enf_cnts(
57
+ def compute_upp_test_counts(
57
58
  _market_data_sample: MarketDataSample,
58
59
  _upp_test_parms: gbl.HMGThresholds,
59
60
  _upp_test_regime: UPPTestRegime,
@@ -84,7 +85,7 @@ def enf_cnts(
84
85
  """
85
86
 
86
87
  _enf_cnts_sim_array = -1 * np.ones((6, 2), np.int64)
87
- _upp_test_arrays = gen_upp_test_arrays(
88
+ _upp_test_arrays = compute_upp_test_arrays(
88
89
  _market_data_sample, _upp_test_parms, _upp_test_regime
89
90
  )
90
91
 
@@ -191,7 +192,7 @@ def enf_cnts(
191
192
  )
192
193
 
193
194
 
194
- def gen_upp_test_arrays(
195
+ def compute_upp_test_arrays(
195
196
  _market_data: MarketDataSample,
196
197
  _upp_test_parms: gbl.HMGThresholds,
197
198
  _sim_test_regime: UPPTestRegime,
@@ -236,13 +237,13 @@ def gen_upp_test_arrays(
236
237
 
237
238
  np.divide(_ipr_array, 1 - _market_data.pcm_array, out=_cmcr_array)
238
239
 
239
- (_divr_test_vector,) = _compute_test_value_seq(
240
+ (_divr_test_vector,) = _compute_test_array_seq(
240
241
  (_market_data.divr_array,),
241
242
  _market_data.frmshr_array,
242
243
  _sim_test_regime.divr_aggregator,
243
244
  )
244
245
 
245
- (_guppi_test_vector, _cmcr_test_vector, _ipr_test_vector) = _compute_test_value_seq(
246
+ (_guppi_test_vector, _cmcr_test_vector, _ipr_test_vector) = _compute_test_array_seq(
246
247
  (_guppi_array, _cmcr_array, _ipr_array),
247
248
  _market_data.frmshr_array,
248
249
  _sim_test_regime.guppi_aggregator,
@@ -267,7 +268,7 @@ def gen_upp_test_arrays(
267
268
  return _upp_test_arrays
268
269
 
269
270
 
270
- def _compute_test_value_seq(
271
+ def _compute_test_array_seq(
271
272
  _test_measure_seq: tuple[ArrayDouble, ...],
272
273
  _wt_array: ArrayDouble,
273
274
  _aggregator: UPPAggrSelector,
@@ -286,45 +287,45 @@ def _compute_test_value_seq(
286
287
 
287
288
  match _aggregator:
288
289
  case UPPAggrSelector.AVG:
289
- _test_value_seq = (
290
+ _test_array_seq = (
290
291
  1 / 2 * np.einsum("ij->i", _g)[:, None] for _g in _test_measure_seq
291
292
  )
292
293
  case UPPAggrSelector.CPA:
293
- _test_value_seq = (
294
+ _test_array_seq = (
294
295
  np.einsum("ij,ij->i", _wt_array[:, ::-1], _g)[:, None]
295
296
  for _g in _test_measure_seq
296
297
  )
297
298
  case UPPAggrSelector.CPD:
298
- _test_value_seq = (
299
+ _test_array_seq = (
299
300
  np.sqrt(np.einsum("ij,ij,ij->i", _wt_array[:, ::-1], _g, _g))[:, None]
300
301
  for _g in _test_measure_seq
301
302
  )
302
303
  case UPPAggrSelector.DIS:
303
- _test_value_seq = (
304
+ _test_array_seq = (
304
305
  np.sqrt(1 / 2 * np.einsum("ij,ij->i", _g, _g))[:, None]
305
306
  for _g in _test_measure_seq
306
307
  )
307
308
  case UPPAggrSelector.MAX:
308
- _test_value_seq = (
309
+ _test_array_seq = (
309
310
  _g.max(axis=1, keepdims=True) for _g in _test_measure_seq
310
311
  )
311
312
  case UPPAggrSelector.MIN:
312
- _test_value_seq = (
313
+ _test_array_seq = (
313
314
  _g.min(axis=1, keepdims=True) for _g in _test_measure_seq
314
315
  )
315
316
  case UPPAggrSelector.OSA:
316
- _test_value_seq = (
317
+ _test_array_seq = (
317
318
  np.einsum("ij,ij->i", _wt_array, _g)[:, None]
318
319
  for _g in _test_measure_seq
319
320
  )
320
321
  case UPPAggrSelector.OSD:
321
- _test_value_seq = (
322
+ _test_array_seq = (
322
323
  np.sqrt(np.einsum("ij,ij,ij->i", _wt_array, _g, _g))[:, None]
323
324
  for _g in _test_measure_seq
324
325
  )
325
326
  case _:
326
327
  raise ValueError("GUPPI/diversion ratio aggregation method is invalid.")
327
- return tuple(_test_value_seq)
328
+ return tuple(_test_array_seq)
328
329
 
329
330
 
330
331
  def initialize_hd5(
@@ -367,7 +368,7 @@ def save_data_to_hdf5(
367
368
 
368
369
 
369
370
  def save_array_to_hdf5(
370
- _array_obj: ArrayFloat | ArrayINT | ArrayDouble | ArrayBIGINT | ArrayBoolean,
371
+ _array_obj: NDArray[Any],
371
372
  _array_name: str,
372
373
  _h5_group: ptb.Group,
373
374
  _h5_file: ptb.File,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: mergeron
3
- Version: 2024.739125.3
3
+ Version: 2024.739127.1
4
4
  Summary: Merger Policy Analysis using Python
5
5
  License: MIT
6
6
  Keywords: merger policy analysis,merger guidelines,merger screening,policy presumptions,concentration standards,upward pricing pressure,GUPPI
@@ -41,16 +41,16 @@ Description-Content-Type: text/x-rst
41
41
  mergeron: Merger Policy Analysis using Python
42
42
  =============================================
43
43
 
44
- Analyze the sets of mergers conforming to concentration and diversion ratio bounds. Analyze intrinsic enforcement rates, and intrinsic clearance rates, under concentration, diversion ratio, GUPPI, CMCR, and IPR bounds using generated data with specified distributions of market shares, price-cost margins, firm counts, and prices, optionally imposing restrictions implied by statutory filing thresholds and/or Bertrand-Nash oligopoly with MNL demand. Download and analyze merger investigations data published by the U.S. Federal Trade Commission in various reports on extended merger investigations (Second Requests) during 1996 to 2011.
44
+ Visualize the sets of mergers conforming to concentration and diversion-ratio standards. Estimate intrinsic enforcement rates, and intrinsic clearance rates, under concentration, diversion ratio, GUPPI, CMCR, and IPR bounds using generated data with specified distributions of market shares, price-cost margins, firm counts, and prices, optionally imposing restrictions implied by statutory filing thresholds and/or Bertrand-Nash oligopoly with MNL demand. Download and analyze merger investigations data published by the U.S. Federal Trade Commission in various reports on extended merger investigations (Second Requests) during 1996 to 2011.
45
45
 
46
46
  Here, enforcement rates derived with merger enforcement as being exogenous to firm conduct are defined as intrinsic enforcement rates, and similarly intrinsic clearance rates. Depending on the merger enforcement regime, or merger control regime, intrinsic enforcement rates may also not be the complement of intrinsic clearance rates, i.e, it is not necessarily true that the intrinsic clearance rate estimate for a given enforcement regime is 1 minus the intrinsic enforcement rate. In contrast, observed enforcement rates reflect the deterrent effects of merger enforcement on firm conduct as well as the effects of merger screening on the level of enforcement; and, by definition, the observed clearance rate is 1 minus the observed enforcement rate.
47
47
 
48
48
  Introduction
49
49
  ------------
50
50
 
51
- Module :code:`.core.guidelines_boundaries` includes classes for specifying concentration bounds (:code:`.core.guidelines_boundaries.ConcentrationBoundary`) and diversion-ratio bounds (:code:`.core.guidelines_boundaries.DiversionRatioBoundary`), with automatic generation of boundary (as an array of share-pairs) and area. This module also includes a function for generating plots of concentration and diversion-ratio boundaries, and functions for mapping GUPPI standards to concentration (ΔHHI) standards, and vice-versa.
51
+ Module :code:`.core.guidelines_boundaries` includes classes for specifying concentration bounds (:code:`.core.guidelines_boundaries.ConcentrationBoundary`) and diversion-ratio bounds (:code:`.core.guidelines_boundaries.DiversionRatioBoundary`), with automatic generation of boundary, as an array of share-pairs, and area. This module also includes a function for generating plots of concentration and diversion-ratio boundaries, and functions for mapping GUPPI standards to concentration (ΔHHI) standards, and vice-versa.
52
52
 
53
- Module :code:`.gen.data_generation` includes the :code:`.gen.data_generation.MarketSample` which provides for a rich specification of shares and diversion ratios (:code:`.gen.data_generation.MarketSample.share_spec`), margins (:code:`.gen.data_generation.MarketSample.pcm_spec`, prices (:code:`.gen.data_generation.MarketSample.price_spec`), and HSR filing requirements (:code:`.gen.data_generation.MarketSample.hsr_filing_test_type`), and with methods for, (i) generating sample data (:code:`.gen.data_generation.MarketSample.generate_sample`), and (ii) estimating enforcement or clearance rates under specified enforcement regimes given a method of aggregating diversion ratio or GUPPI estimates for the firms in a merger (:code:`.gen.data_generation.MarketSample.estimate_enf_counts`). While the latter populate the properties, :code:`.gen.data_generation.MarketSample.data`
53
+ Module :code:`.gen.data_generation` includes the :code:`.gen.data_generation.MarketSample` which provides for a rich specification of shares and diversion ratios (:code:`.gen.data_generation.MarketSample.share_spec`), margins (:code:`.gen.data_generation.MarketSample.pcm_spec`, prices (:code:`.gen.data_generation.MarketSample.price_spec`), and HSR filing requirements (:code:`.gen.data_generation.MarketSample.hsr_filing_test_type`), and with methods for, (i) generating sample data (:code:`.gen.data_generation.MarketSample.generate_sample`), and (ii) computing the intrinsic enforcement rate and intrinsic clearance rate for the generated sample, given a method (:code:`.UPPAggrSelector`) of aggregating diversion ratio or GUPPI estimates for the firms in a merger (:code:`.gen.data_generation.MarketSample.estimate_enf_counts`). While the latter populate the properties, :code:`.gen.data_generation.MarketSample.data`
54
54
  and :code:`.gen.data_generation.MarketSample.enf_counts`, respectively, the underlying methods for generating standalone :code:`MarketDataSample` and :code:`UPPTestCounts` objects are included in the class definition, with helper functions defined in the modules, :code:`.gen.data_generation_functions` and :code:`.gen.upp_tests`. Notably, market shares are generated for a sample of markets with firm-count distributed as specified in :code:`.gen.data_generation.MarketSample.share_spec.firm_count_weights`, with defaults as discussed below (also see, :code:`.gen.ShareSpec.firm_count_weights`.
55
55
 
56
56
  By default, merging-firm shares are drawn with uniform distribution over the space :math:`s_1 + s_2 \leqslant 1` for an unspecified number of firms. Alternatively, shares may be drawn from the Dirichlet distribution (see property `dist_type` of :code:`.gen.data_generation.MarketSample.share_spec`, of type, :code:`.gen.SHRDistribution`), with specified shape parameters (property `dist_parms` of :code:`.gen.data_generation.MarketSample.share_spec`. When drawing shares from the Dirichlet distribution, the user specifies the `firm_count_weights` property of :code:`.gen.data_generation.MarketSample.share_spec`, as a vector of weights specifying the frequency distribution over sequential firm counts, e.g., :code:`[133, 184, 134, 52, 32, 10, 12, 4, 3]` to specify shares drawn from Dirichlet distributions with 2 to 10 pre-merger firms distributed as in data for FTC merger investigations during 1996--2003 (See, for example, Table 4.1 of `FTC, Horizontal Merger Investigations Data, Fiscal Years 1996--2003 (Revised: August 31, 2004) <https://www.ftc.gov/sites/default/files/documents/reports/horizontal-merger-investigation-data-fiscal-years-1996-2003/040831horizmergersdata96-03.pdf>`_). If the property `firm_count_weights` is not explicitly assigned a value when defining :code:`.gen.data_generation.MarketSample.share_spec`, the default values is used, which results in a sample of markets with 2 to 7 firms with relative frequency in inverse proportion to firm-count, with 2-firm markets being 6 times as likely to be drawn as 7-firm markets.
@@ -65,11 +65,11 @@ The market sample may be restricted to mergers meeting the HSR filing requiremen
65
65
 
66
66
  The full specification of a market sample is given in a :code:`.gen.data_generation.MarketSample` object, including the above parameters. Data are drawn by invoking :code:`.gen.data_generation.MarketSample.generate_sample` which adds a :code:`data` property of class, :code:`.gen.MarketDataSample`. Enforcement or clearance counts are computed by invoking :code:`.gen.data_generation.MarketSample.estimate_enf_counts`, which adds an :code:`enf_counts` property of class :code:`.gen.UPPTestsCounts`. For fast, parallel generation of enforcement or clearance counts over large market data samples that ordinarily would exceed available limits on machine memory, the user can invoke the method :code:`.gen.data_generation.MarketSample.estimate_enf_counts` on a :code:`.gen.data_generation.MarketSample` object without first invoking :code:`.gen.data_generation.MarketSample.generate_sample`. Note, however, that this strategy does not retain the market sample in memory in the interests of conserving memory and maintaining high performance (the user can specify that the market sample and enforcement statistics be stored to permanent storage; when saving to current PCIe NVMe storage, the performance penalty is slight, but can be considerable if saving to SATA storage).
67
67
 
68
- Enforcement statistics based on FTC investigations data and test data are printed to screen or rendered to LaTex files (for processing into publication-quality tables) using methods provided in :code:`.gen.enforcement_stats`.
68
+ Enforcement statistics based on FTC investigations data and test data are tabulated using methods provided in :code:`.gen.enforcement_stats`.
69
69
 
70
70
  Programs demonstrating the use of this package are included in the sub-package, :code:`.demo`.
71
71
 
72
- This package includes a class, :code:`.core.pseudorandom_numbers.MultithreadedRNG` for generating random numbers with selected continuous distribution over specified parameters, and with CPU multithreading on machines with multiple virtual, logical, or physical CPU cores. This class is an adaptation from the documentation of the :code:`numpy` package, from the discussion on `multithreaded random-number generation <https://numpy.org/doc/stable/reference/random/multithreading.html>_`; the version included here permits selection of the distribution with pre-tests to catch and inform on common errors. To access these directly:
72
+ This package includes a class, :code:`.core.pseudorandom_numbers.MultithreadedRNG` for generating random numbers with selected continuous distribution over specified parameters, and with CPU multithreading on machines with multiple CPU cores, be they virtual, logical, or physical cores. This class is an adaptation from the documentation for the external :code:`numpy.random` subpackage, from the discussion on, "`Multithreaded generation <https://numpy.org/doc/stable/reference/random/multithreading.html>`_"; the version included here permits selection of the distribution with pre-tests to catch and inform on common errors. To access these directly:
73
73
 
74
74
  .. code-block:: python
75
75
 
@@ -0,0 +1,24 @@
1
+ mergeron/License.txt,sha256=7iX-y0EyjkbVJKJLS4ZKzuuE1wd0lryfsD_IytLG8lQ,1246
2
+ mergeron/__init__.py,sha256=SJjvuKqKcQsybbuFoLgA4PrvV8gB6TJFoQL7qbd2Jr4,1459
3
+ mergeron/core/__init__.py,sha256=KtjBlZOl7jwBCAUhrTJB9PdrN39YLYytNiSUSM_gRmA,62
4
+ mergeron/core/damodaran_margin_data.py,sha256=rMrgN1Qtw572a0ftY97OOj4otq8ldlLrcOi-bcE-org,8554
5
+ mergeron/core/ftc_merger_investigations_data.py,sha256=eldNU4hX9oKE4Rb08YE9_1LgolvNKZnhOXW6KyWSwnM,28622
6
+ mergeron/core/guidelines_boundaries.py,sha256=aOpSOaZPsN3CKcLMgkjtCXT2O-l0qb8Qh0Xv4chdSgM,15593
7
+ mergeron/core/guidelines_boundary_functions.py,sha256=GGn5mwBWmxkqcat4Ya0D-J6-7ujosgCCK3eJ9RFWASI,29749
8
+ mergeron/core/guidelines_boundary_functions_extra.py,sha256=HDwwKZDWlrj3Tw-I0gHm0TCSDcIyb9jDfwbuDvK55B8,11322
9
+ mergeron/core/pseudorandom_numbers.py,sha256=cJEWDTfy9CUTzR_di6Fm1Vl1Le6xWoU8wFHbYVMEuLI,9225
10
+ mergeron/data/__init__.py,sha256=KtjBlZOl7jwBCAUhrTJB9PdrN39YLYytNiSUSM_gRmA,62
11
+ mergeron/data/damodaran_margin_data.xls,sha256=Qggl1p5nkOMJI8YUXhkwXQRz-OhRSqBTzz57N0JQyYA,79360
12
+ mergeron/data/damodaran_margin_data_dict.msgpack,sha256=sr6s4L69kposEpzGI7jpPb4ULz0UpY-bEYfeNi6UlRA,57621
13
+ mergeron/data/ftc_invdata.msgpack,sha256=WBFHgi7Ld4R-h2zL2Zc3TOIlKqVrbVFMH1LoI4-T-M0,264664
14
+ mergeron/demo/__init__.py,sha256=KtjBlZOl7jwBCAUhrTJB9PdrN39YLYytNiSUSM_gRmA,62
15
+ mergeron/demo/visualize_empirical_margin_distribution.py,sha256=R-sGC87kVovWBqcM5U6GiNC9oLsbNaMTJgljv8ts8w0,2347
16
+ mergeron/gen/__init__.py,sha256=0rfcWpKDhYE_jNsw6xKTGFJqgNtfJ-5JFxHS89CIEuI,16575
17
+ mergeron/gen/data_generation.py,sha256=jSpwB2BHBDPVTsT1-NZhTSCcUV6816qn5oZBe6S0Hio,16797
18
+ mergeron/gen/data_generation_functions.py,sha256=bP3E0IPXINRc8s0dUxS_Wqo1byVzheZLX811A17WNbU,28571
19
+ mergeron/gen/enforcement_stats.py,sha256=ZjrV_VkFMF0D1myc-fj-W99M1EhJMA9-nCfyE5g9e54,10890
20
+ mergeron/gen/upp_tests.py,sha256=uRF4RrBo3amwQQSu661Xa50xKGMUxtnM3zRtYy3nyB0,12581
21
+ mergeron/py.typed,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
22
+ mergeron-2024.739127.1.dist-info/METADATA,sha256=crHd8c-F-fRENxyWbg7kjVS0a-GhPDozGn2UxvLssB4,13967
23
+ mergeron-2024.739127.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
24
+ mergeron-2024.739127.1.dist-info/RECORD,,
@@ -1,121 +0,0 @@
1
- \begin{table}[bt]
2
- %# jinja2 code blocks for creating variables here
3
- %# Spurious blank lines don't matter?
4
- ((* if tmpl_data.obs_merger_class == 'Entry Difficult' *))
5
- ((* set table_ref, obs_merger_class_desc = "9.2", "Markets with Strong Entry Barriers (``" + tmpl_data.obs_merger_class + "'')" *))
6
- ((* else *))
7
- ((* set table_ref, obs_merger_class_desc = "3.1", tmpl_data.obs_merger_class *))
8
- ((* endif *))
9
-
10
- ((* if tmpl_data.test_res == 'Enforcement' *))
11
- ((* set prop_title = "Proportion Enforced" *))
12
- ((* else *))
13
- ((* set prop_title = "Proportion Cleared" *))
14
- ((* endif *))
15
-
16
-
17
- \centering
18
- \caption{
19
- \JINVAR{ prop_title } and Simulated \JINVAR{ tmpl_data.PolicySelector} Rates
20
- for FTC Investigated Mergers
21
- }\label{tbl:clearanceRates_\JINVAR{ tmpl_data.obs_summary_type|replace(" ", "") -}_\JINVAR{ tmpl_data.obs_merger_class|replace(" ", "") -}_\JINVAR{ tmpl_data.obs_period|last -}}
22
- {\footnotesize
23
- \JINVAR{ tmpl_data.obs_summary_type_title } \\
24
- \JINVAR{ obs_merger_class_desc +", " + tmpl_data.obs_period|join('--') } \\[0.5\baselineskip]
25
- }
26
- \begin{tikzpicture}[auto, font = \sffamily]
27
- \begin{pgfonlayer}{background}
28
- \matrix[datatable,
29
- column 1/.style = {nodes = {align=right, text width = 27pt,},},
30
- column 2/.style = {nodes = {align=right, text width = 77pt,},},
31
- ] (stats_cis) {
32
- \JINVAR{ tmpl_data.stats_cis -}
33
- };
34
- \draw[color = OBSHDRFill, line width = 1pt,] (stats_cis-\JINVAR{- tmpl_data.stats_numrows -}-1.north west) -- (stats_cis-\JINVAR{- tmpl_data.stats_numrows -}-2.north east);
35
- \end{pgfonlayer}
36
- % Header row - column heads
37
- \matrix[hrow,
38
- above = 0 pt of stats_cis,
39
- column 1/.style = {
40
- nodes = {
41
- minimum height = 33pt,
42
- text width = 60pt,
43
- text depth = 8pt,
44
- align = left,
45
- inner sep = 3pt,
46
- },
47
- },
48
- column 2/.style = {
49
- nodes = {
50
- minimum height = 83pt,
51
- text width = 60pt,
52
- text depth = 8pt,
53
- align = left,
54
- inner sep = 3pt,
55
- },
56
- },
57
- ] (hdrrow_cis) {
58
- \node[rotate = 90] (hdr1) {Relative \\ Frequency \\}; &
59
- \node[rotate = 90] (hdr2) {\JINVAR{ prop_title|replace(" ", "\\\\") } \\ {[95\% CI]} \\}; \\
60
- };
61
- % Header row - columns description
62
- \matrix[hrow,
63
- above = 0pt of hdrrow_cis,
64
- nodes = {minimum height = 12.5pt, text width = 115.6pt,}
65
- ] (descrow_cis) {
66
- Observed Data \\
67
- };
68
-
69
- % Header column - row heads
70
- \matrix[hcol, left = 0pt of stats_cis, nodes = {
71
- text width = \JINVAR{ tmpl_data.hdrcol_cis_width -},
72
- inner xsep = 3 pt,
73
- },] (hdrcol_cis) {
74
- \JINVAR{ tmpl_data.stats_hdrstr -}
75
- };
76
- % Header column - row heads - description
77
- \JINVAR{ tmpl_data.hdrcoldescstr }
78
-
79
- % Fill along header
80
- \draw[color = OBSHDRFill, fill = OBSHDRFill,]
81
- (hdrcoldesc_cis.north west |- descrow_cis.north west)
82
- rectangle
83
- (hdrcoldesc_cis.north east); % (x1, y2); -| gives (x2, y1)
84
-
85
- % Notes below table
86
- \matrix[anytable,
87
- below right = 4pt and 8pt of hdrcol_cis.south west,
88
- nodes = {notetext, minimum height = 10pt, text width = \JINVAR{ tmpl_data.stats_cis_notewidth -}\linewidth,},
89
- ] (notestext) {
90
- NOTES: \\
91
- \JINVAR{ tmpl_data.stats_cis_notestr -}
92
- \\
93
- SOURCES: \\
94
- \(\cdot\) See notes to Table~\ref{tbl:FTCInvData_\JINVAR{ tmpl_data.obs_summary_type|replace(" ", "") -}} for Observed Data \\
95
- };
96
-
97
- % === Simulated clearance rate data and headers ===
98
- \begin{pgfonlayer}{background}
99
- \matrix[datatable, right = 3pt of stats_cis, nodes = {text width = 27pt,},
100
- ] (stats_sim) {
101
- \JINVAR{ tmpl_data.stats_sim -}
102
- };
103
- \draw[color = SIMHDRFill, line width = 1pt,] (stats_sim-\JINVAR{- tmpl_data.stats_numrows -}-1.north west) -- (stats_sim-\JINVAR{- tmpl_data.stats_numrows -}-4.north east);
104
- \end{pgfonlayer}
105
- % Header row - column heads
106
- \matrix[hrow,
107
- above = 0pt of stats_sim,
108
- nodes = {fill = SIMHDRFill, minimum height = 33pt, text width = 60pt, text depth = 16pt, align = left, inner sep = 3pt,}, %
109
- column 1/.style = {nodes = {text depth = 8pt, },},
110
- ] (hdrrow_sim) {
111
- \node [rotate = 90, pos = 0.0] {Relative \\ Frequency \\}; &
112
- \node [rotate = 90, pos = 0.0] {\JINVAR{tmpl_data.PolicySelector -} \\ Rate \\ {\tiny \(\safeharb{g} = \JINVAR{ tmpl_data.guppi_bound -}; \safeharb{d} = \JINVAR{ tmpl_data.rbar -}\)} \\}; &
113
- \node [rotate = 90, pos = 0.0] {\JINVAR{tmpl_data.PolicySelector -} \\ Rate \\ {\tiny \(\safeharb{g} = \JINVAR{ tmpl_data.guppi_bound -}; \safeharb{d} = \JINVAR{ tmpl_data.dbar -}\)} \\}; &
114
- \node [rotate = 90, pos = 0.0] {\JINVAR{tmpl_data.PolicySelector -} \\ Rate \\ {\tiny \(\safeharb{CMCR} = \JINVAR{ tmpl_data.cmcr_bound -}\)} \\}; \\
115
- };
116
- \matrix[hrow, above = 0pt of hdrrow_sim,
117
- nodes = {fill = SIMHDRFill, minimum height = 12.5pt, text width = 130.8pt}] (hdrrowdesc_sim) {
118
- Generated Data \\
119
- };
120
- \end{tikzpicture}
121
- \end{table}
@@ -1,82 +0,0 @@
1
- \begin{table}[bt]
2
- ((* set obs_period_last = tmpl_data.obs_period|last *))
3
- ((* if tmpl_data.obs_merger_class == 'Entry Difficult' *))
4
- ((* set table_ref, obs_merger_class_desc = "9.2", "Markets with Strong Entry Barriers (``" + tmpl_data.obs_merger_class + "'')" *))
5
- ((* else *))
6
- ((* set table_ref, obs_merger_class_desc = "3.1", tmpl_data.obs_merger_class *))
7
- ((* endif *))
8
-
9
- ((* if obs_period_last == "2003" *))
10
- ((* set data_pub_year = "2004" *))
11
- ((* elif obs_period_last == "2011" *))
12
- ((* set data_pub_year = "2013" *))
13
- ((* else *))
14
- ((* set data_pub_year = "" *))
15
- ((* endif *))
16
-
17
- \centering
18
- \caption{FTC Merger Investigations Data, Fiscal Years \JINVAR{ tmpl_data.obs_period|join('--') }}\label{tbl:FTCInvData_ByConc_\JINVAR{ tmpl_data.obs_merger_class|replace(" ", "") -}_\JINVAR{ obs_period_last -}}
19
-
20
- {\footnotesize
21
- Odds ratio --- Enforced to Closed, by Post-Merger HHI and Change in Concentration \\
22
- \JINVAR{ obs_merger_class_desc } \\[0.5\baselineskip]
23
- }
24
- \begin{tikzpicture}[font = \sffamily]
25
- \matrix[datatable, nodes = {align = center, inner xsep = 0pt, text width = 40pt,}] (datamtrx) {
26
- \JINVAR{ tmpl_data.invdata_byhhianddelta -}
27
- };
28
- % Demarcate totals row (#9) and totals column (#9)
29
- \draw[color = OBSHDRFill, line width = 1pt,] (datamtrx-1-9.north west) -- (datamtrx-9-9.south west);
30
- \draw[color = OBSHDRFill, line width = 1pt,] (datamtrx-9-1.north west) -- (datamtrx-9-9.north east);
31
- % Header row - column heads
32
- \matrix[hrow, above = 0pt of datamtrx, nodes = {minimum height = 36pt}] (hdrrow) {
33
- {0 -- \\ 99} & {100 -- \\ 199} & {200 -- \\ 299} & {300 -- \\ 499} & {500 -- \\ 799} & {800 -- \\ 1,199} & {1,200 -- \\ 2,499} & 2,500 -- 5,000 & TOTAL \\
34
- };
35
- % Header column - row headings
36
- \matrix[hcol, left = 0pt of datamtrx] (hdrcol) {
37
- 0 -- 1,799 \\
38
- 1,800 -- 1,999 \\
39
- 2,000 -- 2,399 \\
40
- 2,400 -- 2,999 \\
41
- 3,000 -- 3,999 \\
42
- 4,000 -- 4,999 \\
43
- 5,000 -- 6,999 \\
44
- 7,000 -- 10,000 \\
45
- TOTAL \\
46
- };
47
- % Notes below table
48
- \matrix[anytable, below right = 4pt and -4pt of hdrcol.south west, nodes = {notetext, minimum height = 10pt, text width = 0.92*\linewidth,},] (notestext) {%
49
- \JINVAR{ tmpl_data.invdata_notestr -}
50
- SOURCES: \\
51
- \JINVAR{ tmpl_data.invdata_sourcestr -}
52
- \(\cdot\) Guidelines standards from (a.) \fullcite{USHMG1992} and (b.) \fullcite{USHMG2010} \\
53
- };
54
-
55
- % Demarcate the yellow(?) and red zones in 1992 Guidelines standards
56
- \draw[draw = VibrRed, line width = 1.25pt]
57
- (datamtrx-9-1.south east)
58
- -- (datamtrx-1-1.south east)
59
- -- (datamtrx-1-9.south east)
60
- ;
61
- \draw[draw = VibrRed, line width = 1.25pt, dashed]
62
- (datamtrx-9-2.south east)
63
- -- (datamtrx-3-2.south east)
64
- -- (datamtrx-3-9.south east)
65
- ;
66
-
67
- % Text height for descriptive titles is defined as 12pt (at two places below, one for each descriptor)
68
- % Header (first) row - description of column heads
69
- \draw[hdrtext, draw = OBSHDRFill] %
70
- ($(hdrrow.north west) + (0pt, +12pt)$) node (hdrrowdescNW) {}
71
- rectangle
72
- (hdrrow.north east) node[pos=0.5, anchor = north] {Change in Concentration (\Deltah{})};
73
- % Header (first) colum - description of row heads
74
- \draw[hdrtext, draw = OBSHDRFill]
75
- ($(hdrcol.north west) + (-12pt, 0pt)$) node (hdrcoldescNW) {}
76
- rectangle
77
- (hdrcol.south west) node[pos=0.5, rotate = 90] {Post-merger HHI \(\left(\mathrm{HHI}_{post}\right)\)};
78
-
79
- % Fill top left corner, with more or fewer header/descriptor rows, only the top-left coordinates change
80
- \draw[hdrtext, draw = OBSHDRFill] (hdrcoldescNW |- hdrrowdescNW) rectangle (datamtrx.north west); % (x1, y2); -| gives (x2, y1)
81
- \end{tikzpicture}
82
- \end{table}
@@ -1,57 +0,0 @@
1
- \begin{table}[bt]
2
- %# jinja2 code blocks for creating variables here
3
- %# Spurious blank lines don't matter?
4
- ((* if tmpl_data.obs_merger_class == 'Entry Difficult' *))
5
- ((* set table_ref, obs_merger_class_desc = "9.2", "Markets with Strong Entry Barriers (``" + tmpl_data.obs_merger_class + "'')" *))
6
- ((* else *))
7
- ((* set table_ref, obs_merger_class_desc = "3.1", tmpl_data.obs_merger_class *))
8
- ((* endif *))
9
-
10
- \centering
11
- \caption{FTC Merger Investigations Data}\label{tbl:FTCInvData_\JINVAR{ tmpl_data.obs_summary_type|replace(" ", "") -}_\JINVAR{ tmpl_data.obs_merger_class|replace(" ", "") -}}
12
- {\footnotesize \JINVAR{ tmpl_data.obs_summary_type_title } \\
13
- \JINVAR{ obs_merger_class_desc } \\[0.5\baselineskip]}
14
- \begin{tikzpicture}[auto, font = \sffamily]
15
- \begin{pgfonlayer}{background}
16
- \matrix[datatable, nodes = {text width = 42pt,},] (clr_rate_raw) {
17
- \JINVAR{ tmpl_data.invdata_datstr|replace("nan\%", "---") -}
18
- };
19
- \draw[color = OBSHDRFill, line width = 1pt] (clr_rate_raw-11-1.north west) -- (clr_rate_raw-11-4.north east);
20
- \draw[color = OBSHDRFill, line width = 1pt] (clr_rate_raw-1-2.north east) -- (clr_rate_raw-11-2.south east);
21
- \end{pgfonlayer}
22
-
23
- % Header row - column heads
24
- \matrix[hrow, above = 0 pt of clr_rate_raw, nodes = {align = right, inner xsep = 3pt, minimum height = 12.5pt, text width = 42pt},] (hdrrow_raw) {
25
- Relative & Proportion & Relative & Proportion \\
26
- Frequency & Cleared & Frequency & Cleared \\
27
- };
28
- % Header row - columns description -- period 1
29
- \matrix[hrow, above right = 0pt of hdrrow_raw.north west, nodes = {minimum height = 12.5pt, text width = 95.6pt,},] (descrow_raw_pd1) {
30
- 1996--2003 \\
31
- };
32
- % Header row - columns description -- period 2
33
- \matrix[hrow, above left = 0pt of hdrrow_raw.north east, nodes = {minimum height = 12.5pt, text width = 95.6pt,},] (descrow_raw_pd2) {
34
- 2004--2011 \\
35
- };
36
- % Header row - columns description
37
- \matrix[hrow, above left = 0pt of descrow_raw_pd2.north east, nodes = {minimum height = 12.5pt, text width = 190.8pt},] (descrow_raw) {
38
- Observed Data \\
39
- };
40
- % Header column - row heads
41
- \matrix[hcol, left = 0pt of clr_rate_raw, nodes = {text width = 108pt},] (hdrcol_raw) {
42
- \JINVAR{ tmpl_data.invdata_hdrstr -}
43
- };
44
- % Header column - row heads - description
45
- \JINVAR{ tmpl_data.invdata_hdrcoldescstr }
46
-
47
- % Notes below table
48
- \matrix[anytable, below right = 4pt and 4pt of hdrcol_raw.south west, nodes = {notetext, minimum height = 10pt, text width = 0.72*\linewidth,},] (notestext) {
49
- \JINVAR{ tmpl_data.invdata_notestr }
50
- SOURCES: \\
51
- % \(\cdot\) Fed. Trade Comm'n (2004), \textit{supra} note~\ref{fn:FTCInvData1996to2003}, Table~4.1 and Table~10.2 \\
52
- \JINVAR{ tmpl_data.invdata_sourcestr }
53
- % \(\cdot\) Fed. Trade Comm'n (2013), \textit{supra} note~\ref{fn:FTCInvData1996to2011}, Table~4.1 and Table~10.2 \\
54
- };
55
- \end{tikzpicture}
56
- \end{table}
57
-
@@ -1,81 +0,0 @@
1
- \begin{table}[t]
2
-
3
- ((* if tmpl_data.obs_merger_class_0 == 'All Markets' *))
4
- ((* set obs_merger_class_0 = "All Markets" *))
5
- ((* else *))
6
- ((* set obs_merger_class_0 = "Markets with, ``" + tmpl_data.obs_merger_class_0 + "''" *))
7
- ((* endif *))
8
-
9
- ((* set obs_merger_class_1 = "Markets with, ``" + tmpl_data.obs_merger_class_1 + "''" *))
10
-
11
- \centering
12
- \caption{FTC Merger Investigations Data}\label{tbl:FTCInvData_\JINVAR{- tmpl_data.obs_summary_type }_alt}
13
- {\footnotesize
14
- \JINVAR{ tmpl_data.obs_summary_type_title } \\
15
- Grouped by Entry Conditions and Reporting Period \\[0.5\baselineskip]
16
- }
17
-
18
- \sffamily\scriptsize\addfontfeatures{Numbers={Monospaced,Lining}}
19
- \SetTblrInner{stretch=0, rowsep=3pt, colsep=3pt, hspan=even}
20
- \begin{tikzpicture}[auto, font = \sffamily]
21
- \begin{tblr}{
22
- baseline=T,
23
- width=\textwidth,
24
- colspec = {%
25
- Q[c,m,wd=\JINVAR{ tmpl_data.hdrcol_width }]%
26
- Q[r,m]%
27
- Q[r,m]%
28
- Q[r,m]%
29
- Q[r,m]%
30
- Q[r,m]%
31
- Q[r,m]%
32
- Q[r,m]%
33
- Q[r,m]%
34
- },
35
- row{odd[6]} = {bg=table_bar_green},
36
- row{1-5} = {fg=white, bg=OBSHDRFill},
37
- column{1} = {fg=white, bg=OBSHDRFill},
38
- cell{1}{1} = {r=5, c=1}{c, f},
39
- cell{1}{2} = {r=1, c=8}{c},
40
- cell{2}{2,6} = {r=1, c=4}{c},
41
- cell{3,4}{2,4,6,8} = {r=1, c=2}{c},
42
- cell{5}{2-9} = {r, m, cmd=\rothead},
43
- vline{4,8} = {3-5}{1pt, white},
44
- vline{6} = {2-5}{1pt, white},
45
- vline{4,6,8} = {6-Z}{1pt, OBSHDRFill},
46
- hline{Y} = {1-Z}{1pt, OBSHDRFill},
47
- }
48
- { \JINVAR{- tmpl_data.hdrcol_desc_text } } &
49
- Observed Data & & & & & & & \\
50
- sp0 &
51
- \JINVAR{ obs_merger_class_0 } & sp0 & sp0 & sp0 &
52
- \JINVAR{ obs_merger_class_1 } & sp0 & sp0 & sp0 \\
53
- sp0 &
54
- \JINVAR{ tmpl_data.obs_periods_str|replace(" & ", " & sp0 & ") } & sp0 &
55
- \JINVAR{ tmpl_data.obs_periods_str|replace(" & ", " & sp0 & ") } & sp0 \\
56
- sp0 &
57
- \JINVAR{ tmpl_data.mkt_counts_str_class_0|replace(" & ", " & sp0 & ") } & sp0 &
58
- \JINVAR{ tmpl_data.mkt_counts_str_class_0|replace(" & ", " & sp0 & ") } & sp0 \\
59
- sp0 &
60
- {Relative \\ Frequency} &
61
- {Proportion \\ Enforced} &
62
- {Relative \\ Frequency} &
63
- {Proportion \\ Enforced} &
64
- {Relative\\ Frequency} &
65
- {Proportion \\ Enforced} &
66
- {Relative \\ Frequency} &
67
- {Proportion \\ Enforced} \\
68
- %
69
- \JINVAR{ tmpl_data.invdata_datstr -}
70
- \end{tblr}
71
- \end{tikzpicture}
72
-
73
- \setlist{nosep}
74
- \vspace{\baselineskip}
75
- {\raggedright\sffamily\tiny
76
- \JINVAR{ tmpl_data.invdata_notestr }
77
- \vspace{\baselineskip}
78
- \JINVAR{ tmpl_data.invdata_sourcestr }
79
- }
80
- \vspace{\baselineskip}
81
- \end{table}