--- title: "Estimation" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Estimation} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE, comment = "#>") options(scipen = 999) data.table::setDTthreads(1L) ``` This page describes how the package runs the paper's 2x2 comparisons, then writes out every estimator it returns and the influence function its standard error is built from. Notation follows [Notation and output](notation.html). Section, theorem and appendix numbers refer to Leventer (2025), *Identification of Child Penalties*; appendices are referred to by name, because their letters differ between the arXiv and journal versions: *Estimation appendix* is the appendix on estimation and inference, *Proportional appendix* the online appendix on proportional DID and TD. Formulas that are not in the paper are marked **not in the paper**. ## Running the comparisons `multiple_treatment_group_analysis()` runs the grid of 2x2 comparisons that the paper's figures use. For each treatment group $d$ in `treatment_groups` and event time $e = 0, \dots, H$ (`periods_post = H`), the target age is $a = d + e$ and the control group is the closest not-yet-treated group, $d' = a + 1$ (Section 1.3). Pre-treatment event times $e = -(\text{pre} + K), \dots, -(\text{pre} + 1)$ (`periods_pre = K`) are estimated against every control group used after treatment, $d' = d + 1, \dots, d + H + 1$: the identifying assumptions are about each treatment-control pair, so each pair has its own validation test (Section 2.3). The column `control_offset` $= d' - d$ identifies the pair. `max_control_group` is the largest age at first birth used as a control (the paper's $D_{max}$). `single_treatment_group_analysis()` runs one comparison. ```{r grid, eval = FALSE} res <- multiple_treatment_group_analysis(data, treatment_groups = 24:34, periods_post = 5, periods_pre = 3, max_control_group = 40) ``` With the paper's sample this grid is the one behind its figures: treatment groups 24 to 34, event times 0 to 5, pre-treatment event times $-4$ to $-2$ (baseline $d - 1$), and controls up to 40 ([Replicating the paper](replication.html)). **One comparison.** `single_treatment_group_analysis()` returns the rows of one cell $(d, d', a)$. Treatment group $d = 26$ against control group $d' = 28$, after childbirth at age $a = 27$ (event time 1) and before childbirth at age $a = 23$ (event time $-3$), both with baseline age 25: ```{r one-cell} library(childpen) sim <- simulate_data(5000, 24:30) fmt <- function(v) format(signif(v, 3), scientific = FALSE, drop0trailing = TRUE, trim = TRUE) show <- function(x) transform(x[c("event_time", "control_offset", "method", "estimand", "est", "se")], est = fmt(est), se = fmt(se)) post <- single_treatment_group_analysis(sim, d = 26, dp = 28, a = 27) show(post) pre <- single_treatment_group_analysis(sim, d = 26, dp = 28, a = 23) show(pre) ``` **Input data.** `data` is a data.frame or data.table in long format, one row per person and age; the panel need not be balanced. The columns are located by name: | argument | default | content | |---|---|---| | `id_name` | `"id"` | person identifier (the clustering unit) | | `age_name` | `"age"` | age, numeric | | `D_name` | `"D"` | age at first birth, constant within person; a missing (or infinite) value means the person never has a child | | `female_name` | `"female"` | gender, constant within person; `1` / `TRUE` is female and `0` / `FALSE` male; labels such as `"female"` / `"male"`, `"f"` / `"m"`, `"woman"` / `"man"` are also accepted | | `Y_name` | `"Y"` | earnings, numeric; zeros are allowed, while the ratio rows need positive cell means | Rows with a missing outcome are dropped with a message. The functions stop with an error if a person-age pair is repeated, if `female` or `D` varies within a person, if a gender label is not recognised, or if only one gender is present. `data` is not modified. Persons with a missing `D` stay in the data, belong to no treatment or control group, and count in the totals the standard errors are scaled by. ## Setup Data are one row per person $i$ and age $t$, with earnings $Y$, gender $g \in \{f, m\}$ and age at first birth $D$. A 2x2 comparison has a treatment group $d$, a control group $d' > a$, a target age $a$ and a baseline age $b = d - \text{pre}$ (default $b = d - 1$). **Cell means.** For a cell $(g, k, t)$, with indicator $S_{it} = 1\{G_i = g, D_i = k, \text{age} = t\}$, $$ \hat\mu(g,k,t) = \frac{\sum_{i,t'} S_{it'} Y_{it'}}{\sum_{i,t'} S_{it'}}, \qquad \psi_{\mu(g,k,t)} = \frac{S}{\hat P(S)}\,\big(Y - \hat\mu(g,k,t)\big), $$ where $\hat P(S)$ is the share of person-age rows in the cell (Estimation appendix). Every estimator below is a smooth function of eight cell means, $$ \mu_1 = \mu(g,d,b),\quad \mu_2 = \mu(g,d',a),\quad \mu_3 = \mu(g,d',b),\quad \mu_4 = \mu(g,d,a), \qquad g \in \{f, m\}, $$ and its influence function $\psi$ follows from theirs by the chain rule. **Standard errors.** For an estimator with influence function $\psi$, with $n$ person-age rows, $G$ persons and clusters $c$ = persons, $$ \widehat{\mathrm{Var}} = \frac{1}{n^2}\sum_{c}\Big(\sum_{i \in c}\psi_i\Big)^2\,\frac{G}{G-1}. $$ Confidence intervals are $\text{est} \pm 1.96\,\text{se}$. ## Rows of `single_treatment_group_analysis()` **Imputations of counterfactual earnings.** Additive (DID) and multiplicative: $$ \hat\delta_{APO}(g) = \mu_1 + \mu_2 - \mu_3, \qquad \psi_{\delta_{APO}(g)} = \psi_1 + \psi_2 - \psi_3; $$ $$ \hat\delta^{\times}_{APO}(g) = \frac{\mu_1\,\mu_2}{\mu_3}, \qquad \psi_{\delta^{\times}_{APO}(g)} = \hat\delta^{\times}_{APO}(g)\Big(\frac{\psi_1}{\mu_1} + \frac{\psi_2}{\mu_2} - \frac{\psi_3}{\mu_3}\Big). $$ | method | estimand | estimator | influence function | identifies its target under | in the paper | |---|---|---|---|---|---| | `DID_Female`, `DID_Male` | `APO` | $\hat\delta_{APO}(g)$ | $\psi_{\delta_{APO}(g)}$ | NA, DID-PT | Lemma 1; eq. (3), Estimation app. | | `DID_Female`, `DID_Male` | `ATE` | $\hat\delta_{ATE}(g) = \mu_4 - \hat\delta_{APO}(g)$ | $\psi_4 - \psi_{\delta_{APO}(g)}$ | NA, DID-PT | Lemma 1; eq. (3), Estimation app. | | `DID_Female`, `DID_Male` | `theta` | $\hat\delta_\theta(g) = \hat\delta_{ATE}(g)/\hat\delta_{APO}(g)$ | $\dfrac{\psi_{\delta_{ATE}}}{\delta_{APO}} - \dfrac{\delta_{ATE}\,\psi_{\delta_{APO}}}{\delta_{APO}^2}$ | NA, DID-PT | Lemma 1; eq. (3), Estimation app. | | `TD` | `gap_ATE` | $\hat\delta_{ATE}(f) - \hat\delta_{ATE}(m)$ | $\psi_{\delta_{ATE}(f)} - \psi_{\delta_{ATE}(m)}$ | NA, TD-PT | Lemma 1; Estimation app. | | `Conventional` | `gap_theta` | $\hat\delta_\theta(f) - \hat\delta_\theta(m)$ | $\psi_{\delta_\theta(f)} - \psi_{\delta_\theta(m)}$ | NA, DID-PT; under NA and NTD-PT it equals $\text{Bias} \times [\theta(f) - \theta(m)]$ | Thm. 1; Estimation app. | | `NTD` | `rho_obs` | $\hat\rho_{obs} = \mu_4(f)/\mu_4(m)$ | $\dfrac{\psi_4(f)}{\mu_4(m)} - \dfrac{\mu_4(f)\,\psi_4(m)}{\mu_4(m)^2}$ | consistency | Thm. 2; Estimation app. | | `NTD` | `rho_cf` | $\hat\rho_{cf} = \hat\delta_{APO}(f)/\hat\delta_{APO}(m)$ | $\dfrac{\psi_{\delta_{APO}(f)}}{\delta_{APO}(m)} - \dfrac{\delta_{APO}(f)\,\psi_{\delta_{APO}(m)}}{\delta_{APO}(m)^2}$ | NA, NTD-PT | Thm. 2; Estimation app. | | `NTD` | `rho_effect` | $\hat\rho_{obs} - \hat\rho_{cf}$ | $\psi_{\rho_{obs}} - \psi_{\rho_{cf}}$ | NA, NTD-PT | Thm. 2; Estimation app. | | `TD_E_LOGS` | `rho_cf` | $\hat\rho^{\times}_{cf} = \hat\delta^{\times}_{APO}(f)/\hat\delta^{\times}_{APO}(m)$ | as `NTD` `rho_cf`, with $\delta^{\times}_{APO}$ | NA, TD-E-LOGS | Proportional app.; IF **not in the paper** | | `TD_E_LOGS` | `rho_obs`, `rho_effect` | as `NTD`, with $\hat\rho^{\times}_{cf}$ | as `NTD`, with $\psi_{\rho^{\times}_{cf}}$ | `rho_obs`: consistency; `rho_effect`: NA, TD-E-LOGS | Proportional app.; IF **not in the paper** | | `TD_PR` | `gap_theta_pre` | $\hat\theta_{pre}(f) - \hat\theta_{pre}(m)$, $\hat\theta_{pre}(g) = \dfrac{\mu_4 - \hat\delta^{\times}_{APO}(g)}{\mu_1}$ | $\psi_{\theta_{pre}(f)} - \psi_{\theta_{pre}(m)}$, $\psi_{\theta_{pre}(g)} = \dfrac{\psi_4 - \psi_{\delta^{\times}_{APO}(g)}}{\mu_1} - \dfrac{\theta_{pre}(g)\,\psi_1}{\mu_1}$ | NA, TD-PR | Proportional app.; IF **not in the paper** | | `NTD`, `TD_E_LOGS` | `share_parenthood` | $\hat s = \dfrac{\hat\rho_{cf} - \hat\rho_{obs}}{1 - \hat\rho_{obs}}$ | $\dfrac{\psi_{\rho_{cf}} - \psi_{\rho_{obs}}}{1 - \rho_{obs}} + \dfrac{(\rho_{cf} - \rho_{obs})\,\psi_{\rho_{obs}}}{(1 - \rho_{obs})^2}$ | as `rho_cf` of the same method | Sec. 4.2 (estimate); **not in the paper** (IF) | | `NTD`, `TD_E_LOGS` | `share_other` | $1 - \hat s$ | $-\psi_s$ | as `rho_cf` of the same method | **not in the paper** | NA (no anticipation), DID-PT (parallel trends), TD-PT and NTD-PT are the assumptions of Sections 2 and 3 of the paper; TD-E-LOGS and TD-PR are those of the Proportional appendix. For `TD_E_LOGS` the counterfactual ratio uses $\hat\delta^{\times}_{APO}$; the `share_parenthood` row of `TD_E_LOGS` uses $\hat\rho^{\times}_{cf}$ in place of $\hat\rho_{cf}$. The standard errors of `share_parenthood` and `share_other` are **not in the paper**, which reports parenthood's share as a point estimate (Section 4.2); the influence function in the table is the chain rule applied to $s = (\rho_{cf} - \rho_{obs})/(1 - \rho_{obs})$. ## `bias_bounds()` The bias-corrected conventional gap at an assumed fathers' effect $\theta(m)$ (Proposition 2, in the form of the Estimation appendix), with $\hat\Delta$ the `NTD` `rho_effect` estimate: $$ \hat B(\theta(m)) = \hat\Delta\,\frac{\hat\delta_{APO}(m)}{\hat\delta_{APO}(f)}\,\big(1 + \theta(m)\big), $$ $$ \psi_{B} = \big(1 + \theta(m)\big)\Big[\frac{\delta_{APO}(m)}{\delta_{APO}(f)}\psi_{\Delta} + \frac{\Delta}{\delta_{APO}(f)}\psi_{\delta_{APO}(m)} - \frac{\Delta\,\delta_{APO}(m)}{\delta_{APO}(f)^2}\psi_{\delta_{APO}(f)}\Big]. $$ The estimator is in the paper; its influence function is **not in the paper**. The standard error scales with $1 + \theta(m)$. ## `aggregate_estimands()` The aggregate estimators, their influence functions and standard errors are in [Aggregation](aggregation.html). ## Where this lives in the code | quantity | code | |---|---| | cell means and their IF; clustered variance | `R/utility.R`: `compute_mean_if()`, `se_cluster()` | | all rows of the table above | `R/single_treatment_group_analysis.R` | | aggregation | `R/aggregate_estimands.R` | | bias-corrected gap | `R/bias_bounds.R` | Standard errors checked against a person-level (cluster) bootstrap in `tests/testthat/`: `TD_E_LOGS` and `TD_PR` `rho_effect` / `gap_theta_pre`, `NTD` `share_parenthood`, and `bias_bounds()`. `TD_E_LOGS` and `TD_PR` are also checked by Monte Carlo (`dev/sims/td_sim_results.md` in the source repository).