SPB Git

spb/wp29_uqo

Public

# F6-conf-04 — Effect of training hours on productivity growth (simulated data)

# Question

What is the causal effect of one additional training hour per employee (programme year) on productivity growth in the following year, in percentage points per hour? The estimand is the linear, homogeneous coefficient on training_hours, identified under selection on observables: conditional on the pre-programme skill_index, training hours are as good as randomly assigned.

# Data and exclusions

data/firms.csv (SHA-256 34aa682e…7df), 1200 rows (n_input_rows), 4 columns, no missing values, no duplicate rows or firm ids (details: out/state/data_audit.md). One anomaly was found (data_issues): 12 firms have negative training_hours (min −7.6), which cannot happen; all of them have low skill_index. They were dropped from the main analysis (out/exclusions.csv: 1200 → 1188), giving n_analysed = 1188. A sensitivity run that keeps them is reported below. No random numbers are used (random_seed = null).

# Method

  • Baseline (required): OLS productivity_growth ~ 1 + training_hours on the same 1188 firms.
  • Main model: OLS productivity_growth ~ 1 + training_hours + skill_index. skill_index is measured the year before the programme, so it is a pre-treatment confounder and not a mediator. It correlates strongly with training hours (corr_skill_training ≈ 0.68). Under the stated assumption, controlling for it identifies the estimand.
  • Standard errors: HC1 heteroskedasticity-robust (se_type). The conventional SE is almost the same (effect_se_conventional). The 95% CIs are normal-based (estimate ± 1.96·SE).
  • Fit metric: in-sample RMSE sqrt(mean(e²)) for each model.
  • Sensitivity checks (table1.csv): keeping the negative-hours rows; adding a hours×skill interaction; adding skill².

# Results

model estimate (pp/hour) 95% CI
unadjusted −0.132 (naive_estimate) [−0.160, −0.103] (naive_ci_low, naive_ci_high)
adjusted for skill (main) 0.254 (effect_estimate) [0.234, 0.273] (effect_ci_low, effect_ci_high)
  • On its own, the unadjusted association is negative. Once baseline skill is held fixed, one extra training hour per employee is associated with about 0.25 pp higher productivity growth the next year. Because the 95% CI lies above zero, conclusion = positive_effect.
  • The coefficient on skill_index is −4.62 pp per index unit (skill_index_coefficient). Higher-skill firms train more but grow less. That pattern pushes the unadjusted slope downward: it is classic omitted-variable bias, and the OVB identity naive = b₁ + b₂·δ holds exactly (out/state/checks.md).
  • RMSE falls from 3.86 pp (baseline_metric) to 1.98 pp (model_metric). R² rises from 0.07 to 0.76 (naive_r2, adjusted_r2).
  • Sensitivity: keeping the 12 negative-hours rows gives 0.252 (sensitivity_incl_negative_hours_estimate; the unadjusted slope is then −0.135, naive_incl_negative_hours_estimate). Adding skill² gives 0.254 (sensitivity_skill_sq_estimate). The hours×skill interaction is −0.0003 with p = 0.96 (sensitivity_interaction_term, sensitivity_interaction_term_p), so these data show no sign that the effect varies with skill.
  • Figure: out/figure1.png (scatter plot, unadjusted line, adjusted line evaluated at mean skill). Table: out/table1.csv.

# Uncertainty

The robust SE of the main effect is 0.0098 pp/hour (effect_se), giving a 95% CI of [0.234, 0.273]. This interval reflects sampling error only, given the model. It does not cover model or identification uncertainty. The sensitivity estimates all fall between 0.252 and 0.254, which is well inside the main CI.

# Limitations and open issues

  • Identification rests on an untestable assumption. The estimate is causal only if skill_index captures all confounding. Any unobserved factor that drives both training and growth (management quality, sector, firm size, prior growth trends, mean reversion) would bias it. The file contains no other variables, so this could not be checked. The large shift from −0.13 to +0.25 when one control is added shows how sensitive the estimate is to what is controlled for. Another omitted confounder could move it just as far.
  • Measurement error in skill_index. If the index measures true skill with error, the adjustment is incomplete. Because skill relates negatively to growth and positively to training, the residual bias would most likely push the estimate down. That was not quantified.
  • Functional form. Linearity in training hours was assumed, as the task requires. Only skill² and the interaction were checked. Nonlinearity in hours (for example, diminishing returns) was not tested.
  • Negative training hours. These values suggest a data-generation or recording artefact, perhaps an uncensored latent variable. Dropping them conditions on a function of treatment. The sensitivity run shows this barely matters (0.252 vs 0.254), but the true meaning of these rows is unknown.
  • Overlap and external validity. Low-skill firms with high training hours are rare (corr ≈ 0.68), so at the extremes the estimate partly relies on linear extrapolation. The data are simulated, so nothing here describes real firms.
  • Not checked: clustering or dependence between firms (none can be identified from the data), outliers and influence diagnostics beyond visual inspection, and timing problems beyond the column descriptions.
Files · main
Menu

Theme