SPB Git

spb/wp29_uqo

Public
3.9 KB · 38 lines markdown
1# Effect of training hours on productivity growth (F6-conf-04, simulated data)23## Question4What is the causal effect of one extra training hour per employee during the programme year on productivity growth in the following year (pp per hour)? We assume selection on observables given the pre-programme `skill_index`, and a linear, homogeneous effect.56## Data and exclusions7`data/firms.csv` has 1200 firms (`n_input_rows`) with no missing values and no duplicate rows or IDs. Twelve firms have **negative** `training_hours` (as low as −7.6 h), which cannot happen. We treat them as recording errors and drop them from the main analysis, which leaves `n_analysed` = 1188 (see `out/exclusions.csv` and `data_issues`). A sensitivity run keeps all 1200 rows. `skill_index` is measured the year before the programme, so it is a pre-treatment variable and is valid to adjust for. In this sample it correlates 0.69 with training hours (`corr_skill_training`).89## Method10- Baseline (required): OLS of `productivity_growth` on `training_hours` with an intercept.11- Estimand model: OLS of `productivity_growth` on `training_hours` and `skill_index`. Under the stated assumption, `skill_index` is the only confounder in the file, so adjusting for it linearly identifies the effect.12- Standard errors are HC1 (heteroskedasticity-robust) and the 95% CIs are normal-based.13- Sensitivity checks: (a) add a quadratic skill term; (b) keep the 12 impossible rows.14- No randomness is used (`random_seed` = null). Outputs are `out/table1.csv` (all models) and `out/figure1.png`.1516## Results17- **Unadjusted model:** the slope is −0.132 pp/h (`naive_estimate`), 95% CI [−0.160, −0.103] (`naive_ci_low`, `naive_ci_high`), with residual RMSE 3.86 pp (`baseline_metric`).18- **Adjusted model:** the effect is **+0.254 pp per hour** (`effect_estimate`), 95% CI [0.234, 0.273] (`effect_ci_low`, `effect_ci_high`), with residual RMSE 1.98 pp (`model_metric`).19- **Skill coefficient:** −4.62 pp per index unit (`skill_index_coefficient`).20- **Conclusion:** `positive_effect`.2122The sign flip comes from confounding. Firms with higher skill got more training but grew less, so the unadjusted slope is biased downward.2324## Uncertainty25The robust SE is 0.0098 (`effect_se`), and the 95% CI lies well above zero. Neither sensitivity check moves the estimate much:26- quadratic skill term: 0.254 (`sensitivity_quadratic_skill_effect`, SE `sensitivity_quadratic_skill_se`);27- all 1200 rows: 0.252 (`sensitivity_all_rows_effect`).2829These intervals cover sampling uncertainty only. They do not cover uncertainty about the identifying assumptions.3031## Limitations and open issues32- **Main threat: unobserved confounding.** The causal reading depends entirely on `skill_index` being the only confounder. Any unmeasured factor that drives both training and growth (management quality, sector shocks, firm size) would bias the estimate, and these data cannot test for one. The size of the sign flip shows how sensitive the result is to which variables are adjusted for.33- **Measurement error in skill_index.** If the index is measured with error, adjustment is incomplete. Because the confounding is strong and the bias runs downward, the true effect would then be *larger* than estimated.34- **Impossible values.** The 12 negative-hours rows point to data-quality problems that may also affect other rows without being visible. Dropping them changes little (0.254 vs 0.252).35- **Functional form.** We assumed linearity and a homogeneous effect. We tested a quadratic skill term. An exploratory hours×skill interaction, run outside the replication script and not in results.json, was close to zero. Non-linearity in hours (e.g. diminishing returns) was not tested. Hours above about 40 are sparse, so extrapolating there is weak.36- **Not checked:** spillovers between firms, selection of firms into the sample, and dynamics beyond one year.37- **Simulated data.** The data are simulated, so nothing here describes real firms.38
Files · main
Menu

Theme