SPB Git

spb/wp29_uqo

Public

# Data audit (P1)

File: data/firms.csv — SHA-256 34aa682e59ef64cfc56931ea33bb809797cd53eca83edfe370c31aeaa8e8b7df (matches bundle.json).

  • 1200 rows (header excluded), 4 columns: firm_id (int, 1001–2200, unique), skill_index (float, standardised; mean -0.001, sd 0.995, range -3.83 to 2.96), training_hours (float, hours/employee; mean 19.95, sd 8.24, range -7.585 to 51.77), productivity_growth (float, %; mean 7.08, sd 4.02, range -4.04 to 19.39).
  • No missing values; no duplicate firm_id; no duplicate rows. No dates (timing is implied by variable definitions: skill_index pre-programme, training during, growth after).
  • Anomaly: 12 rows have training_hours < 0 (min -7.585). Negative hours are physically impossible. All 12 have low skill_index (-3.0 to -1.0), consistent with an untruncated simulated assignment rule. Zero rows with exactly 0 hours.
  • Minor: 4 integer-valued training_hours (e.g. 20.0) — not heaping, kept.
  • Correlations: corr(skill, training)=0.69, corr(skill, growth)=-0.79, corr(training, growth)=-0.28 → skill_index is a strong confounder (raises training, lowers growth), so the naive slope is expected to be biased downward.
  • No input violates the information-availability rules (skill_index is pre-programme).

# Decision

Main analysis excludes the 12 negative-hour rows (invalid treatment values; exclusion depends on the regressor, not the outcome, so it does not induce selection bias in a correctly specified linear model). Sensitivity: same models on all 1200 rows, reported in table1 and results (sensitivity_* keys). The same sample (n=1188) is used for the naive baseline and the adjusted model.

Files · main
Menu

Theme