SPB Git

spb/wp29_uqo

Public

# F2-conf-01 — Programme effect on student scores with cluster-valid uncertainty

# Question

A programme was assigned to whole schools. We estimate τ, the difference between student-weighted mean scores in treated and control schools (OLS coefficient of score on treated with intercept), give a sampling uncertainty that respects the school-level design, and test H0: τ = 0 at the 5% level (two-sided).

# Data and exclusions

data/schools.csv (synthetic; SHA-256 0f1d8378…c88a) has 1000 rows (n_input_rows). No missing values, duplicate rows or duplicate student IDs were found. out/exclusions.csv therefore records two filtering steps that each removed 0 rows. All n_analysed = 1000 students were used. They come from n_schools = 40 schools of 25 students each, and n_treated_schools = 20 of those schools are treated. Treatment is constant within every school. data_issues is empty. Full audit: out/state/data_audit.md.

# Method

  • Baseline: OLS of score on treated with the conventional iid, homoskedastic standard error (se_iid).
  • Main analysis: the same OLS point estimate (tau_hat), with a cluster-robust variance clustered on school_id. This uses the CR1 small-sample correction from statsmodels: G/(G−1)·(N−1)/(N−K). The SE allows any correlation among students in the same school and assumes schools are independent. Because there are only 40 clusters, the p-value and 95% CI use a t distribution with G−1 = 39 degrees of freedom (df_cluster).
  • Cross-check: a Welch two-sample t-test on the 40 school means (school_means_welch_se, school_means_welch_p).
  • ICC: I subtracted each arm's mean score to get residuals, then applied a one-way ANOVA variance-components estimator by school (2 between-school df used up by the arm means). icc_hat = σ²_between / (σ²_between + σ²_within). It implies a design effect of 1 + (25−1)·ICC (design_effect_from_icc).
  • The method is deterministic, so no random seed is used (random_seed = null).

# Results

  • Mean score was 51.28 in treated schools (mean_score_treated) and 50.32 in control schools (mean_score_control).
  • tau_hat = 0.961 points.
  • Valid (cluster) inference: se_cluster = 0.729, t_stat_cluster = 1.32, p_value = 0.195. The 95% CI is [tau_ci_low, tau_ci_high] = [−0.513, 2.436].
  • H0: τ = 0 is not rejected at the 5% level (effect_significant_5pct = false). The data do not support a non-zero programme effect.
  • The naive baseline would have concluded otherwise: se_iid = 0.282, baseline_p_value_iid = 0.00068, CI [baseline_ci_iid_low, baseline_ci_iid_high] = [0.408, 1.515]. That conclusion is invalid because it treats 1000 correlated students as independent observations.

# Uncertainty

  • icc_hat = 0.240: about a quarter of residual score variance lies between schools.
  • With 25 students per school, this gives a design effect of about 6.77 (design_effect_from_icc). That matches the observed ratio se_ratio_cluster_to_iid = 2.58, whose square is about 6.68.
  • The school-means Welch test gives almost the same SE and p-value (school_means_welch_se = 0.738, school_means_welch_p = 0.201), which supports the cluster-robust result.
  • The effective sample size is about 1000/6.8 ≈ 150 students, and the information really comes from 40 schools.

# Limitations and open issues

  • The data are synthetic. Reading τ as causal assumes that schools were assigned to treatment as if at random; the data cannot verify this.
  • Cluster-robust inference is asymptotic in the number of clusters. With 40 balanced clusters (20/20), CR1 with t(39) is generally adequate, and the school-means analysis agrees closely. A wild-cluster bootstrap was not run because the task does not require it.
  • Not rejecting H0 does not show the effect is zero. The 95% CI includes effects from about −0.5 to +2.4 points.
  • No covariates were available, so precision could not be improved through adjustment.
Files · main
Menu

Theme