SPB Git

spb/wp29_uqo

Public
5.4 KB · 41 lines markdown
1# F6-conf-04 — Workforce training and productivity growth (simulated data)23## Question4What 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.56## Data and exclusions7`data/firms.csv` has 1,200 rows (one per firm). There are no missing values, no duplicate `firm_id`s 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.89## Method10- **Baseline (required):** OLS of `productivity_growth` on `training_hours` with an intercept.11- **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.12- **Standard errors:** heteroskedasticity-robust (HC1) throughout. Conventional SEs are almost identical (0.00984 vs 0.00981).13- **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.14- No randomness is used, so there is no seed. `out/analysis.py` regenerates all outputs.1516## Results17| model | estimate (pp/hour) | robust SE | 95% CI |18|---|---|---|---|19| Unadjusted OLS | −0.132 | 0.0146 | [−0.160, −0.103] |20| **Adjusted for skill_index (main)** | **0.254** | 0.0098 | [0.234, 0.273] |21| Adjusted, incl. negative-hours rows | 0.252 | 0.0095 | [0.234, 0.271] |22| Adjusted + quadratic terms (linear coef.) | 0.242 | 0.0289 | [0.185, 0.299] |2324- 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.25- 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.26- Residual RMSE falls from 3.86 pp (unadjusted) to 1.98 pp (adjusted).27- Figure 1 (`figure1.png`) shows both fitted lines; the adjusted line is evaluated at the mean `skill_index`. Full numbers are in `table1.csv`.28- **Conclusion code: `positive_effect`.** The 95% CI [0.234, 0.273] lies entirely above zero.2930## Uncertainty31The 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.3233## Limitations and open issues34- **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.35- **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.36- **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.37- **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.38- **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.39- **Inference:** I assumed observations are independent across firms. There is no clustering information (e.g. by industry or region) in the file.40- **External validity:** the data are simulated, so these results show a method working on constructed data. They are not evidence about real training programmes.41
Files · main
Menu

Theme