Type: | Package |
Title: | Healthcare Antitrust Analysis |
Version: | 0.1.4 |
Description: | Antitrust analysis of healthcare markets. Contains functions to implement the semiparametric estimation technique described in Raval, Rosenbaum, and Tenn (2017) "A Semiparametric Discrete Choice Model: An Application to Hospital Mergers" <doi:10.1111/ecin.12454>. |
License: | CC0 |
Copyright: | As a work of the United States government, this project is in the public domain within the United States. Additionally, we waive copyright and related rights in the work worldwide through the CC0 1.0 Universal public domain dedication. |
Encoding: | UTF-8 |
LazyData: | true |
Depends: | R (≥ 2.10) |
Imports: | methods, stats |
Suggests: | knitr, rmarkdown |
VignetteBuilder: | knitr |
RoxygenNote: | 7.2.3 |
URL: | https://github.com/mpanhans/healthcare.antitrust |
NeedsCompilation: | no |
Packaged: | 2024-01-08 17:11:18 UTC; mattpanhans |
Author: | Matthew T Panhans |
Maintainer: | Matthew T Panhans <mpanhans@gmail.com> |
Repository: | CRAN |
Date/Publication: | 2024-01-09 00:20:02 UTC |
healthcare.antitrust: Healthcare Antitrust Analysis
Description
Antitrust analysis of healthcare markets. Contains functions to implement the semiparametric estimation technique described in Raval, Rosenbaum, and Tenn (2017) "A Semiparametric Discrete Choice Model: An Application to Hospital Mergers" doi:10.1111/ecin.12454.
Details
For more details see the example vignette by typing:
vignette("semipar_example", package = "healthcare.antitrust")
Author(s)
Maintainer: Matthew T Panhans mpanhans@gmail.com (ORCID)
See Also
Useful links:
Allocate Observations to Cells
Description
Take a dataset of hospital discharges, and assigns them to cells that meet a minimum threshold cell size.
Usage
cell_defn(data, min_size, layers, count = "count", expandLayers = FALSE)
Arguments
data |
Dataset of discharges. |
min_size |
Minimize cell size. |
layers |
A list of lists. Each layer is a list of the variables on which observations will be allocated to cells. The layers should be ordered in decreasing refinement, so that observations not assigned to a cell meeting the minimum size threshold can be assigned by a more coarse layer. |
count |
Name of variable which indicates the number of admissions
represented by an observation. Default variable name is |
expandLayers |
logical; if only a single layer is given, setting this to TRUE will expand the layer to a set of layers where each layer drops the last variable in the list of the previous layer. |
Details
If the variable count
is not available, the function will assume that
each observation represents one admission, and a variable count
will
be created in the output data frame to indicate this.
When assigning observations to cells in a given layer, this function only assigns observations that have not been previously assigned in a finer layer. That is, the function assigns observations without replacement. Assignment with replacement is currently not supported.
For more details see the example vignette by typing:
vignette("semipar_example", package = "healthcare.antitrust")
Value
A list of data frames. The first component in the list, assigned
,
is the original data frame, with observations assigned to cells, and
excluding observations that were not assigned. The assigned cells are
designated by the variable cell
, and the layer number in
which the observation is assigned to the cell is given by the variable
cell_type
. The second component of the list, unassigned
, is a
data frame with the unassigned observations.
Examples
data(discharge_data, package = "healthcare.antitrust")
list1 <- c("drg","age","zip5")
layers <- list(list1)
th <- 15
discharge_data$count <- 1
outList <- cell_defn(discharge_data,th,layers)
A simulated dataset of hospital discharges
Description
A simulated dataset of hospital discharges containing patient characteristics.
Usage
discharge_data
Format
A data frame with 1,200 rows (one for each discharge) and 7 variables:
- drg
diagnosis related group (drg) code for the admission
- age
patient age
- zip5
patient 5 digit zip code of residence
- hosp_id
hospital identifier
- hospital
hospital name
- sys_id
system identifier
- system
system name
Source
Created as part of healthcare.antitrust package.
Diversion Ratio Calculator
Description
Calculates provider-level diversion ratios, once cells have been defined.
Usage
div_calc(
data,
cell = "cell",
provider_id = "provider_id",
provider = "provider",
sys_id = "sys_id",
focal_sys_id = NULL,
party_ind = "party_ind",
count = "count",
dropDegenerateCell = TRUE,
hosp_id = NA,
hospital = NA
)
Arguments
data |
Dataset of patient choices, with required variables:
|
cell |
Name of variable specifying cell to which each observation
has been allocated. Default variable name is |
provider_id |
Name of variable specifying (numeric) provider
identifier. Default variable name is |
provider |
Name of variable specifying (string) provider name.
Default variable name is |
sys_id |
Name of variable specifying (numeric) system identifier.
Default variable name is |
focal_sys_id |
numeric; list of sys_id's specifying systems of interest for which diversions will be calculated from. For a merger, this will typically be the system identifies of the merging parties. |
party_ind |
deprecated; use focal_sys_id instead. |
count |
Name of variable indicating the number of admissions represented by the observation. Set = 1 for every row if each observation represents one admission. |
dropDegenerateCell |
logical; specifies how to treat cells with a 100 percent within-system share. If TRUE, observations in degenerate, 100 percent share cells will be ignored in the diversion ratio calculation. If FALSE, any such individuals will be assigned to the outside option, but still included in the denominator, so that the inside-option diversion will total less than 100 percent. |
hosp_id |
deprecated; use provider_id instead. |
hospital |
deprecated; use provider instead. |
Details
For system-to-system diversions, set provider_id
and
provider
equal to corresponding system-level identifiers.
Diversions then reflect that patients are not allowed to divert to
within-system alternative providers
For more details see the example vignette by typing:
vignette("semipar_example", package = "healthcare.antitrust")
Value
A list with two components. The first component, provider_level
,
is a matrix giving provider-level diversions from party providers to
all other providers The second object, sys_level
, is a matrix that
aggregates party providers to systems, thus giving diversions from party
systems to all other providers
Examples
data(discharge_data, package = "healthcare.antitrust")
list1 <- c("drg","age","zip5")
layers <- list(list1)
th <- 15
discharge_data$count <- 1
outList <- cell_defn(discharge_data,th,layers)
D0 <- outList$assigned
out <- div_calc(D0, provider_id = "hosp_id", provider = "hospital",
focal_sys_id = c(1,5))
Willingness-to-Pay Calculator
Description
This function calculates the system-level Willingness-To-Pay.
Usage
wtp_calc(
data,
cell = "cell",
sys_id = "sys_id",
count = "count",
weight = "weight",
dropDegenerateCell = TRUE
)
Arguments
data |
Dataset of hospital discharges. Required variables:
|
cell |
Name of variable specifying cell to which each observation
has been allocated. Default variable name is |
sys_id |
Name of variable specifying (numeric) system identifier.
Default variable name is |
count |
Name of variable indicating the number of admissions represented by the observation. Set = 1 for every row if each observation represents one admission. |
weight |
Name of variable indicating designated weight of admission; =1 if observations should be equally weighted. |
dropDegenerateCell |
logical; specifies how to treat cells with a 100 percent within-system share. If TRUE, observations in degenerate, 100 percent share cells will be ignored in the WTP calculation. If FALSE, an adjustment is made where any cells with > 99 percent share at a single hospital have the share set to 99.0 percent. |
Details
This function calculates the system-level WTP. For use in a WTP
simulation exercise of the "WTP/Q Method" described in Brand and Balan
(2018) doi:10.2139/SSRN.3153109.
Hospital systems need to be numbered by sys_id
, with a distinct
sys_id
for each independent hospital.
The weight
input might for example be a DRG weight for each inpatient
hospital admission.
For more details see the example vignette by typing:
vignette("semipar_example", package = "healthcare.antitrust")
Value
A data frame with the number of rows equal to the number of systems
in the input data frame, and the following variables: sys_id
is the system
identifier, WTP_s
is the system's WTP, N_s
is the number of admission
for the system, and WTP_s_wt
is the weighted WTP for the system
if the weight input is provided.
Examples
data(discharge_data, package = "healthcare.antitrust")
list1 <- c("drg","age","zip5")
layers <- list(list1)
th <- 15
discharge_data$count <- 1
outList <- cell_defn(discharge_data,th,layers)
D0 <- outList$assigned
out <- wtp_calc(D0)