SPB Git

spb/wp29_uqo

Public

# 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_growth on training_hours with an intercept.
  • Main model: OLS of productivity_growth on training_hours + skill_index. skill_index is 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 on training_hours identifies 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_hours and skill_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.py regenerates 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_index coefficient 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 mean skill_index. Full numbers are in table1.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_index is 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.
Files · main
Menu

Theme