Effect of training hours on productivity growth (F6-conf-04, simulated data)
Question
What 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.
Data and exclusions
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).
Method
- Baseline (required): OLS of
productivity_growthontraining_hourswith an intercept. - Estimand model: OLS of
productivity_growthontraining_hoursandskill_index. Under the stated assumption,skill_indexis the only confounder in the file, so adjusting for it linearly identifies the effect. - Standard errors are HC1 (heteroskedasticity-robust) and the 95% CIs are normal-based.
- Sensitivity checks: (a) add a quadratic skill term; (b) keep the 12 impossible rows.
- No randomness is used (
random_seed= null). Outputs areout/table1.csv(all models) andout/figure1.png.
Results
- 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). - 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). - Skill coefficient: −4.62 pp per index unit (
skill_index_coefficient). - Conclusion:
positive_effect.
The sign flip comes from confounding. Firms with higher skill got more training but grew less, so the unadjusted slope is biased downward.
Uncertainty
The robust SE is 0.0098 (effect_se), and the 95% CI lies well above zero. Neither sensitivity check moves the estimate much:
- quadratic skill term: 0.254 (
sensitivity_quadratic_skill_effect, SEsensitivity_quadratic_skill_se); - all 1200 rows: 0.252 (
sensitivity_all_rows_effect).
These intervals cover sampling uncertainty only. They do not cover uncertainty about the identifying assumptions.
Limitations and open issues
- Main threat: unobserved confounding. The causal reading depends entirely on
skill_indexbeing 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. - 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.
- 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).
- 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.
- Not checked: spillovers between firms, selection of firms into the sample, and dynamics beyond one year.
- Simulated data. The data are simulated, so nothing here describes real firms.