In this document, I’ll go through the process of Coarsened Exact Matching (CEM), which allows us to only include comparable counties in the dataset we have been working on. Through this process, we can minimize the imbalance in covariates, which can be problematic for the full regression model.
To conduct CEM in R, we will use cem package. The method and the package have been developed and advanced by a team of researchers. You can find more details here.
set.seed(5000)
# install.packages("cem")
library(tidyverse)
library(cem)
library(ggplot2)
Clean the worksapce and import raw dataset from GitHub repository.
#rm(list = ls()) # Clean workspace
d <- read_csv("https://raw.githubusercontent.com/texastipi/broadband_entrepreneurship/master/Broadband-Entrepreneurship-TXKSME.csv")
glimpse(d)
CEM involves defining treatment, outcome, and covariate variables of interest. In our analysis, we are interested in the treatment effect of broadband-related variables on entrepreneurial outcome variables. The reason for conducting CEM is to address the imbalance in terms of various economic and demographic factors of different counties. Below are the treatment, outcome, and covariates.
For the listed treatment braodband variables, we split each variable into two categories (Low, High). Gallardo, Whitacre, Kumar, & Upendram (2021) used three categories and eliminated the ‘Medium’ category and consider ‘High’ as the treated group and ‘Low’ as untreated group. However, our sample is substantially smaller and we are more likely to end up with matched observations that are too small for any inferential statistical analysis considering the number of pre-treatment covariates. Therefore, we will convert the following variables to mean-based treatment categories:
pct_25_3_dec_2019_fcc: FCC 477 availability of broadband at 25/3Mbps per county (%, data as of Dec 2019)pct_100_10_dec_2019_fcc: FCC 477 availability of broadband at 100/10Mbps per county (%, data as of Dec 2019)pct_250_25_dec_2019_fcc: FCC 477 availability of broadband at 250/25Mbps per county (%, data as of Dec 2019)pct_1000_100_dec_2019_fcc: FCC 477 availability of broadband at 1000/100Mbps per county (%, data as of Dec 2019)pct_fixed_acs_2019: Fixed broadband service subscription according to ACS 5-year estimates (%, 2019)pct_bb_qos: Compostive broadband quality of service (QoS) measure based on Microsoft’s broadband through-put data (2020) and Mlab’s broadband test data (2018-2019) (%)For the entrepreneurial outcome variables, we investigate several measures of entrepreneurship that were used in the traditional multiple regression analysis. In addition, we explore non-farm proprietorship per capita as a new possible representation of entrepreneurship in a county.
pct_nonfarm_bea_2019: Share of non-farm proprietors over total employment of a county (%, 2019; Source: BEA)vd_mean_20: Average venture density (2020; Source: GoDaddy)havd_mean_20: Average highly active venture density (2020; Source: GoDaddy)nonfarmprop_percapita: Number of non-farm proprietors per capita (2019; Source: BEA)For covariates, we include several economic and demographic variables that could be closely related to the imbalance within the sample. To give an example, Gallardo et al. (2021) used natural log of population, % of people with bachelor’s degree, unemployment rate, and industry diversity index. Our full regression models used industry characteristics, education, age, and rurality as control variables. Here, we will use log of population, % of people with bachelor’s degree, unemployment rate, industry diversity index as covariates for matching. Rurality measures will be investigated in relation to the broadband treatments in the following regression models.
population_2019: Natural log of county population (2019)indstry_diversity: Industry diversty index calculated based on methods described by Gallardo et al. (2021)pctbachelors_2019: % of people with Bachelor’s degree (2019; Source: ACS 5-year estimates)pct_unemployment_2019: Unemployment rate (2019; Source: ACS 5-year estimates)RUCC_2013: Rural-Urban Continuum Codes developed by USDA (2013)metro_f: Metro/Non-Metro categories based on the RUCC documentationIRR2010: Rurality index created by Waldorf & Kim (2019). Continuous measure ranging from 0 to 1Let’s first create a subset of data with only the variables we need and some basic identities.
## Subset data with the aforementioned variables, create NLpop_2019 (natural log of population)
d2 <- d %>% select(county_FIPS, county.x,
pct25_3_dec_2019_fcc, pct100_10_dec_2019_fcc, pct250_25_dec_2019_fcc, pct1000_100_dec_2019_fcc,
pct_fixed_acs_2019, pct_bb_qos,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
population_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, RUCC_2013, metro_f, IRR2010) %>%
mutate(LNpop_2019 = log(population_2019))
Let’s create treatment variables by recoding the original variables. First, we’ll take a look at the variables distribution and create categories. For matching to work and be useful in the final analysis, we create categories based on average.
## Take a look at the broadband variable summaries
d2 %>% select(pct25_3_dec_2019_fcc, pct100_10_dec_2019_fcc, pct250_25_dec_2019_fcc, pct1000_100_dec_2019_fcc,
pct_fixed_acs_2019, pct_bb_qos) %>% summary()
## pct25_3_dec_2019_fcc pct100_10_dec_2019_fcc pct250_25_dec_2019_fcc pct1000_100_dec_2019_fcc pct_fixed_acs_2019 pct_bb_qos
## Min. :0.0009918 Min. :0.0000 Min. :0.00000 Min. :0.00000 Min. :0.0960 Min. :0.0000
## 1st Qu.:0.7885686 1st Qu.:0.4003 1st Qu.:0.04303 1st Qu.:0.00000 1st Qu.:0.4280 1st Qu.:0.2158
## Median :0.9193920 Median :0.6730 Median :0.44859 Median :0.02025 Median :0.5190 Median :0.3572
## Mean :0.8468896 Mean :0.6052 Mean :0.44310 Mean :0.16860 Mean :0.5176 Mean :0.3930
## 3rd Qu.:0.9910699 3rd Qu.:0.8776 3rd Qu.:0.78722 3rd Qu.:0.24036 3rd Qu.:0.6025 3rd Qu.:0.5643
## Max. :1.0000000 Max. :1.0000 Max. :1.00000 Max. :1.00000 Max. :0.8410 Max. :1.0000
## Use first and third quartile for creating categories
## For the 1000/100 Mbps measure, the 1st quartile is 0. Therefore, we will use mean split as an alternative
d2 <- d2 %>%
mutate(BB_25_3_high = case_when(pct25_3_dec_2019_fcc < mean(pct25_3_dec_2019_fcc, na.rm = T) ~ 0,
pct25_3_dec_2019_fcc > mean(pct25_3_dec_2019_fcc, na.rm = T) ~ 1,
TRUE ~ NA_real_),
BB_100_10_high = case_when(pct100_10_dec_2019_fcc < mean(pct100_10_dec_2019_fcc, na.rm = T) ~ 0,
pct100_10_dec_2019_fcc > mean(pct100_10_dec_2019_fcc, na.rm = T) ~ 1,
TRUE ~ NA_real_),
BB_250_25_high = case_when(pct250_25_dec_2019_fcc < mean(pct250_25_dec_2019_fcc, na.rm = T) ~ 0,
pct250_25_dec_2019_fcc > mean(pct250_25_dec_2019_fcc, na.rm = T) ~ 1,
TRUE ~ NA_real_),
BB_1000_100_high = case_when(pct1000_100_dec_2019_fcc < mean(pct1000_100_dec_2019_fcc, na.rm = T) ~ 0,
pct1000_100_dec_2019_fcc > mean(pct1000_100_dec_2019_fcc, na.rm = T) ~ 1,
TRUE ~ NA_real_),
BB_adoption_high = case_when(pct_fixed_acs_2019 < mean(pct_fixed_acs_2019, na.rm = T) ~ 0,
pct_fixed_acs_2019 > mean(pct_fixed_acs_2019, na.rm = T) ~ 1,
TRUE ~ NA_real_),
BB_qos_high = case_when(pct_bb_qos < mean(pct_bb_qos, na.rm = T) ~ 0,
pct_bb_qos > mean(pct_bb_qos, na.rm = T) ~ 1,
TRUE ~ NA_real_))
str(d2)
## tibble [375 × 26] (S3: tbl_df/tbl/data.frame)
## $ county_FIPS : num [1:375] 20001 20003 20005 20007 20009 ...
## $ county.x : chr [1:375] "Allen County" "Anderson" "Atchison" "Barber" ...
## $ pct25_3_dec_2019_fcc : num [1:375] 1 1 0.815 0.876 0.931 ...
## $ pct100_10_dec_2019_fcc : num [1:375] 0.746 0.382 0.765 0.835 0.931 ...
## $ pct250_25_dec_2019_fcc : num [1:375] 0.6507 0 0.0748 0.7789 0.7619 ...
## $ pct1000_100_dec_2019_fcc: num [1:375] 0.00509 0 0.07478 0.77886 0.02444 ...
## $ pct_fixed_acs_2019 : num [1:375] 0.568 0.45 0.531 0.641 0.622 0.548 0.571 0.59 0.411 0.366 ...
## $ pct_bb_qos : num [1:375] 0.618 0.161 0.419 0.334 0.476 ...
## $ pct_nonfarm_bea_2019 : num [1:375] 0.186 0.268 0.181 0.366 0.271 ...
## $ vd_mean_20 : num [1:375] 0.148 2.255 1.288 2.123 1.492 ...
## $ havd_mean_20 : num [1:375] 0.0249 0.4723 0.2745 0.7061 0.4667 ...
## $ nonfarmprop_percapita : num [1:375] 0.122 0.1367 0.0909 0.2634 0.1918 ...
## $ population_2019 : num [1:375] 12556 7835 16268 4624 26453 ...
## $ indstry_diversity : num [1:375] 0.849 0.868 0.865 0.862 0.889 ...
## $ pctbachelors_2019 : num [1:375] 0.203 0.181 0.22 0.207 0.209 0.217 0.212 0.298 0.255 0.159 ...
## $ pct_unemployment_2019 : num [1:375] 0.046 0.034 0.028 0.025 0.039 0.023 0.034 0.038 0.045 0.068 ...
## $ RUCC_2013 : num [1:375] 7 6 6 9 7 6 6 2 9 8 ...
## $ metro_f : chr [1:375] "Nonmetro" "Nonmetro" "Nonmetro" "Nonmetro" ...
## $ IRR2010 : num [1:375] 0.55 0.57 0.53 0.61 0.54 0.55 0.56 0.5 0.62 0.6 ...
## $ LNpop_2019 : num [1:375] 9.44 8.97 9.7 8.44 10.18 ...
## $ BB_25_3_high : num [1:375] 1 1 0 1 1 1 0 1 0 0 ...
## $ BB_100_10_high : num [1:375] 1 0 1 1 1 0 0 1 0 0 ...
## $ BB_250_25_high : num [1:375] 1 0 0 1 1 0 0 1 0 0 ...
## $ BB_1000_100_high : num [1:375] 0 0 0 1 0 0 0 0 0 0 ...
## $ BB_adoption_high : num [1:375] 1 0 1 1 1 1 1 1 0 0 ...
## $ BB_qos_high : num [1:375] 1 0 1 0 1 1 0 1 0 0 ...
We’ll now use cem package to match the sample to treatment based on the covariates we mentioned above.
Note that the package does not allow NAs in the treatment variable. Therefore, we have to create separate datasets for each treatment variable of interest.
Also, our sample size after omiting NAs will become substantially small. Especially as we are using 4 pre-treatment covariates for matching. This could be problematic, making the following regression analyses less effective and meaningful. Therefore, we will apply user choiced coarsening to the covariates. This will relax the categories for matching. Specifically, we will set custom cut points for each covariate by retrieving break points for 3 bins in the total range of each variable.
## Inspect how much observations are there in treated and control groups
table(d2$BB_25_3_high)
##
## 0 1
## 125 250
table(d2$BB_100_10_high)
##
## 0 1
## 166 209
table(d2$BB_250_25_high)
##
## 0 1
## 185 190
table(d2$BB_1000_100_high)
##
## 0 1
## 262 113
table(d2$BB_adoption_high)
##
## 0 1
## 185 190
table(d2$BB_qos_high)
##
## 0 1
## 208 167
## Set cut points for each covariate
popcut <- hist(d2$LNpop_2019, br=seq(min(d2$LNpop_2019, na.rm = T), max(d2$LNpop_2019, na.rm = T), length.out = 5), plot = F)$breaks
indstrycut <- hist(d2$indstry_diversity, br=seq(min(d2$indstry_diversity), max(d2$indstry_diversity), length.out = 5), plot = F)$breaks
educut <- hist(d2$pctbachelors_2019, br=seq(min(d2$pctbachelors_2019), max(d2$pctbachelors_2019), length.out = 5), plot = F)$breaks
unempcut <- hist(d2$pct_unemployment_2019, br=seq(min(d2$pct_unemployment_2019), max(d2$pct_unemployment_2019), length.out = 5), plot = F)$breaks
# Ruralities
irrcut <- hist(d2$IRR2010, br = seq(min(d2$IRR2010), max(d2$IRR2010), length.out = 5), plot = F)$breaks
mycp <- list(LNpop_2019 = popcut, indstry_diversity = indstrycut, pctbachelors_2019 = educut, pct_unemployment_2019 = unempcut, IRR2010 = irrcut)
## List of covariates
vars <- c("LNpop_2019", "indstry_diversity", "pctbachelors_2019", "pct_unemployment_2019", "IRR2010")
droplst <- c("pct_nonfarm_bea_2019", "vd_mean_20", "havd_mean_20", "nonfarmprop_percapita", "metro_f")
#### Treatment: BB_25_3_high ####
d25_3 <- d2 %>% select(BB_25_3_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
d25_3 <- data.frame(na.omit(d25_3))
## Overall imbalance check
imbalance(group = d25_3$BB_25_3_high, data = d25_3[vars])
##
## Multivariate Imbalance Measure: L1=0.926
## Percentage of local common support: LCS=5.6%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 1.277501460 (diff) 0.2739712 1.183512 0.9751537 1.116906 1.361330 4.016635
## indstry_diversity 0.010816166 (diff) 0.0000000 0.119824 0.0104620 0.009591 0.003016 -0.000035
## pctbachelors_2019 0.036170988 (diff) 0.0000000 0.063000 0.0220000 0.026000 0.035000 0.160000
## pct_unemployment_2019 0.001061008 (diff) 0.0000000 0.000000 0.0100000 0.004000 -0.008000 0.010000
## IRR2010 -0.066790123 (diff) 0.0000000 -0.340000 -0.0600000 -0.040000 -0.050000 -0.030000
## CEM match using user-choice coarsening
match_fcc_25_3 <- cem(treatment = "BB_25_3_high", data = d25_3,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_25_3_high'='1' as baseline group
match_fcc_25_3
## G0 G1
## All 120 243
## Matched 94 167
## Unmatched 26 76
#### Treatment: BB_100_10_high ####
d100_10 <- d2 %>% select(BB_100_10_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
d100_10 <- data.frame(na.omit(d100_10))
## Overall imbalance check
imbalance(group = d100_10$BB_100_10_high, data = d100_10[vars])
##
## Multivariate Imbalance Measure: L1=0.920
## Percentage of local common support: LCS=5.0%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 1.3064855207 (diff) 0.295197 1.329880 0.9158668 1.251601 1.431673 3.625198
## indstry_diversity 0.0042943540 (diff) 0.000000 0.119824 0.0059060 0.001717 -0.002152 -0.003139
## pctbachelors_2019 0.0409810961 (diff) 0.000000 0.063000 0.0170000 0.035000 0.053000 0.165000
## pct_unemployment_2019 -0.0002424261 (diff) 0.000000 0.008000 0.0040000 -0.005000 -0.007000 0.010000
## IRR2010 -0.0645649631 (diff) 0.000000 -0.320000 -0.0800000 -0.040000 -0.040000 -0.020000
## CEM match using user-choice coarsening
match_fcc_100_10 <- cem(treatment = "BB_100_10_high", data = d100_10,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_100_10_high'='1' as baseline group
match_fcc_100_10
## G0 G1
## All 160 203
## Matched 131 135
## Unmatched 29 68
#### Treatment: BB_250_25_high ####
d250_25 <- d2 %>% select(BB_250_25_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
d250_25 <- data.frame(na.omit(d250_25))
## Overall imbalance check
imbalance(group = d250_25$BB_250_25_high, data = d250_25[vars])
##
## Multivariate Imbalance Measure: L1=0.886
## Percentage of local common support: LCS=6.5%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 1.3464351904 (diff) 0.2958093 1.183512 1.039657 1.313773 1.504972 3.625198
## indstry_diversity 0.0037317343 (diff) 0.0000000 0.119824 0.004863 0.001845 -0.001019 -0.005135
## pctbachelors_2019 0.0458836623 (diff) 0.0000000 0.063000 0.024000 0.037000 0.063000 0.064000
## pct_unemployment_2019 0.0008724264 (diff) 0.0000000 0.012000 0.005000 -0.001000 -0.006000 0.010000
## IRR2010 -0.0707904646 (diff) 0.0000000 -0.220000 -0.080000 -0.050000 -0.050000 -0.030000
## CEM match using user-choice coarsening
match_fcc_250_25 <- cem(treatment = "BB_250_25_high", data = d250_25,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_250_25_high'='1' as baseline group
match_fcc_250_25
## G0 G1
## All 178 185
## Matched 146 129
## Unmatched 32 56
#### Treatment: BB_1000_100_high ####
d1000_100 <- d2 %>% select(BB_1000_100_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
d1000_100 <- data.frame(na.omit(d1000_100))
## Overall imbalance check
imbalance(group = d1000_100$BB_1000_100_high, data = d1000_100[vars])
##
## Multivariate Imbalance Measure: L1=0.956
## Percentage of local common support: LCS=3.4%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 -0.406529632 (diff) 0.207529 -1.183512 0.1440635 0.1948011 -0.899226 -1.692590
## indstry_diversity -0.003268772 (diff) 0.000000 -0.126105 -0.0026150 -0.0020620 0.000650 0.005135
## pctbachelors_2019 -0.047284427 (diff) 0.000000 -0.063000 -0.0400000 -0.0470000 -0.054000 -0.084000
## pct_unemployment_2019 0.007024775 (diff) 0.000000 -0.012000 0.0060000 0.0070000 0.011000 0.008000
## IRR2010 0.031886529 (diff) 0.000000 0.190000 0.0500000 -0.0100000 0.000000 0.030000
## CEM match using user-choice coarsening
match_fcc_1000_100 <- cem(treatment = "BB_1000_100_high", data = d1000_100,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_1000_100_high'='1' as baseline group
match_fcc_1000_100
## G0 G1
## All 252 111
## Matched 199 91
## Unmatched 53 20
#### Treatment: BB_adoption_high ####
dadoption <- d2 %>% select(BB_adoption_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
dadoption <- data.frame(na.omit(dadoption))
## Overall imbalance check
imbalance(group = dadoption$BB_adoption_high, data = dadoption[vars])
##
## Multivariate Imbalance Measure: L1=0.918
## Percentage of local common support: LCS=4.6%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 0.541803129 (diff) 0.3163024 -0.8740613 -0.3496337 0.5117201 1.243733 1.692590
## indstry_diversity -0.005574648 (diff) 0.0000000 -0.0618870 -0.0044110 -0.0067190 -0.006251 -0.005158
## pctbachelors_2019 0.071844627 (diff) 0.0000000 0.0950000 0.0470000 0.0590000 0.082000 0.255000
## pct_unemployment_2019 -0.012052095 (diff) 0.0000000 0.0000000 -0.0070000 -0.0100000 -0.014000 -0.037000
## IRR2010 -0.031935337 (diff) 0.0000000 -0.2000000 -0.0600000 -0.0200000 0.020000 0.010000
## CEM match using user-choice coarsening
match_fcc_adoption <- cem(treatment = "BB_adoption_high", data = dadoption,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_adoption_high'='1' as baseline group
match_fcc_adoption
## G0 G1
## All 180 183
## Matched 147 133
## Unmatched 33 50
#### Treatment: BB_qos_high ####
dqos <- d2 %>% select(BB_qos_high,
pct_nonfarm_bea_2019, vd_mean_20, havd_mean_20, nonfarmprop_percapita,
LNpop_2019, indstry_diversity, pctbachelors_2019, pct_unemployment_2019, IRR2010, metro_f)
dqos <- data.frame(na.omit(dqos))
## Overall imbalance check
imbalance(group = dqos$BB_qos_high, data = dqos[vars])
##
## Multivariate Imbalance Measure: L1=0.919
## Percentage of local common support: LCS=5.0%
##
## Univariate Imbalance Measures:
##
## statistic type L1 min 25% 50% 75% max
## LNpop_2019 1.840290979 (diff) 0.40363 1.004286 1.800797 1.66487 2.026217 4.048585
## indstry_diversity 0.007027928 (diff) 0.00000 0.119824 0.008401 0.00513 0.001449 -0.005158
## pctbachelors_2019 0.051348535 (diff) 0.00000 0.063000 0.025000 0.04300 0.061000 0.160000
## pct_unemployment_2019 0.002502580 (diff) 0.00000 0.012000 0.011000 0.00300 -0.004000 0.010000
## IRR2010 -0.097286715 (diff) 0.00000 -0.340000 -0.100000 -0.08000 -0.070000 -0.040000
## CEM match using user-choice coarsening
match_fcc_qos <- cem(treatment = "BB_qos_high", data = dqos,
drop = droplst,
cutpoints = mycp, keep.all = T)
##
## Using 'BB_qos_high'='1' as baseline group
match_fcc_qos
## G0 G1
## All 201 162
## Matched 160 108
## Unmatched 41 54
In this section, I will use linear model to estimate the sample average treatment effect on the treated (SATT) using weights produced by CEM stored in the matched dataset. Each subsection is laid out based on different broadband measures (i.e., treatment measures). There will be four models fitted for each treatment broadband variable. The model will estimate broadband treatment effect on the dependent variable. Additionally, the models estimate main effect of metro/non-metro classification and interaction effect as well.
#### Treatment: BB_25_3_high & Outcome: pct_nonfarm_bea_2019 ####
mod_25_3_nonfarm <- att(match_fcc_25_3, pct_nonfarm_bea_2019 ~ BB_25_3_high, data = d25_3)
summary(mod_25_3_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 120 243
## Matched 94 167
## Unmatched 26 76
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 2.5843e-01 6.5989e-03 39.1623 <2e-16 ***
## BB_25_3_high 7.8631e-05 8.2497e-03 0.0095 0.9924
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_25_3_high & Outcome: vd_mean_20 ####
mod_25_3_vd <- att(match_fcc_25_3, vd_mean_20 ~ BB_25_3_high, data = d25_3)
summary(mod_25_3_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 120 243
## Matched 94 167
## Unmatched 26 76
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 1.884890 0.177555 10.6158 <2e-16 ***
## BB_25_3_high -0.074391 0.221970 -0.3351 0.7378
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_25_3_high & Outcome: havd_mean_20 ####
mod_25_3_havd <- att(match_fcc_25_3, havd_mean_20 ~ BB_25_3_high, data = d25_3)
summary(mod_25_3_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 120 243
## Matched 94 167
## Unmatched 26 76
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.420377 0.038092 11.0358 <2e-16 ***
## BB_25_3_high -0.037303 0.047621 -0.7833 0.4341
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_25_3_high & Outcome: nonfarmprop_percapita ####
mod_25_3_nonfarmpc <- att(match_fcc_25_3, nonfarmprop_percapita ~ BB_25_3_high, data = d25_3)
summary(mod_25_3_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 120 243
## Matched 94 167
## Unmatched 26 76
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1358864 0.0042729 31.8021 < 2e-16 ***
## BB_25_3_high 0.0106670 0.0053417 1.9969 0.04688 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: pct_nonfarm_bea_2019 ####
mod_100_10_nonfarm <- att(match_fcc_100_10, pct_nonfarm_bea_2019 ~ BB_100_10_high, data = d100_10)
summary(mod_100_10_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 160 203
## Matched 131 135
## Unmatched 29 68
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.2718149 0.0055232 49.2134 < 2.2e-16 ***
## BB_100_10_high -0.0219542 0.0077529 -2.8317 0.004986 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: vd_mean_20 ####
mod_100_10_vd <- att(match_fcc_100_10, vd_mean_20 ~ BB_100_10_high, data = d100_10)
summary(mod_100_10_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 160 203
## Matched 131 135
## Unmatched 29 68
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 1.887963 0.161668 11.678 <2e-16 ***
## BB_100_10_high 0.044708 0.226933 0.197 0.844
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: havd_mean_20 ####
mod_100_10_havd <- att(match_fcc_100_10, havd_mean_20 ~ BB_100_10_high, data = d100_10)
summary(mod_100_10_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 160 203
## Matched 131 135
## Unmatched 29 68
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.4189506 0.0350164 11.9644 <2e-16 ***
## BB_100_10_high -0.0067669 0.0491525 -0.1377 0.8906
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: nonfarmprop_percapita ####
mod_100_10_nonfarmpc <- att(match_fcc_100_10, nonfarmprop_percapita ~ BB_100_10_high, data = d100_10)
summary(mod_100_10_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 160 203
## Matched 131 135
## Unmatched 29 68
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1427568 0.0040512 35.2378 <2e-16 ***
## BB_100_10_high 0.0063926 0.0056867 1.1241 0.262
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_250_25_high & Outcome: pct_nonfarm_bea_2019 ####
mod_250_25_nonfarm <- att(match_fcc_250_25, pct_nonfarm_bea_2019 ~ BB_250_25_high, data = d250_25)
summary(mod_250_25_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 178 185
## Matched 146 129
## Unmatched 32 56
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.2639721 0.0054080 48.8111 <2e-16 ***
## BB_250_25_high -0.0104403 0.0078961 -1.3222 0.1872
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_250_25_high & Outcome: vd_mean_20 ####
mod_250_25_vd <- att(match_fcc_250_25, vd_mean_20 ~ BB_250_25_high, data = d250_25)
summary(mod_250_25_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 178 185
## Matched 146 129
## Unmatched 32 56
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 1.89618 0.14177 13.3753 <2e-16 ***
## BB_250_25_high 0.20625 0.20699 0.9964 0.3199
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: havd_mean_20 ####
mod_250_25_havd <- att(match_fcc_250_25, havd_mean_20 ~ BB_250_25_high, data = d250_25)
summary(mod_250_25_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 178 185
## Matched 146 129
## Unmatched 32 56
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.406713 0.030151 13.4894 <2e-16 ***
## BB_250_25_high 0.045464 0.044022 1.0328 0.3026
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: nonfarmprop_percapita ####
mod_250_25_nonfarmpc <- att(match_fcc_250_25, nonfarmprop_percapita ~ BB_250_25_high, data = d250_25)
summary(mod_250_25_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 178 185
## Matched 146 129
## Unmatched 32 56
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1444826 0.0035362 40.8585 <2e-16 ***
## BB_250_25_high 0.0057561 0.0051630 1.1149 0.2659
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_1000_100_high & Outcome: pct_nonfarm_bea_2019 ####
mod_1000_100_nonfarm <- att(match_fcc_1000_100, pct_nonfarm_bea_2019 ~ BB_1000_100_high, data = d1000_100)
summary(mod_1000_100_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 252 111
## Matched 199 91
## Unmatched 53 20
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.2490891 0.0043451 57.3260 < 2.2e-16 ***
## BB_1000_100_high 0.0278605 0.0077568 3.5918 0.0003861 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: vd_mean_20 ####
mod_1000_100_vd <- att(match_fcc_1000_100, vd_mean_20 ~ BB_1000_100_high, data = d1000_100)
summary(mod_1000_100_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 252 111
## Matched 199 91
## Unmatched 53 20
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 2.5428191 0.2208176 11.515 <2e-16 ***
## BB_1000_100_high 0.0051431 0.3941958 0.013 0.9896
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: havd_mean_20 ####
mod_1000_100_havd <- att(match_fcc_1000_100, havd_mean_20 ~ BB_1000_100_high, data = d1000_100)
summary(mod_1000_100_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 252 111
## Matched 199 91
## Unmatched 53 20
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.533124 0.042329 12.5946 <2e-16 ***
## BB_1000_100_high 0.023844 0.075565 0.3155 0.7526
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: nonfarmprop_percapita ####
mod_1000_100_nonfarmpc <- att(match_fcc_1000_100, nonfarmprop_percapita ~ BB_1000_100_high, data = d1000_100)
summary(mod_1000_100_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 252 111
## Matched 199 91
## Unmatched 53 20
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1447441 0.0030059 48.1529 < 2.2e-16 ***
## BB_1000_100_high 0.0260261 0.0053661 4.8501 2.023e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: pct_nonfarm_bea_2019 ####
mod_adoption_nonfarm <- att(match_fcc_adoption, pct_nonfarm_bea_2019 ~ BB_adoption_high, data = dadoption)
summary(mod_adoption_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 180 183
## Matched 147 133
## Unmatched 33 50
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.2791793 0.0050709 55.0554 < 2.2e-16 ***
## BB_adoption_high -0.0295425 0.0073576 -4.0152 7.646e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: vd_mean_20 ####
mod_adoption_vd <- att(match_fcc_adoption, vd_mean_20 ~ BB_adoption_high, data = dadoption)
summary(mod_adoption_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 180 183
## Matched 147 133
## Unmatched 33 50
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 2.50706 0.19293 12.9945 <2e-16 ***
## BB_adoption_high -0.35765 0.27994 -1.2776 0.2025
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: havd_mean_20 ####
mod_adoption_havd <- att(match_fcc_adoption, havd_mean_20 ~ BB_adoption_high, data = dadoption)
summary(mod_adoption_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 180 183
## Matched 147 133
## Unmatched 33 50
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.538286 0.038742 13.8941 <2e-16 ***
## BB_adoption_high -0.071035 0.056213 -1.2637 0.2074
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_100_10_high & Outcome: nonfarmprop_percapita ####
mod_adoption_nonfarmpc <- att(match_fcc_adoption, nonfarmprop_percapita ~ BB_adoption_high, data = dadoption)
summary(mod_adoption_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 180 183
## Matched 147 133
## Unmatched 33 50
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1536612 0.0038629 39.779 <2e-16 ***
## BB_adoption_high 0.0046801 0.0056048 0.835 0.4044
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_qos_high & Outcome: pct_nonfarm_bea_2019 ####
mod_qos_nonfarm <- att(match_fcc_qos, pct_nonfarm_bea_2019 ~ BB_qos_high, data = dqos)
summary(mod_qos_nonfarm)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 201 162
## Matched 160 108
## Unmatched 41 54
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.2687571 0.0054175 49.6095 < 2e-16 ***
## BB_qos_high -0.0191461 0.0085340 -2.2435 0.02569 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_qos_high & Outcome: vd_mean_20 ####
mod_qos_vd <- att(match_fcc_qos, vd_mean_20 ~ BB_qos_high, data = dqos)
summary(mod_qos_vd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 201 162
## Matched 160 108
## Unmatched 41 54
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 2.27336 0.17623 12.900 <2e-16 ***
## BB_qos_high -0.16739 0.27761 -0.603 0.547
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_qos_high & Outcome: havd_mean_20 ####
mod_qos_havd <- att(match_fcc_qos, havd_mean_20 ~ BB_qos_high, data = dqos)
summary(mod_qos_havd)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 201 162
## Matched 160 108
## Unmatched 41 54
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.484142 0.036154 13.3912 <2e-16 ***
## BB_qos_high -0.027525 0.056952 -0.4833 0.6293
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#### Treatment: BB_qos_high & Outcome: nonfarmprop_percapita ####
mod_qos_nonfarmpc <- att(match_fcc_qos, nonfarmprop_percapita ~ BB_qos_high, data = dqos)
summary(mod_qos_nonfarmpc)
##
## Treatment effect estimation for data:
##
## G0 G1
## All 201 162
## Matched 160 108
## Unmatched 41 54
##
## Linear regression model estimated on matched data only
##
## Coefficients:
## Estimate Std. Error t value p-value
## (Intercept) 0.1385996 0.0032522 42.6172 <2e-16 ***
## BB_qos_high 0.0056309 0.0051231 1.0991 0.2727
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Copyright © 2020 Jaewon Royce Choi, Technology & Information Policy Institute (TIPI). All rights reserved.