1 Aggregate Models

1.1 Dataframe: final

str(final)
## tibble [55,125 × 13] (S3: tbl_df/tbl/data.frame)
##  $ quantity     : num [1:55125] 1 1 1 1 1 1 1 1 1 1 ...
##  $ yn           : chr [1:55125] "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" ...
##  $ state        : chr [1:55125] "MA" "SC" "MA" "CA" ...
##  $ year         : num [1:55125] 2021 2022 2023 2023 2020 ...
##  $ spoke_obgyn  : num [1:55125] 1 1 1 1 1 1 1 1 1 1 ...
##  $ total_obgyn  : num [1:55125] 480 160 740 3120 1830 3120 900 380 210 2220 ...
##  $ policy       : Factor w/ 3 levels "Protected","Limited",..: 1 3 1 1 1 1 1 1 1 1 ...
##  $ pop          : num [1:55125] 1391077 978053 1394094 7848896 4128020 ...
##  $ provider_rate: num [1:55125] 34.5 16.4 53.1 39.8 44.3 ...
##  $ exam_rate    : num [1:55125] 0.573 0.579 0.52 0.545 0.677 ...
##  $ post_dobbs   : chr [1:55125] "Pre-Dobbs" "Post-Dobbs" "Post-Dobbs" "Post-Dobbs" ...
##  $ trajectory   : num [1:55125] 1 2 1 1 1 1 1 1 1 1 ...
##  $ post         : int [1:55125] 0 1 1 1 0 1 1 0 1 0 ...
skim(final)
Data summary
Name final
Number of rows 55125
Number of columns 13
_______________________
Column type frequency:
character 3
factor 1
numeric 9
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
yn 0 1 9 21 0 4 0
state 0 1 2 2 0 30 0
post_dobbs 0 1 9 10 0 2 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
policy 0 1 FALSE 3 Pro: 46650, Ban: 7664, Lim: 811

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
quantity 24717 0.55 2.76 3.19 1.00 1.00 1.00 2.50 16.00 ▇▁▁▁▁
year 0 1.00 2021.11 1.57 2018.00 2020.00 2021.00 2022.00 2023.00 ▆▆▅▇▇
spoke_obgyn 2343 0.96 0.59 0.49 0.00 0.00 1.00 1.00 1.00 ▆▁▁▁▇
total_obgyn 0 1.00 892.63 758.47 30.00 410.00 610.00 1050.00 3120.00 ▇▃▂▂▁
pop 0 1.00 2940134.55 2429758.83 112061.00 1178137.00 2192169.00 3848958.00 8127065.00 ▇▇▂▁▃
provider_rate 0 1.00 31.90 13.73 8.24 20.46 28.43 40.10 95.36 ▆▇▃▁▁
exam_rate 0 1.00 0.56 0.07 0.23 0.53 0.55 0.61 1.00 ▁▅▇▁▁
trajectory 0 1.00 1.30 0.46 1.00 1.00 1.00 2.00 2.00 ▇▁▁▁▃
post 0 1.00 0.48 0.50 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▇

1.1.1 Aggregate event studies models

did_provider <- feols(
  provider_rate ~ i(policy, post, ref = "Protected") |
    state + year,
  data = final,
  cluster = ~state)

did_exam <- feols(
  exam_rate ~ i(policy, post, ref = "Protected") |
    state + year,
  data = final,
  cluster = ~state)

etable(
  did_exam,
  did_provider,
  ci = 0.95,
  coefstat = "confint"
)
##                                          did_exam            did_provider
## Dependent Var.:                         exam_rate           provider_rate
##                                                                          
## post x policy = Limited -0.0133 [-0.0373; 0.0108]  -6.747 [-15.15; 1.658]
## post x policy = Banned  0.0202. [-0.0011; 0.0415] -0.1524 [-12.54; 12.23]
## Fixed-Effects:          ------------------------- -----------------------
## state                                         Yes                     Yes
## year                                          Yes                     Yes
## _______________________ _________________________ _______________________
## VCOV: Clustered                         by: state               by: state
## Observations                               55,125                  55,125
## R2                                        0.82902                 0.71595
## Within R2                                 0.02234                 0.00390
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

1.1.2 Aggregate post Dobbs t-test models for restrictive states

prov_rate_2022 <- t.test(
  provider_rate ~ policy,
  data = final %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2022))

prov_rate_2023 <- t.test(
  provider_rate ~ policy,
  data = final %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2023))

exam_rate_2022 <- t.test(
  exam_rate ~ policy,
  data = final %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2022))

exam_rate_2023 <- t.test(
  exam_rate ~ policy,
  data = final %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2023))

prov_rate_2023
## 
##  Welch Two Sample t-test
## 
## data:  provider_rate by policy
## t = -10.801, df = 3603, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -3.336498 -2.311326
## sample estimates:
## mean in group Limited  mean in group Banned 
##              23.83904              26.66295
prov_rate_2023
## 
##  Welch Two Sample t-test
## 
## data:  provider_rate by policy
## t = -10.801, df = 3603, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -3.336498 -2.311326
## sample estimates:
## mean in group Limited  mean in group Banned 
##              23.83904              26.66295
exam_rate_2022
## 
##  Welch Two Sample t-test
## 
## data:  exam_rate by policy
## t = -44.916, df = 4009.3, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -0.05321353 -0.04876237
## sample estimates:
## mean in group Limited  mean in group Banned 
##             0.4839744             0.5349623
exam_rate_2023
## 
##  Welch Two Sample t-test
## 
## data:  exam_rate by policy
## t = -11.772, df = 550.45, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -0.04117040 -0.02939567
## sample estimates:
## mean in group Limited  mean in group Banned 
##              0.501002              0.536285

2 Preventative Care Models (Non-Pregnant)

2.1 Dataframe: final.np

str(final.np)
## tibble [143,596 × 15] (S3: tbl_df/tbl/data.frame)
##  $ quantity     : num [1:143596] 1 1 1 1 1 1 1 1 1 1 ...
##  $ yn           : chr [1:143596] "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" "Spoken To OB/GYN: Yes" ...
##  $ state        : chr [1:143596] "MA" "SC" "MA" "CA" ...
##  $ year         : num [1:143596] 2021 2022 2023 2023 2020 ...
##  $ spoke_obgyn  : num [1:143596] 1 1 1 1 1 1 1 1 1 1 ...
##  $ total_obgyn  : num [1:143596] 480 160 740 3120 1830 3120 900 380 210 2220 ...
##  $ policy       : Factor w/ 3 levels "Protected","Limited",..: 1 3 1 1 1 1 1 1 1 1 ...
##  $ pop          : num [1:143596] 1391077 978053 1394094 7848896 4128020 ...
##  $ provider_rate: num [1:143596] 34.5 16.4 53.1 39.8 44.3 ...
##  $ exam_rate    : num [1:143596] 0.573 0.579 0.52 0.545 0.677 ...
##  $ post_dobbs   : chr [1:143596] "Pre-Dobbs" "Post-Dobbs" "Post-Dobbs" "Post-Dobbs" ...
##  $ trajectory   : num [1:143596] 1 2 1 1 1 1 1 1 1 1 ...
##  $ preg         : num [1:143596] 0 0 0 0 0 0 0 0 0 0 ...
##  $ preg_f       : Factor w/ 2 levels "Not Pregnant",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ post         : int [1:143596] 0 1 1 1 0 1 1 0 1 0 ...
skim(final.np)
Data summary
Name final.np
Number of rows 143596
Number of columns 15
_______________________
Column type frequency:
character 3
factor 2
numeric 10
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
yn 0 1 9 21 0 4 0
state 0 1 2 2 0 30 0
post_dobbs 0 1 9 10 0 2 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
policy 0 1 FALSE 3 Pro: 129038, Ban: 13741, Lim: 817
preg_f 0 1 FALSE 2 Pre: 91042, Not: 52554

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
quantity 38717 0.73 6.34 5.35 1.00 2.50 4.50 11.00 16.00 ▇▃▁▂▃
year 0 1.00 2020.93 1.52 2018.00 2020.00 2021.00 2022.00 2023.00 ▇▇▇▇▆
spoke_obgyn 5371 0.96 0.79 0.41 0.00 1.00 1.00 1.00 1.00 ▂▁▁▁▇
total_obgyn 0 1.00 889.76 732.31 30.00 430.00 610.00 930.00 3120.00 ▇▃▂▂▁
pop 0 1.00 2583461.14 2090527.17 112061.00 1215858.00 1424585.00 2532277.00 8127065.00 ▇▃▂▁▂
provider_rate 0 1.00 35.48 14.27 8.24 23.99 34.51 44.33 95.36 ▅▇▅▂▁
exam_rate 0 1.00 0.57 0.08 0.23 0.52 0.56 0.61 1.00 ▁▅▇▁▁
trajectory 0 1.00 1.25 0.43 1.00 1.00 1.00 1.00 2.00 ▇▁▁▁▂
preg 0 1.00 0.63 0.48 0.00 0.00 1.00 1.00 1.00 ▅▁▁▁▇
post 0 1.00 0.41 0.49 0.00 0.00 0.00 1.00 1.00 ▇▁▁▁▆

2.1.1 Preventative care (non-pregnant) event studies models

prev_did_provider <- feols(
  provider_rate ~ i(policy, post, ref = "Protected") |
    state + year,
  data = final.np,
  cluster = ~state)

prev_did_exam <- feols(
  exam_rate ~ i(policy, post, ref = "Protected") |
    state + year,
  data = final.np,
  cluster = ~state)

etable(
  prev_did_exam,
  prev_did_provider,
  ci = 0.95,
  coefstat = "confint"
)
##                                     prev_did_exam        prev_did_provider
## Dependent Var.:                         exam_rate            provider_rate
##                                                                           
## post x policy = Limited  0.0101* [0.0002; 0.0200] -9.768* [-18.37; -1.164]
## post x policy = Banned  0.0250** [0.0099; 0.0401]  -0.3206 [-13.41; 12.76]
## Fixed-Effects:          ------------------------- ------------------------
## state                                         Yes                      Yes
## year                                          Yes                      Yes
## _______________________ _________________________ ________________________
## VCOV: Clustered                         by: state                by: state
## Observations                              143,596                  143,596
## R2                                        0.85928                  0.79053
## Within R2                                 0.03111                  0.00449
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

2.1.2 Preventative care (non-pregnant) post Dobbs t-test models for restrictive states

prev_prov_rate_2022 <- t.test(
  provider_rate ~ policy,
  data = final.np %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2022))

prev_prov_rate_2023 <-  t.test(
  provider_rate ~ policy,
  data = final.np %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2023))

prev_exam_rate_2022 <- t.test(
  exam_rate ~ policy,
  data = final.np %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2022))

prev_exam_rate_2023 <-  t.test(
  exam_rate ~ policy,
  data = final.np %>%
    dplyr::filter(policy %in% c("Limited", "Banned"),
                  year == 2023))

prev_prov_rate_2022
## 
##  Welch Two Sample t-test
## 
## data:  provider_rate by policy
## t = -35.59, df = 6836.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -6.602040 -5.912731
## sample estimates:
## mean in group Limited  mean in group Banned 
##              30.09702              36.35440
prev_prov_rate_2023
## 
##  Welch Two Sample t-test
## 
## data:  provider_rate by policy
## t = -32.176, df = 3248.9, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -7.712914 -6.826903
## sample estimates:
## mean in group Limited  mean in group Banned 
##              23.86088              31.13079
prev_exam_rate_2022
## 
##  Welch Two Sample t-test
## 
## data:  exam_rate by policy
## t = -41.755, df = 4143.8, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -0.03711218 -0.03378339
## sample estimates:
## mean in group Limited  mean in group Banned 
##             0.4839744             0.5194221
prev_exam_rate_2023
## 
##  Welch Two Sample t-test
## 
## data:  exam_rate by policy
## t = -8.5591, df = 536.07, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Limited and group Banned is not equal to 0
## 95 percent confidence interval:
##  -0.03105208 -0.01945920
## sample estimates:
## mean in group Limited  mean in group Banned 
##             0.5009398             0.5261955