SPB Git

spb/wp29_uqo

Public

# F6-conf-04 — Training hours and productivity growth (simulated firm data)

# Question

What is the effect of one more training hour per employee during the programme year on productivity growth in the following year, measured in percentage points per hour? We assume selection on observables given the pre-programme skill_index, and a linear, homogeneous effect. As required, we also report the unadjusted association as the baseline.

# Data and exclusions

  • The only input is data/firms.csv, with 1200 rows (n_input_rows) and 4 columns. It has no missing values, no duplicated firm_id, and its SHA-256 matches the bundle (details in out/state/data_audit.md).
  • Data issue: 12 firms have negative training_hours (minimum −7.585). Negative training hours are impossible, so these rows are excluded from the main analysis (out/exclusions.csv, step 3). A sensitivity analysis keeps them in (data_issues).
  • After exclusions, 1188 firms are analysed (n_analysed). The arithmetic is 1200 − 0 − 0 − 12 = 1188.
  • Confounding: skill_index is strongly correlated with training_hours (r = 0.68 in the analysed sample, corr_skill_hours). The skill–growth correlation was −0.79 in the audit, which was run on all 1200 rows. In short, higher-skill firms train more and grow less.

# Method

  • Baseline: OLS of productivity_growth on training_hours with an intercept.
  • Main model: OLS of productivity_growth on training_hours and skill_index. skill_index was measured the year before the programme, so it is a legitimate pre-treatment control, and it is the only observed confounder. Under the stated assumptions, the coefficient on training_hours identifies the estimand.
  • Standard errors: HC1 heteroskedasticity-robust (effect_se_type). 95% CIs use the normal approximation. Each RMSE is sqrt(mean(e²)) over the analysed sample.
  • Diagnostics (not the estimand):
    • an added skill² term;
    • an hours × skill interaction;
    • an hours² term;
    • a refit that includes the 12 excluded rows.
  • No randomness is used (random_seed = null). out/analysis.py produces all outputs: results.json, table1.csv, figure1.png and exclusions.csv.

# Results

  • Unadjusted association: −0.132 pp per hour (naive_estimate), 95% CI [−0.160, −0.103] (naive_ci_low, naive_ci_high). The RMSE is 3.860 pp (baseline_metric).
  • Adjusted effect (main estimate): +0.254 pp per hour (effect_estimate), robust SE 0.0098 (effect_se), 95% CI [0.234, 0.273] (effect_ci_low, effect_ci_high). The RMSE is 1.976 pp (model_metric).
  • Skill coefficient: −4.62 pp per index unit (skill_index_coefficient).
  • Conclusion: positive_effect (conclusion). The adjusted interval lies entirely above zero.
  • Sign reversal: the unadjusted slope is negative because of omitted-variable bias. Training is concentrated in high-skill firms, and those firms have lower subsequent growth.
  • Table 1 (out/table1.csv) lists both models and the sensitivity fits. Figure 1 (out/figure1.png) shows the scatter with the unadjusted line and the adjusted line, evaluated at mean skill.

# Uncertainty

  • The robust 95% CI for the effect is [0.234, 0.273] (effect_ci_low, effect_ci_high). The conventional SE, 0.00984 (effect_se_conventional), is almost identical to the robust SE, 0.00981 (effect_se).
  • The estimate barely changes under the sensitivity checks:
    • Including the 12 negative-hours rows: 0.252, CI [0.234, 0.271] (sensitivity_all_rows_estimate, sensitivity_all_rows_ci_low, sensitivity_all_rows_ci_high).
    • Adding skill²: 0.254, CI [0.235, 0.273] (sensitivity_quad_skill_estimate, sensitivity_quad_skill_ci_low, sensitivity_quad_skill_ci_high).
  • Neither the hours × skill interaction (p = 0.96, diag_interaction_pvalue) nor the hours² term (p = 0.86, diag_hours_sq_pvalue) is significant, so the data show no evidence against linearity or homogeneity.
  • These intervals cover sampling uncertainty only. They do not cover identification uncertainty.

# Limitations and open issues

  • What would invalidate the result:
    • Unobserved confounding. The result depends on the assumption that, once skill_index is held fixed, nothing else drives both training and growth. Examples would be management quality, sector or firm size. The data cannot test this. Because adjusting for the one observed confounder reversed the sign, the estimate is clearly very sensitive to confounding. A second omitted confounder of similar strength could move it substantially.
    • Measurement error in skill_index. If the index measures true skill with noise, the adjustment is incomplete. Residual confounding would then push the estimate back toward the negative unadjusted slope, so the true effect could be larger than reported.
    • The negative-hours rows. The 12 rows suggest the treatment variable may be coded with error (for example, noise or unclipped values). Classical measurement error in hours would attenuate the estimate. The cause was not established; the rows were excluded, and including them makes little difference (sensitivity_all_rows_estimate).
  • What was not checked:
    • non-linear functional forms beyond the quadratic and interaction terms;
    • effect heterogeneity in dimensions other than skill;
    • outliers and influence (no leverage diagnostics were run);
    • spillovers between firms;
    • whether "the following year" is the right horizon (persistence or fade-out of the effect cannot be studied).
  • External validity: the data are simulated. The number is an estimate of the parameter within this exercise and says nothing about real training programmes.
Files · main
Menu

Theme