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)
| 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 | ▇▁▁▁▇ |
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
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
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)
| 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 | ▇▁▁▁▆ |
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
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