# Uniform
# Run rdrobust with all results
rd1 <- rdrobust(y = tutoring$exit_exam, x = tutoring$entrance_exam, c = 70,
fuzzy = tutoring$tutoring_fuzzy,
kernel = "Uniform")
# Create a named list of models (each method with its estimate and se)
models <- list(
"Conventional" = rd1$Estimate[1],
"Bias-Corrected" = rd1$Estimate[2],
"Robust Bias-Corrected" = rd1$Estimate[3]
)
ses <- list(
"Conventional" = rd1$se[1],
"Bias-Corrected" = rd1$se[2],
"Robust Bias-Corrected" = rd1$se[3]
)
# Build a modelsummary-style data frame
library(tibble)
results1 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error", "Kernel", "Obs.", "Bandwidth"),
`Conventional` = c(
sprintf("%.3f", models$Conventional),
sprintf("%.3f", ses$Conventional),
rd1$kernel, # keep as-is (a string)
sum(rd1$N),
sprintf("%.3f",rd1$bws[1])
),
`Bias-Corrected` = c(
sprintf("%.3f", models$`Bias-Corrected`),
sprintf("%.3f", ses$`Bias-Corrected`),
rd1$kernel,
sum(rd1$N),
sprintf("%.3f",rd1$bws[2])
),
`Robust Bias-Corrected` = c(
sprintf("%.3f", models$`Robust Bias-Corrected`),
sprintf("%.3f", ses$`Robust Bias-Corrected`),
rd1$kernel,
sum(rd1$N),
sprintf("%.3f",rd1$bws[2])
)
)
#Triangular
# Run rdrobust with all results
rd2 <- rdrobust(y = tutoring$exit_exam, x = tutoring$entrance_exam, c = 70,
fuzzy = tutoring$tutoring_fuzzy,
kernel = "Triangular")
# Create a named list of models (each method with its estimate and se)
models <- list(
"Conventional" = rd2$Estimate[1],
"Bias-Corrected" = rd2$Estimate[2],
"Robust Bias-Corrected" = rd2$Estimate[3]
)
ses <- list(
"Conventional" = rd2$se[1],
"Bias-Corrected" = rd2$se[2],
"Robust Bias-Corrected" = rd2$se[3]
)
# Build a modelsummary-style data frame
library(tibble)
results2 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error", "Kernel", "Obs.", "Bandwidth"),
`Conventional` = c(
sprintf("%.3f", models$Conventional),
sprintf("%.3f", ses$Conventional),
rd2$kernel, # keep as-is (a string)
sum(rd2$N),
sprintf("%.3f",rd2$bws[1])
),
`Bias-Corrected` = c(
sprintf("%.3f", models$`Bias-Corrected`),
sprintf("%.3f", ses$`Bias-Corrected`),
rd2$kernel,
sum(rd2$N),
sprintf("%.3f",rd2$bws[2])
),
`Robust Bias-Corrected` = c(
sprintf("%.3f", models$`Robust Bias-Corrected`),
sprintf("%.3f", ses$`Robust Bias-Corrected`),
rd2$kernel,
sum(rd2$N),
sprintf("%.3f",rd2$bws[2])
)
)
#Epanechnikov
# Run rdrobust with all results
rd3 <- rdrobust(y = tutoring$exit_exam, x = tutoring$entrance_exam, c = 70,
fuzzy = tutoring$tutoring_fuzzy,
kernel = "Epanechnikov")
# Create a named list of models (each method with its estimate and se)
models <- list(
"Conventional" = rd3$Estimate[1],
"Bias-Corrected" = rd3$Estimate[2],
"Robust Bias-Corrected" = rd3$Estimate[3]
)
ses <- list(
"Conventional" = rd3$se[1],
"Bias-Corrected" = rd3$se[2],
"Robust Bias-Corrected" = rd3$se[3]
)
# Build a modelsummary-style data frame
library(tibble)
results3 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error", "Kernel", "Obs.", "Bandwidth"),
`Conventional` = c(
sprintf("%.3f", models$Conventional),
sprintf("%.3f", ses$Conventional),
rd3$kernel, # keep as-is (a string)
sum(rd1$N),
sprintf("%.3f",rd3$bws[1])
),
`Bias-Corrected` = c(
sprintf("%.3f", models$`Bias-Corrected`),
sprintf("%.3f", ses$`Bias-Corrected`),
rd3$kernel,
sum(rd1$N),
sprintf("%.3f",rd3$bws[2])
),
`Robust Bias-Corrected` = c(
sprintf("%.3f", models$`Robust Bias-Corrected`),
sprintf("%.3f", ses$`Robust Bias-Corrected`),
rd3$kernel,
sum(rd3$N),
sprintf("%.3f",rd3$bws[2])
)
)
# Create a separator row
separator_fs <- tibble::tibble(
Statistic = "<b>First stage</b>",
Conventional = "", `Bias-Corrected` = "", `Robust Bias-Corrected` = ""
)
separator_ss <- tibble::tibble(
Statistic = "<b>Treatment effect estimates</b>",
Conventional = "", `Bias-Corrected` = "", `Robust Bias-Corrected` = ""
)
separator_uniform <- tibble::tibble(
Statistic = "<b>Uniform Kernel</b>",
Conventional = "", `Bias-Corrected` = "", `Robust Bias-Corrected` = ""
)
separator_triangular <- tibble::tibble(
Statistic = "<b>Triangular Kernel</b>",
Conventional = "", `Bias-Corrected` = "", `Robust Bias-Corrected` = ""
)
separator_epanechnikov <- tibble::tibble(
Statistic = "<b>Epanechnikov Kernel</b>",
Conventional = "", `Bias-Corrected` = "", `Robust Bias-Corrected` = ""
)
# First-stage estimates
first_stage_rd1 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error"),
`Conventional` = c(
sprintf("%.3f", rd1$tau_T[1]),
sprintf("%.3f", rd1$se_T[1])),
`Bias-Corrected` = c(
sprintf("%.3f", rd1$tau_T[2]),
sprintf("%.3f", rd1$se_T[2])),
`Robust Bias-Corrected` = c(
sprintf("%.3f", rd1$tau_T[3]),
sprintf("%.3f", rd1$se_T[3]))
)
# First-stage estimates
first_stage_rd2 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error"),
`Conventional` = c(
sprintf("%.3f", rd2$tau_T[1]),
sprintf("%.3f", rd2$se_T[1])),
`Bias-Corrected` = c(
sprintf("%.3f", rd2$tau_T[2]),
sprintf("%.3f", rd2$se_T[2])),
`Robust Bias-Corrected` = c(
sprintf("%.3f", rd2$tau_T[3]),
sprintf("%.3f", rd2$se_T[3]))
)
# First-stage estimates
first_stage_rd3 <- tibble::tibble(
Statistic = c("Estimate", "Std. Error"),
`Conventional` = c(
sprintf("%.3f", rd3$tau_T[1]),
sprintf("%.3f", rd3$se_T[1])),
`Bias-Corrected` = c(
sprintf("%.3f", rd3$tau_T[2]),
sprintf("%.3f", rd3$se_T[2])),
`Robust Bias-Corrected` = c(
sprintf("%.3f", rd3$tau_T[3]),
sprintf("%.3f", rd3$se_T[3]))
)
results_final1 <- rbind(
separator_uniform,
separator_fs,
first_stage_rd1,
separator_ss,
results1)
results_final2 <- rbind(separator_triangular,
separator_fs,
first_stage_rd2,
separator_ss,
results2)
results_final3 <- rbind(separator_epanechnikov,
separator_fs,
first_stage_rd3,
separator_ss,
results3)
# Show using modelsummary custom table
modelsummary::datasummary_df(results_final1, output = "markdown")