F6-conf-04 — Workforce training and productivity growth (simulated data)
Question
What is the causal effect of one more training hour per employee (programme year) on productivity growth in the following year, in percentage points per hour? The estimand assumes selection on observables: conditional on the pre-programme skill_index, training hours are as good as randomly assigned, and the effect is linear and homogeneous.
Data and exclusions
data/firms.csv has 1,200 rows (one per firm). There are no missing values, no duplicate firm_ids and no duplicate rows. Data issue: 12 firms report negative training_hours (minimum −7.585). Hours per employee cannot be negative, so I treated these values as invalid and dropped those rows without imputing anything. Main analysis: n = 1,188. These 12 firms have much lower skill (mean skill_index −2.06) than the rest, so the error is not random. Including them changes the training coefficient by about 0.001 (0.2522 vs 0.2535), as shown in table1.csv. Correlations in the cleaned data: skill_index is strongly positively correlated with training_hours (r ≈ 0.69) and strongly negatively correlated with productivity_growth (r ≈ −0.79). That makes it a classic confounder.
Method
- Baseline (required): OLS of
productivity_growthontraining_hourswith an intercept. - Main model: OLS of
productivity_growthontraining_hours+skill_index.skill_indexis measured the year before the programme, so it is a pre-treatment variable and cannot be affected by training. It is the only covariate available. Under the stated selection-on-observables, linearity and homogeneity assumptions, the coefficient ontraining_hoursidentifies the estimand. - Standard errors: heteroskedasticity-robust (HC1) throughout. Conventional SEs are almost identical (0.00984 vs 0.00981).
- Sensitivity checks: (a) keeping the 12 negative-hours rows; (b) adding squared terms in
training_hoursandskill_index. Neither squared term is significant (p = 0.66 and 0.48), so a linear specification is reasonable. - No randomness is used, so there is no seed.
out/analysis.pyregenerates all outputs.
Results
| model | estimate (pp/hour) | robust SE | 95% CI |
|---|---|---|---|
| Unadjusted OLS | −0.132 | 0.0146 | [−0.160, −0.103] |
| Adjusted for skill_index (main) | 0.254 | 0.0098 | [0.234, 0.273] |
| Adjusted, incl. negative-hours rows | 0.252 | 0.0095 | [0.234, 0.271] |
| Adjusted + quadratic terms (linear coef.) | 0.242 | 0.0289 | [0.185, 0.299] |
- The unadjusted slope is negative. After adjusting for baseline skill, the sign reverses to a clearly positive effect: about +0.25 pp of productivity growth per training hour. In other words, 10 extra hours give about +2.5 pp.
- The
skill_indexcoefficient is −4.62 pp per index unit. Higher-skill firms both received more training and grew less, and this hid the training effect in the raw association. - Residual RMSE falls from 3.86 pp (unadjusted) to 1.98 pp (adjusted).
- Figure 1 (
figure1.png) shows both fitted lines; the adjusted line is evaluated at the meanskill_index. Full numbers are intable1.csv. - Conclusion code:
positive_effect. The 95% CI [0.234, 0.273] lies entirely above zero.
Uncertainty
The robust SE is 0.0098, giving the 95% CI [0.234, 0.273]. This covers sampling uncertainty only, under the assumed model. Specification uncertainty is larger than sampling uncertainty: with quadratic terms the point estimate is 0.242, with a wider CI [0.185, 0.299]. Still, every specification I tried gives a positive estimate between 0.24 and 0.25. The 12 excluded rows have a negligible effect on the estimate.
Limitations and open issues
- Unconfoundedness is assumed, not tested. The main threat is any unobserved factor that drives both training intensity and later growth, such as management quality, sector, firm size, or anticipated demand shocks. If that is present, the estimate is biased in an unknown direction. With a single covariate, there is nothing in the data to test this. The sign reversal between models shows how sensitive the answer is to which confounders are controlled for.
- Measurement of the confounder:
skill_indexis an index. If it measures true skill with error, adjustment is incomplete, and residual confounding would bias the estimate downwards (towards the negative naive slope). The true effect could therefore be larger. - Functional form: I checked only quadratic terms. I did not check interactions (heterogeneous effects by skill), splines, or other nonlinear dose–response shapes. If effects differ across firms, the OLS coefficient is a variance-weighted average, not the average effect.
- Overlap: strong correlation between training and skill means comparisons at extreme skill levels rely on extrapolation. I did not do a formal overlap or trimming analysis.
- Data validity: the negative hours values suggest a recording or processing error. Other values could be wrong in ways I cannot detect, for example plausible-looking but incorrect hours. Four firms have exactly integer hours (e.g. 20.0), which may be rounding. I left them unchanged.
- Inference: I assumed observations are independent across firms. There is no clustering information (e.g. by industry or region) in the file.
- External validity: the data are simulated, so these results show a method working on constructed data. They are not evidence about real training programmes.