PO.ID.Exact

Exact (point) identification: back-door and front-door adjustment, IV/LATE, regression discontinuity, proximal inference, dynamic regimes, and related theorems.

DTR 26 core · 30 supporting · 5 submodules Identification for dynamic treatment regimes over a countable treatment alphabet: sequential exchangeability, universal singleton overlap, and the g-formula. Dynamic­LATE 59 core · 45 supporting · 4 submodules Dynamic LATE: identification of complier effects in multi-period instrumented settings. Heckman­Roy 24 core · 17 supporting · 2 submodules The Heckman/Roy selection model: identification of treatment parameters under self-selection. Multiple­Instrument­IV 77 core · 43 supporting · 5 submodules Multiple-instrument IV: finite-support centered-score response-type algebra and positive-weight results conditional on abstract sign alignment; the generic endpoints do not establish a projected or saturated 2SLS first stage, and MTW partial monotonicity is not formalized. Partial­Linear 17 core · 19 supporting · 2 submodules Partially linear continuous-treatment identification: the potential-outcome setup, homogeneous dose-response restriction, Robinson residualization, and slope-identification theorem. Proximal 22 core · 37 supporting · 4 submodules Proximal causal inference: identification through outcome- and treatment-confounding proxies via bridge functions. QTE 9 core · 8 supporting · 2 submodules Quantile treatment effects (Firpo 2007): backdoor identification of the marginal QTE at level τ — the τ-quantile of the treated potential outcome Y(1) minus that of the control Y(0). DistributionalBackdoor lifts the mean-level backdoor to the whole potential-outcome law via inverse-probability weighting; QuantileEffect adds the quantile layer, identifying the QTE as the difference of the identified laws quantiles. RDD 31 core · 32 supporting · 3 submodules Regression discontinuity: identification of the cutoff effect from continuity of conditional regressions. Variable­Intensity­IV 50 core · 29 supporting · 2 submodules Variable-intensity instrumental variables: directed-pair Wald identification of an average causal response over ordered treatment margins; the general multivalued-instrument population 2SLS characterization is not derived.
ATE 25 core · 37 supporting This file proves backdoor identification for the average treatment effect in the potential-outcome framework. ★ conditionalMeanOutcome_backdoor★ ate_backdoor★ regression_adjustment

Backdoor Average Treatment Effect

This file proves backdoor identification for the average treatment effect in the potential-outcome framework. It connects conditional independence, consistency, and overlap assumptions to the standard adjustment formula for binary treatment and real-valued outcomes.

The adjustment covariate has an arbitrary measurable value space, so the same setup covers discrete, continuous, and vector-valued covariates. The proof uses conditional expectations with respect to the sigma-algebra generated by the covariate.

The main public results are conditionalMeanOutcome_backdoor_of_propScore_ne, which isolates the per-arm assumptions, conditionalMeanOutcome_backdoor, which discharges nonvanishing from two-sided overlap, ate_backdoor, and regression_adjustment, which shows the adjusted conditional functional is the observable regression E[Y | D=d, X].

structure POBackdoorSystem reviewed
Causalean.PO

A backdoor system consists of a binary treatment variable, a real-valued outcome variable, and an adjustment covariate with an arbitrary measurable value space, where the three variables are pairwise distinct.

Definition (Lean source)
P :
γ :
D :
P.V
Y :
P.V
Xvar :
POVar P γ
hDbool :
P.X D ≃ᵐ Bool
hYreal :
P.X Y ≃ᵐ ℝ
hDY :
D ≠ Y
hDX :
D ≠ Xvar.v
hYX :
Y ≠ Xvar.v
Causalean.PO.POBackdoorSystem · Causalean/PO/ID/Exact/ATE.lean:59 · uses POSystem
def dVar reviewed
Causalean.PO.POBackdoorSystem

The treatment variable used in backdoor adjustment represents the treatment in a binary-treatment system on the two possible arms.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
dVar S :
⟨S.D, S.hDbool⟩
Causalean.PO.POBackdoorSystem.dVar · Causalean/PO/ID/Exact/ATE.lean:80 · uses POBackdoorSystem , POSystem , POVar
def yVar reviewed
Causalean.PO.POBackdoorSystem

The outcome variable used in backdoor adjustment represents the outcome in a binary-treatment system on the real line.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
yVar S :
POVar P ℝ
⟨S.Y, S.hYreal⟩
Causalean.PO.POBackdoorSystem.yVar · Causalean/PO/ID/Exact/ATE.lean:83 · uses POBackdoorSystem , POSystem , POVar
def xVar reviewed
Causalean.PO.POBackdoorSystem

The covariate variable used for adjustment is the covariate specified by the backdoor system with its original measurable value space.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
xVar S :
POVar P γ
S.Xvar
Causalean.PO.POBackdoorSystem.xVar · Causalean/PO/ID/Exact/ATE.lean:86 · uses POBackdoorSystem , POSystem , POVar
def YofD reviewed
Causalean.PO.POBackdoorSystem

The arm-specific potential outcome in a backdoor system records each unit's outcome if treatment were set to the selected arm, rather than merely conditioning on units observed in that arm.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
d :
YofD S d :
P.Ω → ℝ
S.yVar.cfUnder S.dVar d
Causalean.PO.POBackdoorSystem.YofD · Causalean/PO/ID/Exact/ATE.lean:90 · uses POBackdoorSystem , POSystem
def factualD reviewed
Causalean.PO.POBackdoorSystem

The factual treatment in a backdoor system records each unit's realized treatment arm.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
factualD S :
P.Ω → Bool
S.dVar.factual
Causalean.PO.POBackdoorSystem.factualD · Causalean/PO/ID/Exact/ATE.lean:94 · uses POBackdoorSystem , POSystem
def factualY reviewed
Causalean.PO.POBackdoorSystem

The factual outcome in a backdoor system records each unit's observed real-valued response.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
factualY S :
P.Ω → ℝ
S.yVar.factual
Causalean.PO.POBackdoorSystem.factualY · Causalean/PO/ID/Exact/ATE.lean:97 · uses POBackdoorSystem , POSystem
def factualX reviewed
Causalean.PO.POBackdoorSystem

The factual covariate in a backdoor system records the observed adjustment value for each unit.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
factualX S :
P.Ω → γ
S.xVar.factual
Causalean.PO.POBackdoorSystem.factualX · Causalean/PO/ID/Exact/ATE.lean:100 · uses POBackdoorSystem , POSystem
def sigmaX reviewed
Causalean.PO.POBackdoorSystem

The information set used for backdoor adjustment in a binary-treatment system is exactly the σ-algebra generated by the observed covariate.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
sigmaX S :
comap S.factualX inferInstance
Causalean.PO.POBackdoorSystem.sigmaX · Causalean/PO/ID/Exact/ATE.lean:122 · uses POBackdoorSystem , POSystem
def yUnderD reviewed
Causalean.PO.POBackdoorSystem

The regimed outcome variable in a backdoor system pairs the outcome with an intervention that fixes treatment to the selected arm, making that arm available to counterfactual-independence statements.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
d :
yUnderD S d :
⟨S.yVar, Regime.single S.D (S.hDbool.symm d)⟩
def cfBundle reviewed
Causalean.PO.POBackdoorSystem

The counterfactual bundle used in the unconfoundedness assumption for a backdoor system collects both treated and untreated potential outcomes, so joint exchangeability covers both ATE arms.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
cfBundle S :
POCFBundle.cons (S.yUnderD true) <| POCFBundle.cons (S.yUnderD false) <| POCFBundle.nil P
Causalean.PO.POBackdoorSystem.cfBundle · Causalean/PO/ID/Exact/ATE.lean:145 · uses POBackdoorSystem , POCFBundle , POSystem
def propScore reviewed
Causalean.PO.POBackdoorSystem

The arm-specific propensity score in a backdoor system is the conditional treatment-arm probability given the adjustment covariates; the selected arm determines which overlap condition is relevant.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
d :
propScore S d :
P.Ω → ℝ
P.μ[S.dVar.indicator d | S.sigmaX]
Causalean.PO.POBackdoorSystem.propScore · Causalean/PO/ID/Exact/ATE.lean:153 · uses POBackdoorSystem , POSystem
def conditionalMeanOutcome reviewed
Causalean.PO.POBackdoorSystem

The arm-specific conditional mean potential outcome in a backdoor system averages the potential outcome given the adjustment covariates for the selected treatment arm.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
d :
conditionalMeanOutcome S d :
P.Ω → ℝ
P.μ[S.YofD d | S.sigmaX]
Causalean.PO.POBackdoorSystem.conditionalMeanOutcome · Causalean/PO/ID/Exact/ATE.lean:159 · uses POBackdoorSystem , POSystem
def ATE reviewed
Causalean.PO.POBackdoorSystem

The average treatment effect in a binary-treatment backdoor system averages each unit's treated-minus-untreated potential-outcome contrast.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
ATE S :
ℝ
∫ ω, S.YofD true ω - S.YofD false ω ∂P.μ
Causalean.PO.POBackdoorSystem.ATE · Causalean/PO/ID/Exact/ATE.lean:231 · uses POBackdoorSystem , POSystem
def adjustedCE reviewed
Causalean.PO.POBackdoorSystem

The observable arm-specific adjustment functional in a backdoor system divides the covariate-conditional outcome contribution of an arm by its propensity, with the selected arm determining both quantities.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
d :
adjustedCE S d :
P.Ω → ℝ
fun ω
=> P.μ[fun ω' => S.factualY ω' * S.dVar.indicator d ω' | S.sigmaX] ω / S.propScore d ω
Causalean.PO.POBackdoorSystem.adjustedCE · Causalean/PO/ID/Exact/ATE.lean:235 · uses POBackdoorSystem , POSystem
def adjustedATE reviewed
Causalean.PO.POBackdoorSystem

The observable adjusted ATE functional in a backdoor system averages the treated-minus-control contrast of the two adjusted conditional means.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
adjustedATE S :
ℝ
∫ ω, S.adjustedCE true ω - S.adjustedCE false ω ∂P.μ
Causalean.PO.POBackdoorSystem.adjustedATE · Causalean/PO/ID/Exact/ATE.lean:255 · uses POBackdoorSystem , POSystem
structure Assumptions reviewed
Causalean.PO.POBackdoorSystem

The backdoor (Rosenbaum–Rubin / Firpo) identifying assumptions for the ATE, at the potential-outcome level, for binary treatment D and real outcome Y adjusted for covariates X: the observed outcome equals the potential outcome of the realized treatment arm, treatment is conditionally independent of the treated and untreated potential outcomes given the covariates, every covariate stratum has a positive chance of either treatment arm, and the treated and untreated potential outcomes are integrable.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
consistency :
P.Consistency

Consistency (SUTVA): the observed outcome equals the potential outcome of the realized arm — on {D = d}, Y = Y(d). Links observed data to the potential outcomes.

unconfoundedness :
P.CondIndepCF (RegimedVar.ofFactual S.dVar) S.cfBundle (RegimedVar.ofFactual S.xVar) P.μ

Unconfoundedness (conditional ignorability): treatment is independent of the potential outcomes given the covariates, D ⟂ (Y(1), Y(0)) | X. Stated as conditional independence of the realized D and the counterfactual bundle (Y(1), Y(0)) given σ(X).

overlap :
∀ᵐ ω ∂P.μ, 0 < S.propScore true ω ∧ S.propScore true ω < 1

Overlap (common support): every covariate stratum has a positive chance of EITHER arm — 0 < P[D=1 | σ(X)] < 1 a.s. Two-sided here because the ATE needs both arms identified at every x. Bare positivity (not a uniform c ≤ e ≤ 1−c strong-overlap bound, which is only needed for efficient-estimator asymptotics), mirroring DTR.

integrable_Y1 :
Integrable (S.YofD true) P.μ

Regularity: the treated potential outcome Y(1) is integrable (so E[Y(1)] is well-defined).

integrable_Y0 :
Integrable (S.YofD false) P.μ

Regularity: the control potential outcome Y(0) is integrable (so E[Y(0)] is well-defined).

Causalean.PO.POBackdoorSystem.Assumptions · Causalean/PO/ID/Exact/ATE.lean:263 · uses POBackdoorSystem , POSystem
theorem conditionalMeanOutcome_backdoor reviewed
Causalean.PO.POBackdoorSystem

Conditional-mean backdoor identification. In a binary-treatment backdoor system, under the backdoor identification assumptions — consistency, unconfoundedness, and two-sided overlap of the propensity score, together with integrability of the potential outcomes, for a treatment arm, the arm-specific conditional mean potential outcome equals the adjusted-outcome functional:

Formal statement
P :
shared
γ :
Type u_1
shared
S :
shared
hA :
S.Assumptions
d :
S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d
Proof (Lean source)
theorem conditionalMeanOutcome_backdoor [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.Assumptions) (d : Bool) : S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d := S.conditionalMeanOutcome_backdoor_of_condIndepCF_of_propScore_ne hA.consistency hA.unconfoundedness hA.integrable_Y1 hA.integrable_Y0 d (S.propScore_ne_of_overlap hA.overlap d)
Causalean.PO.POBackdoorSystem.conditionalMeanOutcome_backdoor · Causalean/PO/ID/Exact/ATE.lean:551 · uses POBackdoorSystem , Assumptions , adjustedCE , conditionalMeanOutcome , POSystem
theorem ate_backdoor reviewed
Causalean.PO.POBackdoorSystem

Integrated backdoor ATE identification. In a binary-treatment backdoor system, under the backdoor identification assumptions — consistency, unconfoundedness, two-sided overlap, and integrable potential outcomes, the average treatment effect equals the adjusted-outcome functional obtained by averaging the two arm-specific conditional-mean backdoor identities over the covariate distribution.

Formal statement
P :
shared
γ :
Type u_1
shared
S :
shared
hA :
S.Assumptions
S.ATE = S.adjustedATE
Proof (Lean source)
theorem ate_backdoor [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.Assumptions) : S.ATE = S.adjustedATE := by unfold POBackdoorSystem.ATE POBackdoorSystem.adjustedATE -- `conditionalMeanOutcome d = xVar.condExpGiven (YofD d) P.μ` definitionally. have hf' : S.xVar.condExpGiven (S.YofD true) P.μ =ᵐ[P.μ] S.adjustedCE true := S.conditionalMeanOutcome_backdoor hA true have hg' : S.xVar.condExpGiven (S.YofD false) P.μ =ᵐ[P.μ] S.adjustedCE false := S.conditionalMeanOutcome_backdoor hA false exact S.xVar.integral_sub_eq_integral_sub_of_condExpGiven_ae_eq hA.integrable_Y1 hA.integrable_Y0 hf' hg'
def factualDX reviewed
Causalean.PO.POBackdoorSystem

The observable treatment–covariate state in a backdoor system pairs each unit's realized arm with its adjustment covariate.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
factualDX S :
P.Ω → Bool × γ
fun ω => (S.factualD ω, S.factualX ω)
Causalean.PO.POBackdoorSystem.factualDX · Causalean/PO/ID/Exact/ATE.lean:600 · uses POBackdoorSystem , POSystem
def sigmaDX reviewed
Causalean.PO.POBackdoorSystem

The information set for observed outcome regression in a backdoor system is generated jointly by realized treatment and covariates.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
sigmaDX S :
comap S.factualDX inferInstance
Causalean.PO.POBackdoorSystem.sigmaDX · Causalean/PO/ID/Exact/ATE.lean:614 · uses POBackdoorSystem , POSystem
def outcomeReg reviewed
Causalean.PO.POBackdoorSystem

The observable outcome regression in a backdoor system is the conditional mean of observed outcomes given realized treatment and covariates.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
outcomeReg S :
P.Ω → ℝ
P.μ[S.factualY | S.sigmaDX]
Causalean.PO.POBackdoorSystem.outcomeReg · Causalean/PO/ID/Exact/ATE.lean:656 · uses POBackdoorSystem , POSystem
def regFn reviewed
Causalean.PO.POBackdoorSystem

The value-space outcome regression for a backdoor system maps each treatment–covariate cell to its observable conditional mean outcome, which is the object a regression learner estimates.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
regFn S :
Bool × γ → ℝ
S.exists_regFn.choose
Causalean.PO.POBackdoorSystem.regFn · Causalean/PO/ID/Exact/ATE.lean:692 · uses POBackdoorSystem , POSystem
def eLift reviewed
Causalean.PO.POBackdoorSystem

The value-space propensity function for a backdoor system maps each covariate value to its treated-arm probability, matching the nuisance function estimated from observed data.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
eLift S :
γ → ℝ
S.exists_propScoreLift.choose
Causalean.PO.POBackdoorSystem.eLift · Causalean/PO/ID/Exact/ATE.lean:718 · uses POBackdoorSystem , POSystem
theorem regression_adjustment reviewed
Causalean.PO.POBackdoorSystem

Regression-adjustment identification (observable). In a binary-treatment backdoor system, the adjustment functional for an arm equals the value-space outcome regression evaluated at that arm for the selected treatment arm when the observed outcome is integrable and the arm has almost-surely nonzero conditional probability given covariates:

Formal statement
P :
shared
γ :
Type u_1
shared
S :
shared
d :
hY :
Integrable S.factualY P.μ
h_ne :
∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0
S.adjustedCE d =ᵐ[P.μ] (fun ω => S.regFn (d, S.factualX ω))
Proof (Lean source)
theorem regression_adjustment [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (d : Bool) (hY : Integrable S.factualY P.μ) (h_ne : ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0) : S.adjustedCE d =ᵐ[P.μ] (fun ω => S.regFn (d, S.factualX ω)) := by have hratio_def : S.adjustedCE d = S.xVar.condExpRatio (fun ω => S.factualY ω * S.dVar.indicator d ω) (S.dVar.indicator d) P.μ := by funext ω unfold POBackdoorSystem.adjustedCE POBackdoorSystem.propScore POBackdoorSystem.sigmaX POBackdoorSystem.factualX POVar.condExpRatio POVar.condExpGiven rfl rw [hratio_def] refine S.xVar.condExpRatio_eq_of_mul (g := fun ω => S.factualY ω * S.dVar.indicator d ω) (h := S.dVar.indicator d) (target := fun ω => S.regFn (d, S.factualX ω)) ?_ ?_ · have hYint : Integrable S.factualY P.μ := hY · let s : Set P.Ω := S.dVar.event d let target : P.Ω → ℝ := fun ω => S.regFn (d, S.factualX ω) have hsDX : MeasurableSet[S.sigmaDX] s := by change MeasurableSet[comap S.factualDX inferInstance] (S.factualD ⁻¹' {d}) exact ⟨Prod.fst ⁻¹' {d}, measurableSet_singleton d |>.preimage measurable_fst, rfl⟩ have hs : MeasurableSet s := S.dVar.measurableSet_event d (measurableSet_singleton d) have hmul_indicator : (fun ω => S.factualY ω * S.dVar.indicator d ω) = s.indicator S.factualY := by funext ω by_cases hω : ω ∈ s · have hind : S.dVar.indicator d ω = 1 := S.dVar.indicator_apply_eq_one hω rw [hind, mul_one, Set.indicator_of_mem hω] · have hD : S.factualD ω ≠ d := hω have hind : S.dVar.indicator d ω = 0 := S.dVar.indicator_apply_eq_zero hD rw [hind, mul_zero, Set.indicator_of_notMem hω] have htarget_meas : Measurable[S.sigmaX] target := by fun_prop have htarget_sm : StronglyMeasurable[S.sigmaX] target := by fun_prop have houtcome_target : s.indicator S.outcomeReg = s.indicator target := by funext ω by_cases hω : ω ∈ s · have hD : S.factualD ω = d := hω rw [Set.indicator_of_mem hω, Set.indicator_of_mem hω] rw [congrFun S.outcomeReg_eq_regFn ω] simp [target, POBackdoorSystem.factualDX, hD] · rw [Set.indicator_of_notMem hω, Set.indicator_of_notMem hω] have htower : P.μ[s.indicator S.factualY | S.sigmaX] =ᵐ[P.μ] P.μ[s.indicator S.outcomeReg | S.sigmaX] := by simpa [s, POBackdoorSystem.outcomeReg] using condExp_setIndicator_condExp_of_le (μ := P.μ) (m := S.sigmaX) (m' := S.sigmaDX) S.sigmaX_le_sigmaDX S.sigmaDX_le hsDX hYint have hleft : P.μ[fun ω => S.factualY ω * S.dVar.indicator d ω | S.sigmaX] =ᵐ[P.μ] P.μ[s.indicator target | S.sigmaX] := (MeasureTheory.condExp_congr_ae (m := S.sigmaX) (μ := P.μ) (Filter.EventuallyEq.of_eq hmul_indicator)).trans (htower.trans (MeasureTheory.condExp_congr_ae (m := S.sigmaX) (μ := P.μ) (Filter.EventuallyEq.of_eq houtcome_target))) have hind_int : Integrable (S.dVar.indicator d) P.μ := by fun_prop have htarget_mul_indicator : target * S.dVar.indicator d = s.indicator target := by funext ω by_cases hω : ω ∈ s · have hind : S.dVar.indicator d ω = 1 := S.dVar.indicator_apply_eq_one hω rw [Pi.mul_apply, hind, mul_one, Set.indicator_of_mem hω] · have hD : S.factualD ω ≠ d := hω have hind : S.dVar.indicator d ω = 0 := S.dVar.indicator_apply_eq_zero hD rw [Pi.mul_apply, hind, mul_zero, Set.indicator_of_notMem hω] have htarget_mul_int : Integrable (target * S.dVar.indicator d) P.μ := by rw [htarget_mul_indicator] have houtcome_target' : s.indicator (P.μ[S.factualY | S.sigmaDX]) = s.indicator target := by simpa [POBackdoorSystem.outcomeReg] using houtcome_target exact MeasureTheory.Integrable.indicator (MeasureTheory.integrable_condExp (μ := P.μ) (m := S.sigmaDX) (f := S.factualY)) hs |>.congr (Filter.EventuallyEq.of_eq houtcome_target') have hpull : P.μ[target * S.dVar.indicator d | S.sigmaX] =ᵐ[P.μ] target * P.μ[S.dVar.indicator d | S.sigmaX] := MeasureTheory.condExp_mul_of_stronglyMeasurable_left (m := S.sigmaX) (μ := P.μ) htarget_sm htarget_mul_int hind_int change P.μ[fun ω => S.factualY ω * S.dVar.indicator d ω | S.sigmaX] =ᵐ[P.μ] P.μ[S.dVar.indicator d | S.sigmaX] * target refine hleft.trans ?_ refine (MeasureTheory.condExp_congr_ae (m := S.sigmaX) (μ := P.μ) (Filter.EventuallyEq.of_eq htarget_mul_indicator.symm)).trans ?_ exact hpull.trans (Filter.EventuallyEq.of_eq (by funext ω exact mul_comm _ _)) · have hEq : S.xVar.condExpGiven (S.dVar.indicator d) P.μ = S.propScore d := by unfold POVar.condExpGiven POBackdoorSystem.propScore POBackdoorSystem.sigmaX POBackdoorSystem.factualX rfl rw [hEq] exact h_ne
37 supporting declarations (lemmas, instances)
  • measurable_YofD lemma — In a backdoor system, the potential outcome under a fixed arm is measurable, so its conditional mean and population mean are well-defined.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Measurable (S.YofD d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_YofD (d : Bool) : Measurable (S.YofD d) := S.yVar.measurable_cfUnder S.dVar d
    Causalean.PO.POBackdoorSystem.measurable_YofD · Causalean/PO/ID/Exact/ATE.lean:104
  • measurable_factualD lemma — Observed treatment in a backdoor system is measurable, so treatment-arm events can be used for conditioning and adjustment.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualD
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualD : Measurable S.factualD := S.dVar.measurable_factual
    Causalean.PO.POBackdoorSystem.measurable_factualD · Causalean/PO/ID/Exact/ATE.lean:109
  • measurable_factualY lemma — Observed outcome in a backdoor system is measurable, so its conditional regressions are valid random variables.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualY
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualY : Measurable S.factualY := S.yVar.measurable_factual
    Causalean.PO.POBackdoorSystem.measurable_factualY · Causalean/PO/ID/Exact/ATE.lean:113
  • measurable_factualX lemma — The adjustment covariate in a backdoor system is measurable, so it generates the information set used for adjustment.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualX
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualX : Measurable S.factualX := S.xVar.measurable_factual
    Causalean.PO.POBackdoorSystem.measurable_factualX · Causalean/PO/ID/Exact/ATE.lean:117
  • sigmaX_le lemma — The covariate information set in a backdoor system is contained in the full observable σ-algebra, so covariate-measurable nuisance functions are valid random variables.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    S.sigmaX ≤ (inferInstance : MeasurableSpace P.Ω)
    Proof (Lean source)
    lemma sigmaX_le : S.sigmaX ≤ (inferInstance : MeasurableSpace P.Ω) := S.measurable_factualX.comap_le
    Causalean.PO.POBackdoorSystem.sigmaX_le · Causalean/PO/ID/Exact/ATE.lean:127
  • measurable_factualX_sigmaX lemma — The observed covariate in a backdoor system is measurable using only the information it generates, which licenses conditioning on that covariate.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable[S.sigmaX] S.factualX
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualX_sigmaX : Measurable[S.sigmaX] S.factualX := comap_measurable S.factualX
    Causalean.PO.POBackdoorSystem.measurable_factualX_sigmaX · Causalean/PO/ID/Exact/ATE.lean:133
  • propScore_eq lemma — The propensity score at a treatment arm is the conditional expectation of that arm's treatment indicator given the covariate σ-algebra.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    S.propScore d = P.μ[S.dVar.indicator d | S.sigmaX]
    Proof (Lean source)
    @[causal_defs_simps] lemma propScore_eq (d : Bool) : S.propScore d = P.μ[S.dVar.indicator d | S.sigmaX] := rfl
    Causalean.PO.POBackdoorSystem.propScore_eq · Causalean/PO/ID/Exact/ATE.lean:168
  • conditionalMeanOutcome_eq lemma — For an arm in a backdoor system, the arm-specific conditional mean potential outcome equals the conditional expectation of that arm's potential outcome given the covariate σ-algebra.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    S.conditionalMeanOutcome d = P.μ[S.YofD d | S.sigmaX]
    Proof (Lean source)
    @[causal_defs_simps] lemma conditionalMeanOutcome_eq (d : Bool) : S.conditionalMeanOutcome d = P.μ[S.YofD d | S.sigmaX] := rfl
    Causalean.PO.POBackdoorSystem.conditionalMeanOutcome_eq · Causalean/PO/ID/Exact/ATE.lean:175
  • stronglyMeasurable_propScore_sigmaX lemma — The propensity score is strongly measurable for the covariate sigma-algebra: it is a conditional expectation given that sigma-algebra.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    StronglyMeasurable[S.sigmaX] (S.propScore d)
    Proof (Lean source)
    @[fun_prop] lemma stronglyMeasurable_propScore_sigmaX (d : Bool) : StronglyMeasurable[S.sigmaX] (S.propScore d) := MeasureTheory.stronglyMeasurable_condExp
    Causalean.PO.POBackdoorSystem.stronglyMeasurable_propScore_sigmaX · Causalean/PO/ID/Exact/ATE.lean:183
  • measurable_propScore_sigmaX lemma — The propensity score for a treatment arm uses only covariate information in the backdoor system, as required for adjustment.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Measurable[S.sigmaX] (S.propScore d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_propScore_sigmaX (d : Bool) : Measurable[S.sigmaX] (S.propScore d) := (MeasureTheory.stronglyMeasurable_condExp).measurable
    Causalean.PO.POBackdoorSystem.measurable_propScore_sigmaX · Causalean/PO/ID/Exact/ATE.lean:190
  • measurable_propScore lemma — The propensity score for a treatment arm in a backdoor system is a measurable random variable on the full sample space.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Measurable (S.propScore d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_propScore (d : Bool) : Measurable (S.propScore d) := (S.measurable_propScore_sigmaX d).mono S.sigmaX_le le_rfl
    Causalean.PO.POBackdoorSystem.measurable_propScore · Causalean/PO/ID/Exact/ATE.lean:196
  • integrable_propScore lemma — The propensity score for a treatment arm in a backdoor system has a finite population mean, because it is a conditional probability.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Integrable (S.propScore d) P.μ
    Proof (Lean source)
    @[fun_prop] lemma integrable_propScore (d : Bool) : Integrable (S.propScore d) P.μ := MeasureTheory.integrable_condExp
    Causalean.PO.POBackdoorSystem.integrable_propScore · Causalean/PO/ID/Exact/ATE.lean:202
  • stronglyMeasurable_conditionalMeanOutcome_sigmaX lemma — In a backdoor system, the conditional mean potential outcome for an arm is strongly measurable for the covariate σ-algebra.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    StronglyMeasurable[S.sigmaX] (S.conditionalMeanOutcome d)
    Proof (Lean source)
    @[fun_prop] lemma stronglyMeasurable_conditionalMeanOutcome_sigmaX (d : Bool) : StronglyMeasurable[S.sigmaX] (S.conditionalMeanOutcome d) := MeasureTheory.stronglyMeasurable_condExp
    Causalean.PO.POBackdoorSystem.stronglyMeasurable_conditionalMeanOutcome_sigmaX · Causalean/PO/ID/Exact/ATE.lean:208
  • measurable_conditionalMeanOutcome lemma — In a backdoor system, the conditional mean potential outcome for an arm is a measurable random variable on the sample space.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Measurable (S.conditionalMeanOutcome d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_conditionalMeanOutcome (d : Bool) : Measurable (S.conditionalMeanOutcome d) := ((MeasureTheory.stronglyMeasurable_condExp (μ := P.μ) (m := S.sigmaX) (f := S.YofD d)).measurable).mono S.sigmaX_le le_rfl
    Causalean.PO.POBackdoorSystem.measurable_conditionalMeanOutcome · Causalean/PO/ID/Exact/ATE.lean:215
  • integrable_conditionalMeanOutcome lemma — In a backdoor system, the conditional mean potential outcome for an arm has a finite population mean whenever represented as a conditional expectation.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Integrable (S.conditionalMeanOutcome d) P.μ
    Proof (Lean source)
    @[fun_prop] lemma integrable_conditionalMeanOutcome (d : Bool) : Integrable (S.conditionalMeanOutcome d) P.μ := MeasureTheory.integrable_condExp
    Causalean.PO.POBackdoorSystem.integrable_conditionalMeanOutcome · Causalean/PO/ID/Exact/ATE.lean:223
  • adjustedCE_def lemma — The adjusted conditional functional at a treatment arm sends a unit to the conditional expectation, given the covariate σ-algebra, of the factual outcome times that arm's treatment indicator, divided by the propensity score of that arm.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    S.adjustedCE d
    = fun ω => P.μ[fun ω' => S.factualY ω' * S.dVar.indicator d ω' | S.sigmaX] ω / S.propScore d ω
    Proof (Lean source)
    @[causal_defs_simps] lemma adjustedCE_def (d : Bool) : S.adjustedCE d = fun ω => P.μ[fun ω' => S.factualY ω' * S.dVar.indicator d ω' | S.sigmaX] ω / S.propScore d ω := rfl
    Causalean.PO.POBackdoorSystem.adjustedCE_def · Causalean/PO/ID/Exact/ATE.lean:244
  • integrable_YofD lemma — Under the backdoor assumption bundle the potential outcome of either treatment arm is integrable.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.Assumptions
    d :
    Integrable (S.YofD d) P.μ
    Proof (Lean source)
    @[fun_prop] lemma Assumptions.integrable_YofD [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.Assumptions) (d : Bool) : Integrable (S.YofD d) P.μ := by cases d · exact hA.integrable_Y0 · exact hA.integrable_Y1
    Causalean.PO.POBackdoorSystem.Assumptions.integrable_YofD · Causalean/PO/ID/Exact/ATE.lean:299
  • integrable_factualY_of_consistency lemma — Factual Y is integrable whenever both treatment-arm potential outcomes are integrable and consistency links the observed outcome to the realized arm.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hcons :
    P.Consistency
    hY1 :
    Integrable (S.YofD true) P.μ
    hY0 :
    Integrable (S.YofD false) P.μ
    Integrable S.factualY P.μ
    Proof (Lean source)
    lemma integrable_factualY_of_consistency (hcons : P.Consistency) (hY1 : Integrable (S.YofD true) P.μ) (hY0 : Integrable (S.YofD false) P.μ) : Integrable S.factualY P.μ := by have hY1_ind : Integrable (fun ω => S.YofD true ω * S.dVar.indicator true ω) P.μ := by fun_prop have hY0_ind : Integrable (fun ω => S.YofD false ω * S.dVar.indicator false ω) P.μ := by fun_prop have hsum_int : Integrable (fun ω => S.YofD true ω * S.dVar.indicator true ω + S.YofD false ω * S.dVar.indicator false ω) P.μ := by fun_prop refine hsum_int.congr ?_ filter_upwards with ω have htrue := congr_fun (POVar.factual_mul_indicator_eq_cfUnder_mul_indicator_fn hcons S.yVar S.dVar true (Ne.symm S.hDY)) ω have hfalse := congr_fun (POVar.factual_mul_indicator_eq_cfUnder_mul_indicator_fn hcons S.yVar S.dVar false (Ne.symm S.hDY)) ω have htrue' : S.YofD true ω * S.dVar.indicator true ω = S.factualY ω * S.dVar.indicator true ω := by simpa [POBackdoorSystem.YofD, POBackdoorSystem.factualY] using htrue.symm have hfalse' : S.YofD false ω * S.dVar.indicator false ω = S.factualY ω * S.dVar.indicator false ω := by simpa [POBackdoorSystem.YofD, POBackdoorSystem.factualY] using hfalse.symm have hsum := S.dVar.indicator_add_indicator_not ω calc S.YofD true ω * S.dVar.indicator true ω + S.YofD false ω * S.dVar.indicator false ω = S.factualY ω * S.dVar.indicator true ω + S.factualY ω * S.dVar.indicator false ω := by rw [htrue', hfalse'] _ = S.factualY ω * (S.dVar.indicator true ω + S.dVar.indicator false ω) := by ring _ = S.factualY ω := by rw [hsum, mul_one]
    Causalean.PO.POBackdoorSystem.integrable_factualY_of_consistency · Causalean/PO/ID/Exact/ATE.lean:308
  • integrable_factualY lemma — The backdoor assumptions guarantee that the observed outcome in the system has a finite population mean, by consistency and armwise integrability.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.Assumptions
    Integrable S.factualY P.μ
    Proof (Lean source)
    @[fun_prop] lemma Assumptions.integrable_factualY [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.Assumptions) : Integrable S.factualY P.μ := S.integrable_factualY_of_consistency hA.consistency hA.integrable_Y1 hA.integrable_Y0
    Causalean.PO.POBackdoorSystem.Assumptions.integrable_factualY · Causalean/PO/ID/Exact/ATE.lean:350
  • propScore_ne_of_overlap lemma — From two-sided overlap, the per-arm propensity score P[D=d | σ(X)] is a.s. nonzero: for d = true directly from 0 < e(X), for d = false from e(X) < 1 via propScore false = 1 - e(X).
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hov :
    ∀ᵐ ω ∂P.μ, 0 < S.propScore true ω ∧ S.propScore true ω < 1
    d :
    ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0
    Proof (Lean source)
    lemma propScore_ne_of_overlap [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hov : ∀ᵐ ω ∂P.μ, 0 < S.propScore true ω ∧ S.propScore true ω < 1) (d : Bool) : ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0 := by cases d · -- false: propScore false = 1 - propScore true, and propScore true < 1. have hindD_integrable : ∀ e : Bool, Integrable (S.dVar.indicator e) P.μ := fun e => S.dVar.integrable_indicator e (measurableSet_singleton e) have hsum_ptwise : (fun ω => S.dVar.indicator true ω + S.dVar.indicator false ω) = (fun _ : P.Ω => (1 : ℝ)) := by funext ω exact S.dVar.indicator_add_indicator_not ω have hsum : P.μ[fun ω => S.dVar.indicator true ω + S.dVar.indicator false ω | S.sigmaX] =ᵐ[P.μ] (fun _ => (1 : ℝ)) := by rw [hsum_ptwise] condexp_linearity have hadd : P.μ[fun ω => S.dVar.indicator true ω + S.dVar.indicator false ω | S.sigmaX] =ᵐ[P.μ] P.μ[S.dVar.indicator true | S.sigmaX] + P.μ[S.dVar.indicator false | S.sigmaX] := by condexp_linearity [hindD_integrable true, hindD_integrable false] filter_upwards [hsum, hadd, hov] with ω h1 h2 hT have heq : S.propScore true ω + S.propScore false ω = 1 := by have : P.μ[S.dVar.indicator true | S.sigmaX] ω + P.μ[S.dVar.indicator false | S.sigmaX] ω = 1 := by rw [← Pi.add_apply, ← h2, h1] unfold POBackdoorSystem.propScore exact this have hps_false : S.propScore false ω = 1 - S.propScore true ω := by linarith rw [hps_false] intro h linarith [hT.2] · filter_upwards [hov] with ω hω exact ne_of_gt hω.1
    Causalean.PO.POBackdoorSystem.propScore_ne_of_overlap · Causalean/PO/ID/Exact/ATE.lean:360
  • conditionalMeanOutcome_backdoor_of_propScore_ne theorem — Per-arm backdoor identification. In a binary-treatment backdoor system, the arm-specific conditional mean potential outcome equals the adjusted-outcome functional when factual consistency, conditional independence of that arm's potential outcome from treatment given covariates, integrability of both potential outcomes, and nonzero propensity for the selected arm hold for that treatment arm:
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hcons :
    P.Consistency
    d :
    hunconf :
    CondIndepFun S.sigmaX S.sigmaX_le S.factualD (S.YofD d) P.μ
    hY1 :
    Integrable (S.YofD true) P.μ
    hY0 :
    Integrable (S.YofD false) P.μ
    h_ne :
    ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0
    S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d
    Proof (Lean source)
    theorem conditionalMeanOutcome_backdoor_of_propScore_ne [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hcons : P.Consistency) (d : Bool) (hunconf : CondIndepFun S.sigmaX S.sigmaX_le S.factualD (S.YofD d) P.μ) (hY1 : Integrable (S.YofD true) P.μ) (hY0 : Integrable (S.YofD false) P.μ) (h_ne : ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0) : S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d := by -- Rewrite `adjustedCE d = condExpRatio S.xVar (factualY * indD d) (indD d) P.μ`. have hratio_def : S.adjustedCE d = S.xVar.condExpRatio (fun ω => S.factualY ω * S.dVar.indicator d ω) (S.dVar.indicator d) P.μ := by funext ω unfold POBackdoorSystem.adjustedCE POBackdoorSystem.propScore POBackdoorSystem.sigmaX POBackdoorSystem.factualX POVar.condExpRatio POVar.condExpGiven rfl rw [hratio_def] -- Apply `condExpRatio_eq_of_mul` to reduce to (hprod) and (hne). refine (S.xVar.condExpRatio_eq_of_mul (g := fun ω => S.factualY ω * S.dVar.indicator d ω) (h := S.dVar.indicator d) (target := S.conditionalMeanOutcome d) ?_ ?_).symm · -- (hprod): μ[Y·1_{D=d}|σX] =ᵐ μ[1_{D=d}|σX] · conditionalMeanOutcome d. -- Integrability prerequisites. have hindD_integrable : Integrable (S.dVar.indicator d) P.μ := by fun_prop have hYofD_integrable : Integrable (S.YofD d) P.μ := by cases d · exact hY0 · exact hY1 have hYofD_bdd_integrable_aux : Integrable (fun ω => S.YofD d ω * S.dVar.indicator d ω) P.μ := by fun_prop have hYtimesInd_integrable : Integrable (fun ω => S.factualY ω * S.dVar.indicator d ω) P.μ := by exact S.dVar.integrable_mul_indicator d (measurableSet_singleton d) (S.integrable_factualY_of_consistency hcons hY1 hY0) -- Step 1: μ[Y·1_{D=d}|σX] =ᵐ μ[Y(d)·1_{D=d}|σX]. have hstep1 : S.xVar.condExpGiven (fun ω => S.factualY ω * S.dVar.indicator d ω) P.μ =ᵐ[P.μ] S.xVar.condExpGiven (fun ω => S.YofD d ω * S.dVar.indicator d ω) P.μ := by have hvw : S.yVar.v ≠ S.dVar.v := Ne.symm S.hDY have hfm := POVar.factual_mul_indicator_eq_cfUnder_mul_indicator_fn hcons S.yVar S.dVar d hvw -- `S.factualY = S.yVar.factual` and `S.YofD d = S.yVar.cfUnder S.dVar d` by def. change S.xVar.condExpGiven (fun ω => S.yVar.factual ω * S.dVar.indicator d ω) P.μ =ᵐ[P.μ] S.xVar.condExpGiven (fun ω => S.yVar.cfUnder S.dVar d ω * S.dVar.indicator d ω) P.μ rw [hfm] refine hstep1.trans ?_ -- Apply factorization with u := indD d (as a function of factualD) and v := YofD d. -- Use the plain pointwise product: indD d ω * YofD d ω. have hindMul_swap : (fun ω => S.YofD d ω * S.dVar.indicator d ω) = (fun ω => S.dVar.indicator d ω * S.YofD d ω) := by funext ω; exact mul_comm _ _ rw [hindMul_swap] -- Apply via an auxiliary lemma that takes the (u, v) shapes matching our data. -- Use `condExp_mul_of_condIndep` with: -- f = factualD, g = YofD d, u = (fun b => if b = d then 1 else 0), v = id. -- `u (factualD ω) = indD d ω` and `id (YofD d ω) = YofD d ω` by rfl. -- Set-indicator packaging: `u b := ({d} : Set Bool).indicator 1 b`, which -- satisfies `u (S.factualD ω) = S.dVar.indicator d ω`. let u : Bool → ℝ := ({d} : Set Bool).indicator (fun _ => (1 : ℝ)) have hu_meas : Measurable u := by fun_prop have hu_eq : (fun ω => u (S.factualD ω)) = S.dVar.indicator d := by funext ω unfold POVar.indicator by_cases h : S.factualD ω = d · have h1 : S.factualD ω ∈ ({d} : Set Bool) := h have h2 : ω ∈ S.dVar.event d := h rw [show u (S.factualD ω) = (1 : ℝ) from Set.indicator_of_mem h1 _, Set.indicator_of_mem h2] · have h1 : S.factualD ω ∉ ({d} : Set Bool) := h have h2 : ω ∉ S.dVar.event d := h rw [show u (S.factualD ω) = (0 : ℝ) from Set.indicator_of_notMem h1 _, Set.indicator_of_notMem h2] have huMul_int : Integrable (fun ω => u (S.factualD ω) * S.YofD d ω) P.μ := by fun_prop have hfact : P.μ[fun ω => u (S.factualD ω) * S.YofD d ω | S.sigmaX] =ᵐ[P.μ] P.μ[fun ω => u (S.factualD ω) | S.sigmaX] * P.μ[fun ω => S.YofD d ω | S.sigmaX] := by have := condExp_mul_of_condIndep (μ := P.μ) (m := S.sigmaX) S.sigmaX_le (f := S.factualD) (g := S.YofD d) S.measurable_factualD (S.measurable_YofD d) hunconf (u := u) (v := id) hu_meas measurable_id (by rw [hu_eq]; exact hindD_integrable) hYofD_integrable huMul_int exact this -- Goal (after hindMul_swap): -- S.xVar.condExpGiven (indD d * YofD d) =ᵐ -- S.xVar.condExpGiven (indD d) * conditionalMeanOutcome d. -- Unfold the definitions to land on μ[·|σX] with matching argument shapes. unfold POVar.condExpGiven POBackdoorSystem.conditionalMeanOutcome POBackdoorSystem.sigmaX POBackdoorSystem.factualX have hfact_rw : (fun ω => u (S.factualD ω)) = S.dVar.indicator d := hu_eq have hprod_rw : (fun ω => u (S.factualD ω) * S.YofD d ω) = (fun ω => S.dVar.indicator d ω * S.YofD d ω) := by funext ω; rw [congr_fun hu_eq ω] rw [hprod_rw, hfact_rw] at hfact exact hfact · -- (hne): μ[1_{D=d}|σX] ≠ 0 a.s. — supplied directly as `h_ne`. -- `S.xVar.condExpGiven (S.dVar.indicator d) P.μ = S.propScore d` definitionally. have hEq : S.xVar.condExpGiven (S.dVar.indicator d) P.μ = S.propScore d := by unfold POVar.condExpGiven POBackdoorSystem.propScore POBackdoorSystem.sigmaX POBackdoorSystem.factualX rfl rw [hEq] exact h_ne
    Causalean.PO.POBackdoorSystem.conditionalMeanOutcome_backdoor_of_propScore_ne · Causalean/PO/ID/Exact/ATE.lean:400
  • conditionalMeanOutcome_backdoor_of_condIndepCF_of_propScore_ne theorem — Backdoor identification from the traditional two-arm exchangeability bundle. Under factual consistency, joint conditional independence of treatment from both potential outcomes, integrability of both arms, for a treatment arm with nonzero propensity, the arm-specific conditional mean equals the adjusted-outcome functional.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hcons :
    P.Consistency
    hunconf :
    P.CondIndepCF (RegimedVar.ofFactual S.dVar) S.cfBundle (RegimedVar.ofFactual S.xVar) P.μ
    hY1 :
    Integrable (S.YofD true) P.μ
    hY0 :
    Integrable (S.YofD false) P.μ
    d :
    h_ne :
    ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0
    S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d
    Proof (Lean source)
    theorem conditionalMeanOutcome_backdoor_of_condIndepCF_of_propScore_ne [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hcons : P.Consistency) (hunconf : P.CondIndepCF (RegimedVar.ofFactual S.dVar) S.cfBundle (RegimedVar.ofFactual S.xVar) P.μ) (hY1 : Integrable (S.YofD true) P.μ) (hY0 : Integrable (S.YofD false) P.μ) (d : Bool) (h_ne : ∀ᵐ ω ∂P.μ, S.propScore d ω ≠ 0) : S.conditionalMeanOutcome d =ᵐ[P.μ] S.adjustedCE d := by have hCI : CondIndepFun S.sigmaX S.sigmaX_le S.factualD (S.YofD d) P.μ := by cases d · exact hunconf.component (1 : Fin 2) · exact hunconf.component (0 : Fin 2) exact S.conditionalMeanOutcome_backdoor_of_propScore_ne hcons d hCI hY1 hY0 h_ne
    Causalean.PO.POBackdoorSystem.conditionalMeanOutcome_backdoor_of_condIndepCF_of_propScore_ne · Causalean/PO/ID/Exact/ATE.lean:527
  • measurable_factualDX lemma — The observed treatment–covariate state in a backdoor system is measurable, so it can generate the information set for outcome regression.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualDX
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualDX : Measurable S.factualDX := S.measurable_factualD.prodMk S.measurable_factualX
    Causalean.PO.POBackdoorSystem.measurable_factualDX · Causalean/PO/ID/Exact/ATE.lean:608
  • sigmaDX_le lemma — The joint treatment–covariate information set in a backdoor system is contained in the full observable σ-algebra, so observed outcome regression is well-defined.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    S.sigmaDX ≤ (inferInstance : MeasurableSpace P.Ω)
    Proof (Lean source)
    lemma sigmaDX_le : S.sigmaDX ≤ (inferInstance : MeasurableSpace P.Ω) := S.measurable_factualDX.comap_le
    Causalean.PO.POBackdoorSystem.sigmaDX_le · Causalean/PO/ID/Exact/ATE.lean:622
  • measurable_factualDX_sigmaDX lemma — The observed treatment–covariate state in a backdoor system is measurable using only its jointly generated information.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable[S.sigmaDX] S.factualDX
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualDX_sigmaDX : Measurable[S.sigmaDX] S.factualDX := comap_measurable S.factualDX
    Causalean.PO.POBackdoorSystem.measurable_factualDX_sigmaDX · Causalean/PO/ID/Exact/ATE.lean:628
  • measurable_factualD_sigmaDX lemma — Observed treatment in a backdoor system is available in the joint treatment–covariate information set.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable[S.sigmaDX] S.factualD
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualD_sigmaDX : Measurable[S.sigmaDX] S.factualD := measurable_fst.comp (comap_measurable S.factualDX)
    Causalean.PO.POBackdoorSystem.measurable_factualD_sigmaDX · Causalean/PO/ID/Exact/ATE.lean:634
  • measurable_factualX_sigmaDX lemma — The observed covariate in a backdoor system is available in the joint treatment–covariate information set.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable[S.sigmaDX] S.factualX
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualX_sigmaDX : Measurable[S.sigmaDX] S.factualX := measurable_snd.comp (comap_measurable S.factualDX)
    Causalean.PO.POBackdoorSystem.measurable_factualX_sigmaDX · Causalean/PO/ID/Exact/ATE.lean:640
  • sigmaX_le_sigmaDX lemma — The covariate information set in a backdoor system is coarser than the joint treatment–covariate information set, enabling conditional-expectation tower arguments between adjustment and outcome regression.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    S.sigmaX ≤ S.sigmaDX
    Proof (Lean source)
    lemma sigmaX_le_sigmaDX : S.sigmaX ≤ S.sigmaDX := by -- `factualX = snd ∘ factualDX`, so `comap factualX ≤ comap factualDX`. have hfx : S.factualX = snd ∘ S.factualDX := rfl rw [POBackdoorSystem.sigmaX, POBackdoorSystem.sigmaDX, hfx, ← MeasurableSpace.comap_comp] exact comap_mono measurable_snd.comap_le
    Causalean.PO.POBackdoorSystem.sigmaX_le_sigmaDX · Causalean/PO/ID/Exact/ATE.lean:646
  • stronglyMeasurable_outcomeReg lemma — The observed outcome regression in a backdoor system depends measurably only on realized treatment and covariates, so it is a genuine regression nuisance.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    StronglyMeasurable[S.sigmaDX] S.outcomeReg
    Proof (Lean source)
    @[fun_prop] lemma stronglyMeasurable_outcomeReg : StronglyMeasurable[S.sigmaDX] S.outcomeReg := MeasureTheory.stronglyMeasurable_condExp
    Causalean.PO.POBackdoorSystem.stronglyMeasurable_outcomeReg · Causalean/PO/ID/Exact/ATE.lean:665
  • measurable_outcomeReg lemma — The observed outcome regression in a backdoor system is a measurable random variable on the full sample space.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.outcomeReg
    Proof (Lean source)
    @[fun_prop] lemma measurable_outcomeReg : Measurable S.outcomeReg := (S.stronglyMeasurable_outcomeReg.measurable).mono S.sigmaDX_le le_rfl
    Causalean.PO.POBackdoorSystem.measurable_outcomeReg · Causalean/PO/ID/Exact/ATE.lean:672
  • exists_regFn lemma — The σ(D, X)-measurable outcomeReg factors through (D, X): there is a measurable value-space regression function r : Bool × γ → ℝ with outcomeReg = r ∘ factualDX. This is Doob–Dynkin (exists_eq_measurable_comp); r is the function an ML regressor of Y on (D, X) targets.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    ∃ r : Bool × γ → ℝ,
    conclusion 1
    conclusion 2
    S.outcomeReg = fun ω => r (S.factualDX ω)
    Proof (Lean source)
    lemma exists_regFn : ∃ r : Bool × γ → ℝ, Measurable r ∧ S.outcomeReg = fun ω => r (S.factualDX ω) := by -- `sigmaDX = comap factualDX`, so `outcomeReg` is `comap factualDX`-measurable; -- Doob–Dynkin (`exists_eq_measurable_comp`) produces the value-space factorisation. have hmeas : Measurable[S.sigmaDX] S.outcomeReg := by fun_prop obtain ⟨r, hr_meas, hr_eq⟩ := Measurable.exists_eq_measurable_comp (f := S.factualDX) (g := S.outcomeReg) hmeas exact ⟨r, hr_meas, by funext ω; exact congrFun hr_eq ω⟩
    Causalean.PO.POBackdoorSystem.exists_regFn · Causalean/PO/ID/Exact/ATE.lean:678
  • measurable_regFn lemma — The selected value-space outcome regression for a backdoor system is measurable, so evaluating it at observed or counterfactual arms remains valid.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.regFn
    Proof (Lean source)
    @[fun_prop] lemma measurable_regFn : Measurable S.regFn := S.exists_regFn.choose_spec.1
    Causalean.PO.POBackdoorSystem.measurable_regFn · Causalean/PO/ID/Exact/ATE.lean:697
  • outcomeReg_eq_regFn lemma — The observed outcome regression equals the value-space regression evaluated at each unit's observed treatment and covariate.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    S.outcomeReg = fun ω => S.regFn (S.factualDX ω)
    Proof (Lean source)
    lemma outcomeReg_eq_regFn : S.outcomeReg = fun ω => S.regFn (S.factualDX ω) := S.exists_regFn.choose_spec.2
    Causalean.PO.POBackdoorSystem.outcomeReg_eq_regFn · Causalean/PO/ID/Exact/ATE.lean:702
  • exists_propScoreLift lemma — The σ(X)-measurable propensity propScore true factors through factualX: a measurable value-space propensity e : γ → ℝ with propScore true = e ∘ factualX (Doob–Dynkin). This is the value-space propensity an estimator learns.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    ∃ e : γ → ℝ,
    conclusion 1
    conclusion 2
    S.propScore true = fun ω => e (S.factualX ω)
    Proof (Lean source)
    lemma exists_propScoreLift : ∃ e : γ → ℝ, Measurable e ∧ S.propScore true = fun ω => e (S.factualX ω) := by have hmeas : Measurable[S.sigmaX] (S.propScore true) := by fun_prop obtain ⟨e, he_meas, he_eq⟩ := Measurable.exists_eq_measurable_comp (f := S.factualX) (g := S.propScore true) hmeas exact ⟨e, he_meas, by funext ω; exact congrFun he_eq ω⟩
    Causalean.PO.POBackdoorSystem.exists_propScoreLift · Causalean/PO/ID/Exact/ATE.lean:708
  • measurable_eLift lemma — The selected value-space propensity for a backdoor system is measurable, so it can be evaluated at the observed covariate.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    Measurable S.eLift
    Proof (Lean source)
    @[fun_prop] lemma measurable_eLift : Measurable S.eLift := S.exists_propScoreLift.choose_spec.1
    Causalean.PO.POBackdoorSystem.measurable_eLift · Causalean/PO/ID/Exact/ATE.lean:723
  • propScore_true_eq_eLift lemma — The treated-arm propensity score equals the value-space propensity evaluated at each unit's observed covariate.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    S.propScore true = fun ω => S.eLift (S.factualX ω)
    Proof (Lean source)
    lemma propScore_true_eq_eLift : S.propScore true = fun ω => S.eLift (S.factualX ω) := S.exists_propScoreLift.choose_spec.2
    Causalean.PO.POBackdoorSystem.propScore_true_eq_eLift · Causalean/PO/ID/Exact/ATE.lean:728
  • regression_adjustment_of_assumptions theorem — Regression-adjustment, packaged for identified systems. The same observable identity adjustedCE d =ᵐ E[Y|D=d,X], with the two regularity hypotheses of regression_adjustment discharged from the back-door Assumptions: integrability of the observed outcome from Assumptions.integrable_factualY, and overlap from propScore_ne_of_overlap. Lets callers in an identified context apply it with just hA.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.Assumptions
    d :
    S.adjustedCE d =ᵐ[P.μ] (fun ω => S.regFn (d, S.factualX ω))
    Proof (Lean source)
    theorem regression_adjustment_of_assumptions [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.Assumptions) (d : Bool) : S.adjustedCE d =ᵐ[P.μ] (fun ω => S.regFn (d, S.factualX ω)) := S.regression_adjustment d hA.integrable_factualY (S.propScore_ne_of_overlap hA.overlap d)
    Causalean.PO.POBackdoorSystem.regression_adjustment_of_assumptions · Causalean/PO/ID/Exact/ATE.lean:847
ATT 6 core · 7 supporting This file identifies the average treatment effect on the treated from observed data under back-door assumptions, expressing the causal target through covariate-adjusted treated outcomes and an equivalent augmented invers ★ ATT_eq_adjustedATT★ adjustedATT_eq_aipwForm

This file identifies the average treatment effect on the treated from observed data under back-door assumptions, expressing the causal target through covariate-adjusted treated outcomes and an equivalent augmented inverse-probability weighted form.

It reuses POBackdoorSystem from the ATE file but weakens the overlap requirement to the control arm. The public API includes ATTAssumptions, ATT_eq_adjustedATT, and adjustedATT_eq_aipwForm, respectively packaging the one-sided assumptions, the adjusted ATT identification theorem, and the AIPW representation.

def propTreated reviewed
Causalean.PO.POBackdoorSystem

The treated share of the population in a binary-treatment backdoor system is the population mean of the treated-arm indicator; it is the normalizing probability for effects conditional on treatment.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
propTreated S :
ℝ
∫ ω, S.dVar.indicator true ω ∂P.μ
Causalean.PO.POBackdoorSystem.propTreated · Causalean/PO/ID/Exact/ATT.lean:52 · uses POBackdoorSystem , POSystem
def ATT reviewed
Causalean.PO.POBackdoorSystem

The average treatment effect on the treated in a binary-treatment backdoor system averages individual treatment effects over treated units: ATT = E[A · (Y(1) − Y(0))] / π_T.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
ATT S :
ℝ
(∫ ω, S.dVar.indicator true ω * (S.YofD true ω - S.YofD false ω) ∂P.μ) / S.propTreated
Causalean.PO.POBackdoorSystem.ATT · Causalean/PO/ID/Exact/ATT.lean:58 · uses POBackdoorSystem , POSystem
def adjustedATT reviewed
Causalean.PO.POBackdoorSystem

The observable adjusted ATT functional in a binary-treatment backdoor system averages, among treated units, observed outcomes minus the adjusted control regression. It is the control-regression form: E[A · (Y − μ₀(X))] / π_T. Only the CONTROL regression μ₀(X) = adjustedCE false appears — the treated potential outcome is observed directly on {D = 1} via consistency (A · Y = A · Y(1)), so no treated regression μ₁(X) and hence no 0 < e(X) is needed. This is the standard ATT estimand and requires only one-sided overlap e(X) < 1. The AIPW form is recovered as a corollary (adjustedATT_eq_aipwForm).

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
shared
adjustedATT S :
ℝ
(∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) ∂P.μ) / S.propTreated
Causalean.PO.POBackdoorSystem.adjustedATT · Causalean/PO/ID/Exact/ATT.lean:65 · uses POBackdoorSystem , POSystem
structure ATTAssumptions reviewed
Causalean.PO.POBackdoorSystem

The standard ATT conditions for a binary-treatment backdoor system require factual consistency, conditional independence of treatment from the untreated potential outcome given covariates, one-sided control-arm overlap, integrability of the treated and untreated potential outcomes, and a positive marginal treatment probability.

Definition (Lean source)
P :
shared
γ :
Type u_1
shared
S :
consistency :
P.Consistency

Consistency (SUTVA): on {D = d}, the observed outcome equals Y(d).

unconfoundedness :
CondIndepFun S.sigmaX S.sigmaX_le S.factualD (S.YofD false) P.μ

One-sided unconfoundedness: D ⟂ Y(0) | X. Independence from Y(1) is unnecessary because that potential outcome is observed among treated units.

overlapControl :
∀ᵐ ω ∂P.μ, S.propScore true ω < 1

One-sided overlap (control common support): P[D=1 | σ(X)] < 1 a.s. Only the upper bound is needed for ATT — the treated arm is observed directly.

integrable_Y1 :
Integrable (S.YofD true) P.μ

Regularity: the treated potential outcome Y(1) is integrable.

integrable_Y0 :
Integrable (S.YofD false) P.μ

Regularity: the control potential outcome Y(0) is integrable.

propTreated_pos :
0 < S.propTreated

Positivity of the marginal treatment probability π_T = P[D=1].

Causalean.PO.POBackdoorSystem.ATTAssumptions · Causalean/PO/ID/Exact/ATT.lean:78 · uses POBackdoorSystem , POSystem
theorem ATT_eq_adjustedATT reviewed
Causalean.PO.POBackdoorSystem

ATT identification (one-sided overlap). In a binary-treatment backdoor system, under consistency, unconfoundedness, one-sided overlap (e(X) < 1, the control arm), and integrability of both potential outcomes, together with positivity of the marginal treatment probability, the potential-outcome-level average treatment effect on the treated equals the observable adjusted-ATT functional:

Formal statement
P :
shared
γ :
Type u_1
shared
S :
shared
hA :
S.ATTAssumptions
S.ATT = S.adjustedATT
Proof (Lean source)
theorem ATT_eq_adjustedATT [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) : S.ATT = S.adjustedATT := by unfold POBackdoorSystem.ATT POBackdoorSystem.adjustedATT congr 1 have hfalse := S.att_numerator_arm hA false hA.unconfoundedness (S.conditionalMeanOutcome_backdoor_control hA) (S.integrable_adjustedCE_control hA) have hY1 : Integrable (fun ω => S.dVar.indicator true ω * S.YofD true ω) P.μ := by fun_prop have hY0 : Integrable (fun ω => S.dVar.indicator true ω * S.YofD false ω) P.μ := by fun_prop have hAfact : Integrable (fun ω => S.dVar.indicator true ω * S.factualY ω) P.μ := by fun_prop have hAdj0 : Integrable (fun ω => S.dVar.indicator true ω * S.adjustedCE false ω) P.μ := by fun_prop -- On the treated set, consistency gives `A · Y = A · Y(1)`. have hcons : (fun ω => S.dVar.indicator true ω * S.factualY ω) = (fun ω => S.dVar.indicator true ω * S.YofD true ω) := by have hfm := POVar.factual_mul_indicator_eq_cfUnder_mul_indicator_fn hA.consistency S.yVar S.dVar true (Ne.symm S.hDY) funext ω have hω := congr_fun hfm ω change S.dVar.indicator true ω * S.factualY ω = S.dVar.indicator true ω * S.YofD true ω rw [mul_comm (S.dVar.indicator true ω) (S.factualY ω), mul_comm (S.dVar.indicator true ω) (S.YofD true ω)] exact hω calc ∫ ω, S.dVar.indicator true ω * (S.YofD true ω - S.YofD false ω) ∂P.μ = ∫ ω, (S.dVar.indicator true ω * S.YofD true ω) - (S.dVar.indicator true ω * S.YofD false ω) ∂P.μ := by congr with ω ring _ = (∫ ω, S.dVar.indicator true ω * S.YofD true ω ∂P.μ) - (∫ ω, S.dVar.indicator true ω * S.YofD false ω ∂P.μ) := by exact MeasureTheory.integral_sub hY1 hY0 _ = (∫ ω, S.dVar.indicator true ω * S.factualY ω ∂P.μ) - (∫ ω, S.dVar.indicator true ω * S.adjustedCE false ω ∂P.μ) := by rw [← MeasureTheory.integral_congr_ae (Filter.EventuallyEq.of_eq hcons), hfalse] _ = ∫ ω, (S.dVar.indicator true ω * S.factualY ω) - (S.dVar.indicator true ω * S.adjustedCE false ω) ∂P.μ := by exact (MeasureTheory.integral_sub hAfact hAdj0).symm _ = ∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) ∂P.μ := by congr with ω ring
theorem adjustedATT_eq_aipwForm reviewed
Causalean.PO.POBackdoorSystem

AIPW corollary. In a binary-treatment backdoor system, under the ATT identification assumptions — consistency, unconfoundedness, one-sided control-arm overlap, integrable potential outcomes, and a positive marginal treatment probability, provided the observed inverse-propensity-weighted correction term is integrable, the adjustedATT functional equals its augmented inverse-propensity-weighted (AIPW) form:

Formal statement
P :
shared
γ :
Type u_1
shared
S :
shared
hA :
S.ATTAssumptions
hIPW :
Integrable (fun ω => (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω)) P.μ
S.adjustedATT
= ((∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) - (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ)) / S.propTreated
Proof (Lean source)
theorem adjustedATT_eq_aipwForm [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) (hIPW : Integrable (fun ω => (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω)) P.μ) : S.adjustedATT = ((∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) - (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ)) / S.propTreated := by let W : P.Ω → ℝ := fun ω => S.propScore true ω / (1 - S.propScore true ω) let R : P.Ω → ℝ := fun ω => S.factualY ω - S.adjustedCE false ω have hW_sm : StronglyMeasurable[S.sigmaX] W := by fun_prop have hfalse_indicator : ∀ ω, 1 - S.dVar.indicator true ω = S.dVar.indicator false ω := by intro ω have hsum := S.dVar.indicator_add_indicator_not ω linarith have hIPW_weighted : Integrable (fun ω => W ω * (S.dVar.indicator false ω * R ω)) P.μ := by refine hIPW.congr ?_ refine Filter.Eventually.of_forall (fun ω => ?_) unfold W R change (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) = S.propScore true ω / (1 - S.propScore true ω) * (S.dVar.indicator false ω * (S.factualY ω - S.adjustedCE false ω)) rw [hfalse_indicator ω] ring have hIPW_zero : ∫ ω, (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ = 0 := by have hweighted_zero := S.weighted_false_residual_integral_zero hA W hW_sm hIPW_weighted calc ∫ ω, (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ = ∫ ω, W ω * (S.dVar.indicator false ω * R ω) ∂P.μ := by apply MeasureTheory.integral_congr_ae refine Filter.Eventually.of_forall (fun ω => ?_) unfold W R change (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) = S.propScore true ω / (1 - S.propScore true ω) * (S.dVar.indicator false ω * (S.factualY ω - S.adjustedCE false ω)) rw [hfalse_indicator ω] ring _ = 0 := hweighted_zero have htreated_int : Integrable (fun ω => S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω)) P.μ := by fun_prop have hnumer : ∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) - (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ = ∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) ∂P.μ := by calc ∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) - (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ = (∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) ∂P.μ) - ∫ ω, (1 - S.dVar.indicator true ω) * (S.propScore true ω / (1 - S.propScore true ω)) * (S.factualY ω - S.adjustedCE false ω) ∂P.μ := by exact MeasureTheory.integral_sub htreated_int hIPW _ = ∫ ω, S.dVar.indicator true ω * (S.factualY ω - S.adjustedCE false ω) ∂P.μ := by rw [hIPW_zero, sub_zero] unfold POBackdoorSystem.adjustedATT congr 1 exact hnumer.symm
7 supporting declarations (lemmas, instances)
  • ofFullUnconfoundedness theorem — Traditional two-arm exchangeability is sufficient for the one-sided ATT identification conditions in a backdoor system: retaining consistency, control-arm overlap, integrability of both potential outcomes, and a nonempty treated population, it projects exchangeability onto the untreated potential outcome actually missing among treated units.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    consistency :
    P.Consistency
    unconfoundedness :
    P.CondIndepCF (RegimedVar.ofFactual S.dVar) S.cfBundle (RegimedVar.ofFactual S.xVar) P.μ
    overlapControl :
    ∀ᵐ ω ∂P.μ, S.propScore true ω < 1
    integrable_Y1 :
    Integrable (S.YofD true) P.μ
    integrable_Y0 :
    Integrable (S.YofD false) P.μ
    propTreated_pos :
    0 < S.propTreated
    S.ATTAssumptions where consistency
    Proof (Lean source)
    theorem ATTAssumptions.ofFullUnconfoundedness [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (consistency : P.Consistency) (unconfoundedness : P.CondIndepCF (RegimedVar.ofFactual S.dVar) S.cfBundle (RegimedVar.ofFactual S.xVar) P.μ) (overlapControl : ∀ᵐ ω ∂P.μ, S.propScore true ω < 1) (integrable_Y1 : Integrable (S.YofD true) P.μ) (integrable_Y0 : Integrable (S.YofD false) P.μ) (propTreated_pos : 0 < S.propTreated) : S.ATTAssumptions where consistency := consistency unconfoundedness := unconfoundedness.component (1 : Fin 2) overlapControl := overlapControl integrable_Y1 := integrable_Y1 integrable_Y0 := integrable_Y0 propTreated_pos := propTreated_pos
    Causalean.PO.POBackdoorSystem.ATTAssumptions.ofFullUnconfoundedness · Causalean/PO/ID/Exact/ATT.lean:118
  • integrable_YofD lemma — The ATT assumptions make either treatment arm in the backdoor system integrable, so both arm means needed for the treated effect are finite.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.ATTAssumptions
    d :
    Integrable (S.YofD d) P.μ
    Proof (Lean source)
    @[fun_prop] lemma ATTAssumptions.integrable_YofD [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) (d : Bool) : Integrable (S.YofD d) P.μ := by cases d · exact hA.integrable_Y0 · exact hA.integrable_Y1
    Causalean.PO.POBackdoorSystem.ATTAssumptions.integrable_YofD · Causalean/PO/ID/Exact/ATT.lean:143
  • integrable_factualY lemma — The ATT assumptions ensure that the observed outcome in the backdoor system has a finite mean, using consistency to select between the two integrable potential outcomes.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.ATTAssumptions
    Integrable S.factualY P.μ
    Proof (Lean source)
    @[fun_prop] lemma ATTAssumptions.integrable_factualY [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) : Integrable S.factualY P.μ := S.integrable_factualY_of_consistency hA.consistency hA.integrable_Y1 hA.integrable_Y0
    Causalean.PO.POBackdoorSystem.ATTAssumptions.integrable_factualY · Causalean/PO/ID/Exact/ATT.lean:152
  • propScore_false_ne lemma — Under one-sided overlap (e(X) < 1), the control propensity score P[D=0 | σ(X)] = 1 - e(X) is a.s. nonzero.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.ATTAssumptions
    ∀ᵐ ω ∂P.μ, S.propScore false ω ≠ 0
    Proof (Lean source)
    lemma ATTAssumptions.propScore_false_ne [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) : ∀ᵐ ω ∂P.μ, S.propScore false ω ≠ 0 := by filter_upwards [S.propScore_false_ae, hA.overlapControl] with ω hf hlt rw [hf] intro h linarith
    Causalean.PO.POBackdoorSystem.ATTAssumptions.propScore_false_ne · Causalean/PO/ID/Exact/ATT.lean:187
  • stronglyMeasurable_adjustedCE_comap lemma — The adjustment functional for a treatment arm depends measurably only on covariate information in the backdoor system, so it is a valid covariate regression.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    StronglyMeasurable[S.sigmaX] (S.adjustedCE d)
    Proof (Lean source)
    @[fun_prop] lemma stronglyMeasurable_adjustedCE_comap (d : Bool) : StronglyMeasurable[S.sigmaX] (S.adjustedCE d) := by unfold POBackdoorSystem.adjustedCE POBackdoorSystem.propScore exact ((MeasureTheory.stronglyMeasurable_condExp (μ := P.μ) (m := S.sigmaX) (f := fun ω' => S.factualY ω' * S.dVar.indicator d ω')).measurable.div (MeasureTheory.stronglyMeasurable_condExp (μ := P.μ) (m := S.sigmaX) (f := S.dVar.indicator d)).measurable).stronglyMeasurable
    Causalean.PO.POBackdoorSystem.stronglyMeasurable_adjustedCE_comap · Causalean/PO/ID/Exact/ATT.lean:196
  • measurable_adjustedCE lemma — The adjustment functional for a treatment arm in a backdoor system is a measurable random variable on the full sample space.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    d :
    Measurable (S.adjustedCE d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_adjustedCE (d : Bool) : Measurable (S.adjustedCE d) := (S.stronglyMeasurable_adjustedCE_comap d).mono S.sigmaX_le |>.measurable
    Causalean.PO.POBackdoorSystem.measurable_adjustedCE · Causalean/PO/ID/Exact/ATT.lean:210
  • integrable_adjustedCE_control lemma — The ATT assumptions make the control-arm adjustment functional in the backdoor system integrable, allowing its treated-group weighted mean to enter the ATT formula.
    P :
    shared
    γ :
    Type u_1
    shared
    S :
    shared
    hA :
    S.ATTAssumptions
    Integrable (S.adjustedCE false) P.μ
    Proof (Lean source)
    @[fun_prop] lemma integrable_adjustedCE_control [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hA : S.ATTAssumptions) : Integrable (S.adjustedCE false) P.μ := by have hcate_int : Integrable (S.conditionalMeanOutcome false) P.μ := by fun_prop exact hcate_int.congr (S.conditionalMeanOutcome_backdoor_control hA)
    Causalean.PO.POBackdoorSystem.integrable_adjustedCE_control · Causalean/PO/ID/Exact/ATT.lean:226
CSDID 19 core · 13 supporting This file develops the potential-outcome setup for Callaway-Sant'Anna group-time treatment effects. ★ POCSDIDSystem★ att_csdid

Staggered-Adoption Difference-in-Differences

This file develops the potential-outcome setup for Callaway-Sant'Anna group-time treatment effects. It encodes treatment cohorts, never-treated comparisons, and the assumptions needed to identify the average treatment effect for a cohort at a time period.

It extends two-period DID to a finite horizon with first-treated cohorts and a never-treated comparison group. Periods are zero-indexed, so admissible group-time effects use a cohort after the first period and an outcome period no earlier than that cohort.

The central definitions are regOf, regNT, cohortEvent, neverTreatedEvent, and the group-time estimand ATT; the main theorem att_csdid proves the observable group-time DID contrast under the Callaway-Sant'Anna assumptions.

structure POCSDIDSystem reviewed
Causalean.PO

A staggered-adoption DID system has a binary treatment variable at each of T periods, where at least two periods are observed, together with a real outcome variable at each period, such that the treatment nodes are pairwise distinct across periods and likewise for the outcome nodes, and no treatment node coincides with any outcome node.

Definition (Lean source)
P :
T :
ℕ
hT :
2 ≤ T
D :
Fin T → P.V
Y :
Fin T → P.V
hDbool :
∀ s : Fin T, P.X (D s) ≃ᵐ Bool
hYreal :
∀ s : Fin T, P.X (Y s) ≃ᵐ ℝ
hDinj :
hYinj :
hDY :
∀ s t : Fin T, D s ≠ Y t
Causalean.PO.POCSDIDSystem · Causalean/PO/ID/Exact/CSDID.lean:53 · uses POSystem
def dVar reviewed
Causalean.PO.POCSDIDSystem

The period-specific treatment variable in a staggered-adoption DID system records treated status at the selected period, with that period locating the unit on the adoption path.

Definition (Lean source)
P :
shared
S :
shared
s :
Fin S.T
dVar S s :
⟨S.D s, S.hDbool s⟩
def yVar reviewed
Causalean.PO.POCSDIDSystem

The period-specific outcome variable in a staggered-adoption DID system records the real-valued response at the selected period, with that period fixing the outcome date.

Definition (Lean source)
P :
shared
S :
shared
s :
Fin S.T
yVar S s :
POVar P ℝ
⟨S.Y s, S.hYreal s⟩
def factualD reviewed
Causalean.PO.POCSDIDSystem

The observed treatment path at one date in a staggered-adoption DID system records each unit's realized treatment status at the selected period.

Definition (Lean source)
P :
shared
S :
shared
s :
Fin S.T
factualD S s :
P.Ω → Bool
(S.dVar s).factual
Causalean.PO.POCSDIDSystem.factualD · Causalean/PO/ID/Exact/CSDID.lean:87 · uses POCSDIDSystem , POSystem
def factualY reviewed
Causalean.PO.POCSDIDSystem

The observed outcome at one date in a staggered-adoption DID system records each unit's realized response at the selected period.

Definition (Lean source)
P :
shared
S :
shared
s :
Fin S.T
factualY S s :
P.Ω → ℝ
(S.yVar s).factual
Causalean.PO.POCSDIDSystem.factualY · Causalean/PO/ID/Exact/CSDID.lean:92 · uses POCSDIDSystem , POSystem
def dEvent reviewed
Causalean.PO.POCSDIDSystem

The period-specific treatment group in a staggered-adoption DID system collects units whose observed treatment matches the selected status at a chosen period, with the status distinguishing treated from untreated units.

Definition (Lean source)
P :
shared
S :
shared
s :
Fin S.T
b :
dEvent S s b :
Set P.Ω
(S.dVar s).event b
Causalean.PO.POCSDIDSystem.dEvent · Causalean/PO/ID/Exact/CSDID.lean:97 · uses POCSDIDSystem , POSystem
def dTargetUpTo reviewed
Causalean.PO.POCSDIDSystem

The partial treatment-path target for a staggered-adoption DID system starts with no intervened treatment nodes and adds exactly the treatment nodes strictly before each later cutoff, preventing regimes from overwriting outcomes or future treatment assignments.

Definition (Lean source)
P :
shared
dTargetUpTo S :
ℕ → Finset P.V
clause 1
| 0 => ∅
clause 2
| k + 1 => if h : k < S.T then insert (S.D ⟨k, h⟩) (S.dTargetUpTo k) else S.dTargetUpTo k
Causalean.PO.POCSDIDSystem.dTargetUpTo · Causalean/PO/ID/Exact/CSDID.lean:128 · uses POCSDIDSystem , POSystem
def regUpToAux reviewed
Causalean.PO.POCSDIDSystem

The partial treatment-path regime with its target certificate for a staggered-adoption DID system and a proposed treatment path intervenes nowhere at the initial cutoff and extends the regime one period at a time while certifying that exactly the past treatment nodes are targeted.

Definition (Lean source)
P :
shared
b :
Fin S.T → Bool
k :
ℕ
k ≤ S.T
regUpToAux S b k :
{ r : Regime P.V P.X // r.target = S.dTargetUpTo k }
clause 1
| 0, _ => ⟨Regime.empty, by simp [dTargetUpTo, Regime.empty]⟩
clause 2
| k + 1, h
=> have hk : k < S.T := h let pair := S.regUpToAux b k (le_of_lt hk) let r_rec : Regime P.V P.X := pair.1 have hrec : r_rec.target = S.dTargetUpTo k := pair.2 let v := S.D ⟨k, hk⟩ have hv_not : v ∉ r_rec.target := by rw [hrec] intro hmem rcases (S.dTargetUpTo_mem_iff k (le_of_lt hk) _).mp hmem with ⟨i, hi, heq⟩ have hFin : (⟨k, hk⟩ : Fin S.T) = i := S.hDinj heq have hval : (k : ℕ) = i.val := by have := congrArg val hFin; simpa using this omega let r_new := Regime.sqcup (Regime.single v ((S.hDbool ⟨k, hk⟩).symm (b ⟨k, hk⟩))) r_rec (Regime.single_disjoint_of_not_mem _ _ hv_not) ⟨r_new, by show r_new.target = S.dTargetUpTo (k + 1) simp only [r_new, Regime.sqcup_target, Regime.single_target, dTargetUpTo, hk, ↓reduceDIte] rw [hrec] ext w; simp [Finset.mem_insert, v]⟩
def regimeBy reviewed
Causalean.PO.POCSDIDSystem

The full-horizon treatment regime for a staggered-adoption DID system fixes every period's treatment to the prescribed path, where the path may represent a cohort or perpetual non-treatment.

Definition (Lean source)
P :
shared
b :
Fin S.T → Bool
regimeBy S b :
Regime P.V P.X
(S.regUpToAux b S.T (le_refl _)).1
Causalean.PO.POCSDIDSystem.regimeBy · Causalean/PO/ID/Exact/CSDID.lean:193 · uses POCSDIDSystem , POSystem , Regime
def regOf reviewed
Causalean.PO.POCSDIDSystem

The cohort treatment regime in a staggered-adoption DID system keeps units untreated before adoption and treated from adoption onward, with the cohort period marking the first treated date.

Definition (Lean source)
P :
shared
S :
shared
g :
Fin S.T
regOf S g :
Regime P.V P.X
S.regimeBy (fun s => decide (g.val ≤ s.val))
def regNT reviewed
Causalean.PO.POCSDIDSystem

The never-treated comparison regime in a staggered-adoption DID system keeps treatment off throughout the observation horizon.

Definition (Lean source)
P :
shared
S :
shared
regNT S :
Regime P.V P.X
S.regimeBy (fun _ => false)
def YofCohort reviewed
Causalean.PO.POCSDIDSystem

The cohort-path potential outcome in a staggered-adoption DID system records the outcome under adoption at the cohort date, evaluated at the outcome period for the selected cohort.

Definition (Lean source)
P :
shared
S :
shared
t g :
Fin S.T
YofCohort S t g :
P.Ω → ℝ
(S.yVar t).cf (S.regOf g)
Causalean.PO.POCSDIDSystem.YofCohort · Causalean/PO/ID/Exact/CSDID.lean:243 · uses POCSDIDSystem , POSystem
def YofNT reviewed
Causalean.PO.POCSDIDSystem

The never-treated potential outcome in a staggered-adoption DID system records the outcome had treatment remained off throughout at the selected outcome period.

Definition (Lean source)
P :
shared
S :
shared
t :
Fin S.T
YofNT S t :
P.Ω → ℝ
(S.yVar t).cf S.regNT
Causalean.PO.POCSDIDSystem.YofNT · Causalean/PO/ID/Exact/CSDID.lean:249 · uses POCSDIDSystem , POSystem
def predFin reviewed
Causalean.PO.POCSDIDSystem

The baseline period for a treatment cohort in a staggered-adoption DID system is the date immediately before adoption; the cohort date and its noninitial-period condition ensure that date exists.

Definition (Lean source)
P :
shared
S :
shared
g :
Fin S.T
_hg :
1 ≤ g.val
predFin S g _hg :
Fin S.T
⟨g.val - 1, lt_of_le_of_lt (sub_le _ _) g.isLt⟩
Causalean.PO.POCSDIDSystem.predFin · Causalean/PO/ID/Exact/CSDID.lean:268 · uses POCSDIDSystem , POSystem
def cohortEvent reviewed
Causalean.PO.POCSDIDSystem

The first-treated cohort in a staggered-adoption DID system consists of units untreated immediately before the cohort date and treated at that date; the date and its noninitial-period condition make this transition observable.

Definition (Lean source)
P :
shared
S :
shared
g :
Fin S.T
hg :
1 ≤ g.val
cohortEvent S g hg :
Set P.Ω
S.dEvent (S.predFin g hg) false ∩ S.dEvent g true
Causalean.PO.POCSDIDSystem.cohortEvent · Causalean/PO/ID/Exact/CSDID.lean:274 · uses POCSDIDSystem , POSystem
def neverTreatedEvent reviewed
Causalean.PO.POCSDIDSystem

The never-treated comparison group in a staggered-adoption DID system contains exactly the units untreated in every observed period.

Definition (Lean source)
P :
shared
S :
shared
neverTreatedEvent S :
Set P.Ω
⋂ s : Fin S.T, S.dEvent s false
Causalean.PO.POCSDIDSystem.neverTreatedEvent · Causalean/PO/ID/Exact/CSDID.lean:287 · uses POCSDIDSystem , POSystem
def ATT reviewed
Causalean.PO.POCSDIDSystem

The group-time average treatment effect on the treated in a staggered-adoption DID system compares cohort-path and never-treated potential outcomes within the first-treated cohort, for the cohort date, outcome date, and valid baseline condition.

Definition (Lean source)
P :
shared
S :
shared
g t :
Fin S.T
hg :
1 ≤ g.val
ATT S g t hg :
ℝ
normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofCohort t g ω - S.YofNT t ω)
Causalean.PO.POCSDIDSystem.ATT · Causalean/PO/ID/Exact/CSDID.lean:296 · uses POCSDIDSystem , POSystem
structure Assumptions reviewed
Causalean.PO.POCSDIDSystem

The Callaway-Sant'Anna assumptions combine consistency of the underlying potential-outcome system: no unit is treated at period zero and once treated, a unit remains treated in every later period (irreversible adoption); pre-treatment outcomes do not anticipate future treatment; each cohort's mean untreated trend matches the never-treated group's mean untreated trend; each cohort and the never-treated group occur with positive, finite probability; and the cohort and never-treated potential outcomes are integrable.

Definition (Lean source)
P :
shared
consistency :
P.Consistency

Consistency of the underlying PO system.

irreversibilityBase :
∀ᵐ ω ∂P.μ, S.factualD ⟨0, lt_of_lt_of_le Nat.zero_lt_two S.hT⟩ ω = false

Irreversibility, base case: D_0 = 0 almost surely.

irreversibilityStep :
∀ (s : Fin S.T) (h : s.val + 1 < S.T),
∀ᵐ ω ∂P.μ, S.factualD s ω = true → S.factualD ⟨s.val + 1, h⟩ ω = true

Irreversibility, absorbing: D_s = 1 ⟹ D_{s+1} = 1 almost surely.

noAnticipation :
∀ (g s : Fin S.T)
if
s.val < g.val
then
∀ᵐ ω ∂P.μ, S.YofCohort s g ω = S.YofNT s ω

No anticipation: pre-treatment outcomes are unaffected by future treatment.

parallelTrends :
∀ (g t : Fin S.T) (hg : 1 ≤ g.val) (_hgt : g.val ≤ t.val),
normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω)
= normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω)

Never-treated parallel trends (long-difference form).

posCohort :
∀ (g : Fin S.T) (hg : 1 ≤ g.val),
P.μ (S.cohortEvent g hg) ≠ 0 ∧ P.μ (S.cohortEvent g hg) ≠ ⊤

Positivity of cohorts.

posNT :
P.μ S.neverTreatedEvent ≠ 0 ∧ P.μ S.neverTreatedEvent ≠ ⊤

Positivity of the never-treated event.

intYofCohort :
∀ g t : Fin S.T, Integrable (S.YofCohort t g) P.μ

Integrability of Y_t(g) for every cohort-period pair.

intYofNT :
∀ t : Fin S.T, Integrable (S.YofNT t) P.μ

Integrability of Y_t(∞).

Causalean.PO.POCSDIDSystem.Assumptions · Causalean/PO/ID/Exact/CSDID.lean:306 · uses POCSDIDSystem , POSystem
theorem att_csdid reviewed
Causalean.PO.POCSDIDSystem

Callaway--Sant'Anna group-time DID identification. In a staggered-adoption DID system, the group-time average treatment effect on the treated equals the cohort's mean outcome change minus the corresponding never-treated mean change under irreversible adoption, consistency, no anticipation, group-time parallel trends, positive cohort and comparison-group probabilities, and integrable potential outcomes, for the selected treatment cohort which is not the initial period and the selected outcome period which is no earlier than treatment:

Formal statement
P :
shared
S :
shared
hA :
S.Assumptions
g t :
Fin S.T
hg :
1 ≤ g.val
hgt :
g.val ≤ t.val
S.ATT g t hg
= normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω)
- normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω)
Proof (Lean source)
theorem att_csdid (hA : S.Assumptions) (g t : Fin S.T) (hg : 1 ≤ g.val) (hgt : g.val ≤ t.val) : S.ATT g t hg = normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω) - normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω) := by have hPredLtG : (S.predFin g hg).val < g.val := by have : g.val - 1 < g.val := sub_lt (lt_of_lt_of_le Nat.zero_lt_one hg) Nat.zero_lt_one simpa [predFin] using this have hAE : (fun ω => S.YofCohort t g ω - S.YofNT t ω) =ᵐ[P.μ] fun ω => (S.YofCohort t g ω - S.YofCohort (S.predFin g hg) g ω) - (S.YofNT t ω - S.YofNT (S.predFin g hg) ω) := by refine (hA.noAnticipation g (S.predFin g hg) hPredLtG).mono (fun ω hω => ?_) change S.YofCohort t g ω - S.YofNT t ω = (S.YofCohort t g ω - S.YofCohort (S.predFin g hg) g ω) - (S.YofNT t ω - S.YofNT (S.predFin g hg) ω) rw [hω] ring have hATT_split : S.ATT g t hg = normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofCohort t g ω - S.YofCohort (S.predFin g hg) g ω) - normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω) := by unfold ATT rw [eventCondExp_congr_ae P.μ (S.cohortEvent g hg) (ae_restrict_of_ae hAE)] exact eventCondExp_sub P.μ (S.cohortEvent g hg) ((hA.intYofCohort g t).sub (hA.intYofCohort g (S.predFin g hg))).integrableOn ((hA.intYofNT t).sub (hA.intYofNT (S.predFin g hg))).integrableOn have h_first : normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofCohort t g ω - S.YofCohort (S.predFin g hg) g ω) = normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω) := by apply eventCondExp_congr_ae rw [EventuallyEq, MeasureTheory.ae_restrict_iff' (S.measurableSet_cohortEvent g hg)] filter_upwards [S.factualY_eq_YofCohort_on_cohortEvent hA g t hg, S.factualY_eq_YofCohort_on_cohortEvent hA g (S.predFin g hg) hg] with ω ht hpred hω rw [ht hω, hpred hω] have h_pt : normalizedRestrictedIntegral P.μ (S.cohortEvent g hg) (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω) = normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω) := hA.parallelTrends g t hg hgt have h_second : normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.YofNT t ω - S.YofNT (S.predFin g hg) ω) = normalizedRestrictedIntegral P.μ S.neverTreatedEvent (fun ω => S.factualY t ω - S.factualY (S.predFin g hg) ω) := by apply eventCondExp_congr_ae rw [EventuallyEq, MeasureTheory.ae_restrict_iff' S.measurableSet_neverTreatedEvent] filter_upwards [S.factualY_eq_YofNT_on_NT hA t, S.factualY_eq_YofNT_on_NT hA (S.predFin g hg)] with ω ht hpred hω rw [ht hω, hpred hω] rw [hATT_split, h_first, h_pt, h_second]
13 supporting declarations (lemmas, instances)
DID 13 core · 6 supporting This file formalizes two-period difference-in-differences identification of the average treatment effect on the treated. ★ PODIDSystem★ att_did

Two-Period Difference-in-Differences

This file formalizes two-period difference-in-differences identification of the average treatment effect on the treated. It packages the treatment and outcome variables, the parallel-trends assumptions, and the resulting observable contrast.

The proof works at the event-conditional-mean level: it needs consistency, no anticipation, parallel trends, positivity of treated and control groups, and integrability of the counterfactual outcomes that enter the DID contrast. The main theorem att_did identifies the treated-group mean counterfactual contrast with the observed treated-minus-control difference in outcome changes.

structure PODIDSystem reviewed
Causalean.PO

A two-period DID system packages a treatment node whose value space is identified with the booleans, together with a pre-period outcome node and a post-period outcome node each of whose value spaces is identified with the real line; the treatment node is required to be distinct from the pre-period outcome node and distinct from the post-period outcome node.

Definition (Lean source)
P :
D :
P.V
Y₀ :
P.V
Y₁ :
P.V
hDbool :
P.X D ≃ᵐ Bool
hY0real :
P.X Y₀ ≃ᵐ ℝ
hY1real :
P.X Y₁ ≃ᵐ ℝ
hDY0 :
D ≠ Y₀
hDY1 :
D ≠ Y₁
Causalean.PO.PODIDSystem · Causalean/PO/ID/Exact/DID.lean:40 · uses POSystem
def dVar reviewed
Causalean.PO.PODIDSystem

The treatment variable used in two-period DID represents the system's treatment as the treated and control arms.

Definition (Lean source)
P :
shared
S :
shared
dVar S :
⟨S.D, S.hDbool⟩
def y0Var reviewed
Causalean.PO.PODIDSystem

The baseline outcome variable in a two-period DID system records the real-valued outcome before treatment.

Definition (Lean source)
P :
shared
S :
shared
y0Var S :
POVar P ℝ
⟨S.Y₀, S.hY0real⟩
def y1Var reviewed
Causalean.PO.PODIDSystem

The follow-up outcome variable in a two-period DID system records the real-valued outcome after treatment.

Definition (Lean source)
P :
shared
S :
shared
y1Var S :
POVar P ℝ
⟨S.Y₁, S.hY1real⟩
def Y0ofD reviewed
Causalean.PO.PODIDSystem

The baseline potential outcome in a two-period DID system records what each unit's pre-period outcome would be under the selected arm; the arm is useful for stating and testing no anticipation.

Definition (Lean source)
P :
shared
S :
shared
d :
Y0ofD S d :
P.Ω → ℝ
S.y0Var.cfUnder S.dVar d
Causalean.PO.PODIDSystem.Y0ofD · Causalean/PO/ID/Exact/DID.lean:72 · uses PODIDSystem , POSystem
def Y1ofD reviewed
Causalean.PO.PODIDSystem

The follow-up potential outcome in a two-period DID system records what each unit's post-period outcome would be under the selected arm, with that arm defining the causal contrast of interest.

Definition (Lean source)
P :
shared
S :
shared
d :
Y1ofD S d :
P.Ω → ℝ
S.y1Var.cfUnder S.dVar d
Causalean.PO.PODIDSystem.Y1ofD · Causalean/PO/ID/Exact/DID.lean:77 · uses PODIDSystem , POSystem
def factualD reviewed
Causalean.PO.PODIDSystem

The observed treatment assignment in a two-period DID system records whether each unit belongs to the treated or control group.

Definition (Lean source)
P :
shared
S :
shared
factualD S :
P.Ω → Bool
S.dVar.factual
Causalean.PO.PODIDSystem.factualD · Causalean/PO/ID/Exact/DID.lean:82 · uses PODIDSystem , POSystem
def factualY₀ reviewed
Causalean.PO.PODIDSystem

The observed baseline outcome in a two-period DID system records each unit's pre-treatment response.

Definition (Lean source)
P :
shared
S :
shared
factualY₀ S :
P.Ω → ℝ
S.y0Var.factual
Causalean.PO.PODIDSystem.factualY₀ · Causalean/PO/ID/Exact/DID.lean:86 · uses PODIDSystem , POSystem
def factualY₁ reviewed
Causalean.PO.PODIDSystem

The observed follow-up outcome in a two-period DID system records each unit's post-treatment response.

Definition (Lean source)
P :
shared
S :
shared
factualY₁ S :
P.Ω → ℝ
S.y1Var.factual
Causalean.PO.PODIDSystem.factualY₁ · Causalean/PO/ID/Exact/DID.lean:90 · uses PODIDSystem , POSystem
def dEvent reviewed
Causalean.PO.PODIDSystem

The observed treatment group in a two-period DID system collects the units assigned to the selected arm, with the arm distinguishing treated from control units.

Definition (Lean source)
P :
shared
S :
shared
d :
dEvent S d :
Set P.Ω
S.dVar.event d
Causalean.PO.PODIDSystem.dEvent · Causalean/PO/ID/Exact/DID.lean:94 · uses PODIDSystem , POSystem
def ATT reviewed
Causalean.PO.PODIDSystem

The average treatment effect on the treated in a two-period DID system is the treated-group mean difference between treated and untreated follow-up potential outcomes.

Definition (Lean source)
P :
shared
S :
shared
ATT S :
ℝ
normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD true ω - S.Y1ofD false ω)
Causalean.PO.PODIDSystem.ATT · Causalean/PO/ID/Exact/DID.lean:131 · uses PODIDSystem , POSystem
structure Assumptions reviewed
Causalean.PO.PODIDSystem

Assumptions for two-period difference-in-differences identification of the ATT (def:po-did-assumptions). In words: the observed outcomes coincide with the realized-arm potential outcomes; in the pre-period the treated and control groups have the same potential outcome regardless of treatment; and absent treatment the two groups would have changed in parallel between the two periods. The treated group and the control group each occur with positive probability, and the control pre-period outcome, the control post-period outcome, and the treated post-period outcome are integrable, so the group-conditional means are well-defined and finite.

Definition (Lean source)
P :
shared
S :
consistency :
P.Consistency

Consistency (SUTVA): the observed outcome equals the potential outcome of the realized treatment arm.

noAnticipation :
∀ᵐ ω ∂P.μ, S.Y0ofD true ω = S.Y0ofD false ω

No anticipation: in the pre-period the potential outcome does not depend on the (future) treatment, so Y₀(1) = Y₀(0) a.s.

parallelTrends :
normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω)
= normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω)

Parallel trends: the average untreated change from the pre- to the post-period is the same in the treated group as in the control group.

posTrue_ne_zero :
P.μ (S.dEvent true) ≠ 0

The treated group has positive probability, so its group-mean is defined. (Finiteness μ ≠ ⊤ is automatic: P.μ is a probability measure.)

posFalse_ne_zero :
P.μ (S.dEvent false) ≠ 0

The control group has positive probability, so its group-mean is defined.

intY0ofD_false :
Integrable (S.Y0ofD false) P.μ

Integrability of the control pre-period potential outcome Y₀(0).

intY1ofD_false :
Integrable (S.Y1ofD false) P.μ

Integrability of the control post-period potential outcome Y₁(0).

intY1ofD_true :
Integrable (S.Y1ofD true) P.μ

Integrability of the treated post-period potential outcome Y₁(1).

Causalean.PO.PODIDSystem.Assumptions · Causalean/PO/ID/Exact/DID.lean:137 · uses PODIDSystem , POSystem
theorem att_did reviewed
Causalean.PO.PODIDSystem

In a two-period DID system, under the identifying assumptions — consistency, no-anticipation, parallel trends, and positive-probability, integrable treatment and control groups, the average treatment effect on the treated equals the difference between the treated group's mean pre-to-post outcome change and the control group's mean pre-to-post outcome change.

Formal statement
P :
shared
S :
shared
hA :
S.Assumptions
S.ATT
= normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.factualY₁ ω - S.factualY₀ ω)
- normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.factualY₁ ω - S.factualY₀ ω)
Proof (Lean source)
theorem att_did (hA : S.Assumptions) : S.ATT = normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.factualY₁ ω - S.factualY₀ ω) - normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.factualY₁ ω - S.factualY₀ ω) := by -- Step 1: by no anticipation, `Y₁(1) - Y₁(0)` rewrites a.e. as -- `(Y₁(1) - Y₀(1)) - (Y₁(0) - Y₀(0))`. have hAE : (fun ω => S.Y1ofD true ω - S.Y1ofD false ω) =ᵐ[P.μ] fun ω => (S.Y1ofD true ω - S.Y0ofD true ω) - (S.Y1ofD false ω - S.Y0ofD false ω) := by refine hA.noAnticipation.mono (fun ω hω => ?_) change S.Y1ofD true ω - S.Y1ofD false ω = (S.Y1ofD true ω - S.Y0ofD true ω) - (S.Y1ofD false ω - S.Y0ofD false ω) rw [hω]; ring -- Step 2: split via additivity. Use the `normalizedRestrictedIntegral` definition and -- `integral_congr_ae` + `integral_sub`. have hATT_split : S.ATT = normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD true ω - S.Y0ofD true ω) - normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω) := by unfold ATT rw [eventCondExp_congr_ae P.μ (S.dEvent true) (ae_restrict_of_ae hAE)] -- `Y0ofD true` is integrable via a.e. equality with `Y0ofD false`. have hY0true_int : Integrable (S.Y0ofD true) P.μ := hA.intY0ofD_false.congr (hA.noAnticipation.mono (fun _ h => h.symm)) exact eventCondExp_sub P.μ (S.dEvent true) (hA.intY1ofD_true.sub hY0true_int).integrableOn (hA.intY1ofD_false.sub hA.intY0ofD_false).integrableOn -- Step 3: on `dEvent true`, consistency gives -- `Y₁(1) - Y₀(1) = factualY₁ - factualY₀`. have h_first : normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD true ω - S.Y0ofD true ω) = normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.factualY₁ ω - S.factualY₀ ω) := (eventCondExp_congr_on P.μ (S.measurableSet_dEvent true) (fun ω hω => (S.factualDiff_eq_cfDiff_on_dEvent hA.consistency true ω hω).symm)) -- Step 4: parallel trends rewrites the second term to condition on `D=0`. have h_pt : normalizedRestrictedIntegral P.μ (S.dEvent true) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω) = normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω) := hA.parallelTrends -- Step 5: on `dEvent false`, consistency gives -- `Y₁(0) - Y₀(0) = factualY₁ - factualY₀`. have h_second : normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.Y1ofD false ω - S.Y0ofD false ω) = normalizedRestrictedIntegral P.μ (S.dEvent false) (fun ω => S.factualY₁ ω - S.factualY₀ ω) := eventCondExp_congr_on P.μ (S.measurableSet_dEvent false) (fun ω hω => (S.factualDiff_eq_cfDiff_on_dEvent hA.consistency false ω hω).symm) rw [hATT_split, h_first, h_pt, h_second]
6 supporting declarations (lemmas, instances)
  • measurable_Y0ofD lemma — In a two-period DID system, the baseline potential outcome under a fixed arm is measurable, so group-conditional baseline means are well-defined.
    P :
    shared
    S :
    shared
    d :
    Measurable (S.Y0ofD d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_Y0ofD (d : Bool) : Measurable (S.Y0ofD d) := S.y0Var.measurable_cfUnder S.dVar d
    Causalean.PO.PODIDSystem.measurable_Y0ofD · Causalean/PO/ID/Exact/DID.lean:99
  • measurable_Y1ofD lemma — In a two-period DID system, the follow-up potential outcome under a fixed arm is measurable, so group-conditional follow-up means are well-defined.
    P :
    shared
    S :
    shared
    d :
    Measurable (S.Y1ofD d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_Y1ofD (d : Bool) : Measurable (S.Y1ofD d) := S.y1Var.measurable_cfUnder S.dVar d
    Causalean.PO.PODIDSystem.measurable_Y1ofD · Causalean/PO/ID/Exact/DID.lean:105
  • measurable_factualD lemma — Treatment assignment in a two-period DID system is measurable, so treated and control groups form valid conditioning events.
    P :
    shared
    S :
    shared
    Measurable S.factualD
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualD : Measurable S.factualD := S.dVar.measurable_factual
    Causalean.PO.PODIDSystem.measurable_factualD · Causalean/PO/ID/Exact/DID.lean:111
  • measurable_factualY₀ lemma — The observed baseline outcome in a two-period DID system is measurable, so its treated and control means can enter the DID contrast.
    P :
    shared
    S :
    shared
    Measurable S.factualY₀
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualY₀ : Measurable S.factualY₀ := S.y0Var.measurable_factual
    Causalean.PO.PODIDSystem.measurable_factualY₀ · Causalean/PO/ID/Exact/DID.lean:116
  • measurable_factualY₁ lemma — The observed follow-up outcome in a two-period DID system is measurable, so its treated and control means can enter the DID contrast.
    P :
    shared
    S :
    shared
    Measurable S.factualY₁
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualY₁ : Measurable S.factualY₁ := S.y1Var.measurable_factual
    Causalean.PO.PODIDSystem.measurable_factualY₁ · Causalean/PO/ID/Exact/DID.lean:121
  • measurableSet_dEvent lemma — In a two-period DID system, membership in either observed treatment arm defines a measurable event suitable for group means.
    P :
    shared
    S :
    shared
    d :
    MeasurableSet (S.dEvent d)
    Proof (Lean source)
    lemma measurableSet_dEvent (d : Bool) : MeasurableSet (S.dEvent d) := S.dVar.measurableSet_event _ (measurableSet_singleton _)
    Causalean.PO.PODIDSystem.measurableSet_dEvent · Causalean/PO/ID/Exact/DID.lean:126
Frontdoor 24 core · 15 supporting This file formalizes classical frontdoor identification for a binary treatment, finite mediator, and real outcome in the potential-outcome framework. ★ POFrontdoorSystem★ EofY_eq_frontdoorTerm★ ate_frontdoor

Frontdoor Average Treatment Effect

This file formalizes classical frontdoor identification for a binary treatment, finite mediator, and real outcome in the potential-outcome framework. It defines the frontdoor subsystem, assumptions, observable adjustment functional, and the proof equating that functional with the average treatment effect.

The proof uses event-conditional means, full mediation, two exchangeability assumptions, and composition consistency to relate the two-variable counterfactual outcome through the mediator to the single-treatment potential outcome.

structure POFrontdoorSystem reviewed
Causalean.PO

A frontdoor system packages, within an ambient potential-outcome system, a binary treatment A, a finite discrete mediator M valued in a finite type, and a real-valued outcome Y, where the treatment, mediator, and outcome are pairwise distinct variables.

Definition (Lean source)
A :
P.V
M :
P.V
Y :
P.V
hAbool :
P.X A ≃ᵐ Bool
hMequiv :
P.X M ≃ᵐ β
hYreal :
P.X Y ≃ᵐ ℝ
hAM :
A ≠ M
hAY :
A ≠ Y
hMY :
M ≠ Y
Causalean.PO.POFrontdoorSystem · Causalean/PO/ID/Exact/Frontdoor.lean:56 · uses POSystem
def aVar reviewed
Causalean.PO.POFrontdoorSystem

The treatment variable used by frontdoor adjustment represents the system's treatment as the treated and control arms.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
aVar S :
⟨S.A, S.hAbool⟩
def mVar reviewed
Causalean.PO.POFrontdoorSystem

The mediator variable used by frontdoor adjustment represents the system's mediator on its finite support, enabling the adjustment sum over mediator levels.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
mVar S :
POVar P β
⟨S.M, S.hMequiv⟩
def yVar reviewed
Causalean.PO.POFrontdoorSystem

The outcome variable used by frontdoor adjustment represents the system's outcome on the real line.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
yVar S :
POVar P ℝ
⟨S.Y, S.hYreal⟩
def YofA reviewed
Causalean.PO.POFrontdoorSystem

The treatment-specific potential outcome in a frontdoor system records each unit's outcome if treatment were set to the selected arm, with that arm defining the total-effect contrast.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
YofA S a :
P.Ω → ℝ
S.yVar.cfUnder S.aVar a
Causalean.PO.POFrontdoorSystem.YofA · Causalean/PO/ID/Exact/Frontdoor.lean:94 · uses POFrontdoorSystem , POSystem
def MofA reviewed
Causalean.PO.POFrontdoorSystem

The treatment-specific potential mediator in a frontdoor system records the mediator value induced by setting treatment to the selected arm, with that arm indexing the first frontdoor link.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
MofA S a :
P.Ω → β
S.mVar.cfUnder S.aVar a
Causalean.PO.POFrontdoorSystem.MofA · Causalean/PO/ID/Exact/Frontdoor.lean:99 · uses POFrontdoorSystem , POSystem
def regimeAM reviewed
Causalean.PO.POFrontdoorSystem

The joint treatment–mediator intervention in a frontdoor system sets treatment and mediator simultaneously, at the selected arm and mediator level.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
m :
β
regimeAM S a m :
Regime P.V P.X
(Regime.single S.A (S.hAbool.symm a)).sqcup (Regime.single S.M (S.hMequiv.symm m)) (Regime.single_disjoint_single S.hAM _ _)
def YofAM reviewed
Causalean.PO.POFrontdoorSystem

The joint treatment–mediator potential outcome in a frontdoor system records the response under simultaneous intervention at the selected treatment arm and mediator level; full mediation compares these outcomes across arms.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
m :
β
YofAM S a m :
P.Ω → ℝ
S.yVar.cf (S.regimeAM a m)
Causalean.PO.POFrontdoorSystem.YofAM · Causalean/PO/ID/Exact/Frontdoor.lean:115 · uses POFrontdoorSystem , POSystem
def factualA reviewed
Causalean.PO.POFrontdoorSystem

The factual treatment in a frontdoor system records each unit's observed treatment arm.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
factualA S :
P.Ω → Bool
S.aVar.factual
Causalean.PO.POFrontdoorSystem.factualA · Causalean/PO/ID/Exact/Frontdoor.lean:124 · uses POFrontdoorSystem , POSystem
def factualM reviewed
Causalean.PO.POFrontdoorSystem

The factual mediator in a frontdoor system records each unit's observed mediator level.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
factualM S :
P.Ω → β
S.mVar.factual
Causalean.PO.POFrontdoorSystem.factualM · Causalean/PO/ID/Exact/Frontdoor.lean:127 · uses POFrontdoorSystem , POSystem
def factualY reviewed
Causalean.PO.POFrontdoorSystem

The factual outcome in a frontdoor system records each unit's observed real-valued response.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
factualY S :
P.Ω → ℝ
S.yVar.factual
Causalean.PO.POFrontdoorSystem.factualY · Causalean/PO/ID/Exact/Frontdoor.lean:130 · uses POFrontdoorSystem , POSystem
def aEvent reviewed
Causalean.PO.POFrontdoorSystem

The observed treatment group in a frontdoor system collects units whose realized treatment matches the selected arm, with that arm indexing probabilities and conditional means.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
aEvent S a :
Set P.Ω
S.aVar.event a
Causalean.PO.POFrontdoorSystem.aEvent · Causalean/PO/ID/Exact/Frontdoor.lean:167 · uses POFrontdoorSystem , POSystem
def mEvent reviewed
Causalean.PO.POFrontdoorSystem

The observed mediator cell in a frontdoor system collects units whose realized mediator matches the selected level, with that level indexing the finite frontdoor sum.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
m :
β
mEvent S m :
Set P.Ω
S.mVar.event m
Causalean.PO.POFrontdoorSystem.mEvent · Causalean/PO/ID/Exact/Frontdoor.lean:171 · uses POFrontdoorSystem , POSystem
def mUnderA reviewed
Causalean.PO.POFrontdoorSystem

The regimed mediator in a frontdoor system pairs the mediator with an intervention fixing treatment to the selected arm, so mediator exchangeability can be stated across treatment worlds.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
mUnderA S a :
⟨S.mVar, Regime.single S.A (S.hAbool.symm a)⟩
def mBundle reviewed
Causalean.PO.POFrontdoorSystem

The counterfactual mediator bundle for a frontdoor system collects mediator responses under both treatment arms, allowing one joint treatment–mediator exchangeability assumption.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
mBundle S :
POCFBundle.cons (S.mUnderA true) <| POCFBundle.cons (S.mUnderA false) <| POCFBundle.nil P
def pA reviewed
Causalean.PO.POFrontdoorSystem

The observed treatment-arm probability in a frontdoor system measures the population share receiving the selected arm, with that arm weighting mediator-specific outcome means.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
pA S a :
ℝ
(P.μ (S.aEvent a)).toReal
def pMgivenA reviewed
Causalean.PO.POFrontdoorSystem

The mediator distribution within a treatment arm in a frontdoor system is the conditional probability of the selected mediator cell, for the mediator level and observed treatment arm used in adjustment.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
m :
β
a :
pMgivenA S m a :
ℝ
normalizedRestrictedIntegral P.μ (S.aEvent a) (S.mVar.indicator m)
Causalean.PO.POFrontdoorSystem.pMgivenA · Causalean/PO/ID/Exact/Frontdoor.lean:211 · uses POFrontdoorSystem , POSystem
def EYgivenAM reviewed
Causalean.PO.POFrontdoorSystem

The observed treatment–mediator cell mean in a frontdoor system averages outcomes among units in the selected joint cell, indexed by treatment arm and mediator level.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
m :
β
EYgivenAM S a m :
ℝ
normalizedRestrictedIntegral P.μ (S.aEvent a ∩ S.mEvent m) S.factualY
Causalean.PO.POFrontdoorSystem.EYgivenAM · Causalean/PO/ID/Exact/Frontdoor.lean:217 · uses POFrontdoorSystem , POSystem
def frontdoorTerm reviewed
Causalean.PO.POFrontdoorSystem

The frontdoor-adjusted mean under a treatment arm in a frontdoor system averages treatment-weighted outcome regressions over the arm-specific mediator distribution, with the arm entering through that distribution.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
a :
frontdoorTerm S a :
ℝ
∑ m : β, (S.EYgivenAM true m * S.pA true + S.EYgivenAM false m * S.pA false) * S.pMgivenA m a
Causalean.PO.POFrontdoorSystem.frontdoorTerm · Causalean/PO/ID/Exact/Frontdoor.lean:223 · uses POFrontdoorSystem , POSystem
def ATE reviewed
Causalean.PO.POFrontdoorSystem

The average treatment effect in a frontdoor system averages each unit's treated-minus-control potential-outcome contrast.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
ATE S :
ℝ
∫ ω, S.YofA true ω - S.YofA false ω ∂P.μ
def frontdoorATE reviewed
Causalean.PO.POFrontdoorSystem

The observable frontdoor-adjusted ATE in a frontdoor system contrasts the adjusted mean under treatment with the adjusted mean under control.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
S :
shared
frontdoorATE S :
ℝ
S.frontdoorTerm true - S.frontdoorTerm false
Causalean.PO.POFrontdoorSystem.frontdoorATE · Causalean/PO/ID/Exact/Frontdoor.lean:237 · uses POFrontdoorSystem , POSystem
structure Assumptions reviewed
Causalean.PO.POFrontdoorSystem

Frontdoor identifying assumptions. Bundles, for a frontdoor system, factual consistency of the underlying potential-outcome system, composition consistency for the nested treatment–mediator regimes, the full-mediation exclusion restriction that the two-treatment-and-mediator outcome does not depend on the treatment arm, treatment–mediator exchangeability, mediator–outcome exchangeability within treatment arms, positivity of each treatment arm, positivity of the mediator within the support of its counterfactual under a treatment arm, cross-world independence of the counterfactual mediator from the full-mediation outcome, and integrability of the treatment-arm and joint treatment–mediator potential outcomes.

Definition (Lean source)
P :
shared
β :
Type u_1
shared
consistency :
P.Consistency

Factual consistency assumption for the ambient PO system.

compositionConsistency :
P.CompositionConsistency

Composition consistency assumption for nested treatment–mediator regimes.

fullMediation :
∀ (a a' : Bool) (m : β), S.YofAM a m =ᵐ[P.μ] S.YofAM a' m

Full mediation / exclusion restriction: Y(a,m) = Y(a',m) a.s. for all a, a' ∈ {0,1} and m ∈ β.

exch_AM :
P.IndepCF (RegimedVar.ofFactual S.aVar) S.mBundle P.μ

Treatment–mediator exchangeability: A ⊥ (M(1), M(0)). Equivalent (for binary A) to M(a) ⊥ A for each a.

exch_MY :
∀ (a : Bool) (m : β)
if
0 < P.μ ({ω | S.MofA a ω = m})
then
∀ a' : Bool,
normalizedRestrictedIntegral P.μ (S.aEvent a' ∩ S.mEvent m) (S.YofAM true m)
= normalizedRestrictedIntegral P.μ (S.aEvent a') (S.YofAM true m)

Mediator–outcome exchangeability within treatment arms: for mediator values in the support of M(a), and each treatment arm a', the conditional law of Y(m) (= any Y(a,m) by full mediation) on {A = a'} ∩ {M = m} equals its conditional law on {A = a'}. Stated at the normalizedRestrictedIntegral level (discrete form, matching Manski/LATE style), and gated by positive M(a) mass so zero-probability mediator cells need no exchangeability assumption.

posA :
∀ a : Bool, 0 < P.μ (S.aEvent a)

Positivity (treatment): P(A = a) > 0.

posAM :
∀ (a : Bool) (m : β)
if
0 < P.μ ({ω | S.MofA a ω = m})
then
∀ a' : Bool, 0 < P.μ (S.aEvent a' ∩ S.mEvent m)

Positivity (mediator within support of M(a)): if P(M(a) = m) > 0, then for every treatment arm a' we have P(A=a', M=m) > 0. Stated on the ENNReal-valued measure for convenience.

indep_Y_M :
∀ (a : Bool) (m : β), IndepFun (S.MofA a) (S.YofAM true m) P.μ

Joint mediator–outcome independence across worlds: M(a) ⊥ Y(1, m) as IndepFun. This is required for the drop-of-conditioning step

E[Y(m) · 1_{M(a)=m}] = E[Y(m)] · P(M(a) = m)

used in the frontdoor proof sketch. It is not derivable from the other four assumptions in the bare PO framework: under a graphical frontdoor DAG it would follow from d-separation (no directed path from the counterfactual mediator M(a) to the full-mediation outcome Y(1, m)), but in the bare PO setting it must be stated explicitly.

Cross-world independence M(a) ⟂ Y(1, m). In Pearl's graphical frontdoor this follows from d-separation; here we state it directly as a primitive PO assumption. A future graphical-derivation file under SCM/ID/ could derive this from the three Pearl frontdoor graph conditions via the SWIG/d-separation infrastructure in Causalean/Graph/.

integrable_YofA :
∀ a : Bool, Integrable (S.YofA a) P.μ

Integrability of each Y(a).

integrable_YofAM :
∀ (a : Bool) (m : β), Integrable (S.YofAM a m) P.μ

Integrability of each Y(a,m).

Causalean.PO.POFrontdoorSystem.Assumptions · Causalean/PO/ID/Exact/Frontdoor.lean:243 · uses POFrontdoorSystem , POSystem
theorem EofY_eq_frontdoorTerm reviewed
Causalean.PO.POFrontdoorSystem

Frontdoor identification (individual regime). In a frontdoor system, the mean potential outcome under the selected arm equals its frontdoor functional for the treatment arm, under the frontdoor identifying assumption bundle. The functional combines the arm-specific mediator distribution with the outcome regression on mediator and treatment.

Formal statement
P :
shared
β :
Type u_1
shared
S :
shared
hA :
S.Assumptions
a :
∫ ω, S.YofA a ω ∂P.μ = S.frontdoorTerm a
Proof (Lean source)
theorem EofY_eq_frontdoorTerm (hA : S.Assumptions) (a : Bool) : ∫ ω, S.YofA a ω ∂P.μ = S.frontdoorTerm a := by -- Shorthands. set mSet : β → Set P.Ω := fun m => {ω | S.MofA a ω = m} with hmSet_def have hmSet_meas : ∀ m, MeasurableSet (mSet m) := fun m => S.measurable_MofA a (MeasurableSet.singleton m) have hpA_ne_top : P.μ (S.aEvent a) ≠ ⊤ := measure_ne_top _ _ have hpA_ne_zero : P.μ (S.aEvent a) ≠ 0 := (hA.posA a).ne' have hpA_toReal_pos : 0 < (P.μ (S.aEvent a)).toReal := by rw [ENNReal.toReal_pos_iff]; exact ⟨hA.posA a, lt_top_iff_ne_top.mpr hpA_ne_top⟩ have hpA_toReal_ne_zero : (P.μ (S.aEvent a)).toReal ≠ 0 := hpA_toReal_pos.ne' -- ─────────────────────────────────────────────────────────────────────────── -- (A) Mediator-marginal identity: μ(mSet m).toReal = pMgivenA m a. -- ─────────────────────────────────────────────────────────────────────────── -- (A.1) Independence: factualA ⊥ MofA a (from exch_AM component projection). have hInd_AMa : IndepFun S.factualA (S.MofA a) P.μ := by cases a with | true => exact hA.exch_AM.component (0 : Fin 2) | false => exact hA.exch_AM.component (1 : Fin 2) -- (A.2) Independence on preimage sets: μ(aEvent a ∩ mSet m) = μ(aEvent a) * μ(mSet m). have hIndepMeas : ∀ m, P.μ (S.aEvent a ∩ mSet m) = P.μ (S.aEvent a) * P.μ (mSet m) := by intro m have h := hInd_AMa.measure_inter_preimage_eq_mul (s := {a}) (t := {m}) (measurableSet_singleton _) (measurableSet_singleton _) -- `aEvent a = factualA ⁻¹' {a}` and `mSet m = MofA a ⁻¹' {m}` both by rfl. exact h -- (A.3) Consistency set identity: aEvent a ∩ mSet m = aEvent a ∩ mEvent m. have hConsist_set : ∀ m, S.aEvent a ∩ mSet m = S.aEvent a ∩ S.mEvent m := by intro m ext ω refine ⟨?_, ?_⟩ · rintro ⟨hA_ω, hMofA_ω⟩ refine ⟨hA_ω, ?_⟩ have h_eq := MofA_eq_factualM_on_aEvent hA.consistency a hA_ω change S.factualM ω = m rw [← h_eq]; exact hMofA_ω · rintro ⟨hA_ω, hM_ω⟩ refine ⟨hA_ω, ?_⟩ have h_eq := MofA_eq_factualM_on_aEvent hA.consistency a hA_ω change S.MofA a ω = m rw [h_eq]; exact hM_ω -- (A.4) indM m equals set indicator of mEvent m. have hIndM : ∀ m, S.mVar.indicator m = (S.mEvent m).indicator (fun _ => (1:ℝ)) := fun m => S.mVar.indicator_eq_event_indicator m -- (A.5) Evaluate pMgivenA m a in closed form. have hpM_val : ∀ m, S.pMgivenA m a = (P.μ (S.aEvent a ∩ S.mEvent m)).toReal / (P.μ (S.aEvent a)).toReal := by intro m unfold pMgivenA rw [eventCondExp_eq] rw [hIndM] rw [MeasureTheory.setIntegral_indicator (S.measurableSet_mEvent m)] rw [MeasureTheory.setIntegral_one_eq_measureReal] rfl -- (A.6) Mediator-marginal identity. have hMarginal : ∀ m, (P.μ (mSet m)).toReal = S.pMgivenA m a := by intro m rw [hpM_val m] have h₁ : (P.μ (S.aEvent a ∩ mSet m)).toReal = (P.μ (S.aEvent a)).toReal * (P.μ (mSet m)).toReal := by rw [hIndepMeas m] exact ENNReal.toReal_mul have h₂ : (P.μ (S.aEvent a ∩ S.mEvent m)).toReal = (P.μ (S.aEvent a)).toReal * (P.μ (mSet m)).toReal := by rw [← hConsist_set m]; exact h₁ rw [h₂] field_simp -- ─────────────────────────────────────────────────────────────────────────── -- (D) Inner integral: ∫ YofAM true m = ∑ a', EYgivenAM a' m · pA a'. -- ─────────────────────────────────────────────────────────────────────────── have hInner : ∀ m : β, 0 < P.μ (mSet m) → ∫ ω, S.YofAM true m ω ∂P.μ = ∑ a' : Bool, S.EYgivenAM a' m * S.pA a' := by intro m hm_pos -- Tower over Bool partition by A. rw [integral_eq_sum_eventCondExp_aEvent (S := S) _ (hA.integrable_YofAM true m)] refine Finset.sum_congr rfl (fun a' _ => ?_) -- Use exch_MY to pass to aEvent a' ∩ mEvent m. rw [← hA.exch_MY a m hm_pos a'] -- Inside the event aEvent a' ∩ mEvent m, YofAM true m = factualY a.e. -- First, full mediation: YofAM true m =ᵐ[μ] YofAM a' m. -- Then, consistency on aEvent a' ∩ mEvent m: YofAM a' m = factualY. have hYeq : ∀ ω ∈ S.aEvent a' ∩ S.mEvent m, S.YofAM a' m ω = S.factualY ω := fun ω hω => YofAM_eq_factualY_on_aMEvent hA.consistency a' m hω -- normalizedRestrictedIntegral (aEvent a' ∩ mEvent m) (YofAM true m) -- = normalizedRestrictedIntegral (aEvent a' ∩ mEvent m) (YofAM a' m) [full mediation a.e.] -- = normalizedRestrictedIntegral (aEvent a' ∩ mEvent m) factualY [consistency on event] have hcongr_ae : normalizedRestrictedIntegral P.μ (S.aEvent a' ∩ S.mEvent m) (S.YofAM true m) = normalizedRestrictedIntegral P.μ (S.aEvent a' ∩ S.mEvent m) (S.YofAM a' m) := by exact eventCondExp_congr_ae P.μ _ (Filter.EventuallyEq.filter_mono (hA.fullMediation true a' m) MeasureTheory.ae_restrict_le) have hcongr_event : normalizedRestrictedIntegral P.μ (S.aEvent a' ∩ S.mEvent m) (S.YofAM a' m) = normalizedRestrictedIntegral P.μ (S.aEvent a' ∩ S.mEvent m) S.factualY := by exact eventCondExp_congr_on P.μ ((S.measurableSet_aEvent a').inter (S.measurableSet_mEvent m)) hYeq rw [hcongr_ae, hcongr_event] -- The goal now identifies the weighted cell mean with the normalized -- restricted integral times the treatment-cell mass. unfold EYgivenAM pA ring -- ─────────────────────────────────────────────────────────────────────────── -- (B,C) ∫ YofA a = ∑ m, (∫ YofAM true m) · μ(mSet m).toReal. -- Uses composition + full mediation on the slice {MofA a = m}, and drop of -- conditioning from exch_AM. -- ─────────────────────────────────────────────────────────────────────────── have hOuter : ∀ m : β, ∫ ω in mSet m, S.YofA a ω ∂P.μ = (P.μ (mSet m)).toReal * ∫ ω, S.YofAM true m ω ∂P.μ := by intro m -- Step (B): on mSet m, YofA a = YofAM a m (composition), and -- YofAM a m =ᵐ YofAM true m (full mediation), so on mSet m, -- YofA a = YofAM true m a.e. (viewing full mediation as an a.e. equality -- of the full functions, which restricts to mSet m). have hB : ∫ ω in mSet m, S.YofA a ω ∂P.μ = ∫ ω in mSet m, S.YofAM true m ω ∂P.μ := by -- Use a.e. equality on mSet m: YofA a =ᵐ[μ.restrict (mSet m)] YofAM true m. refine MeasureTheory.integral_congr_ae ?_ -- On mSet m (a pointwise event): YofA a = YofAM a m. -- Off mSet m we need nothing, but we produce a restrict-a.e. statement via -- indicator/filter reasoning. Simplest: combine pointwise composition -- identity (on mSet m) with a.e. full mediation, restricted. have h_comp_on : ∀ ω ∈ mSet m, S.YofA a ω = S.YofAM a m ω := by intro ω hω exact (YofAM_eq_YofA_on_MofA_event hA.compositionConsistency a m hω).symm -- YofAM a m =ᵐ[μ] YofAM true m. have h_fm := (hA.fullMediation a true m).symm -- YofAM true m =ᵐ YofAM a m -- Combine: for almost every ω in mSet m, YofA a ω = YofAM true m ω. have h_fm_restrict : S.YofAM a m =ᵐ[P.μ.restrict (mSet m)] S.YofAM true m := by exact (hA.fullMediation a true m).filter_mono MeasureTheory.ae_restrict_le -- YofA a =ᵐ[restrict] YofAM a m (pointwise on mSet m ⇒ a.e. on restrict). have h_comp_ae : S.YofA a =ᵐ[P.μ.restrict (mSet m)] S.YofAM a m := by rw [EventuallyEq, MeasureTheory.ae_restrict_iff' (hmSet_meas m)] filter_upwards with ω hω using h_comp_on ω hω exact h_comp_ae.trans h_fm_restrict rw [hB] -- Step (C): drop-of-conditioning for YofAM true m using indep_Y_M. -- mSet m = (MofA a) ⁻¹' {m}, so IndepFun gives the preimage integral identity. have hdrop : ∫ ω in (S.MofA a) ⁻¹' {m}, id (S.YofAM true m ω) ∂P.μ = (P.μ ((S.MofA a) ⁻¹' {m})).toReal * ∫ ω, id (S.YofAM true m ω) ∂P.μ := (hA.indep_Y_M a m).integral_restrict_preimage_eq_mul (S.measurable_MofA a).aemeasurable (S.measurable_YofAM true m).aemeasurable (measurableSet_singleton m) ((S.measurable_MofA a) (measurableSet_singleton m)) measurable_id.aestronglyMeasurable have hpre : mSet m = (S.MofA a) ⁻¹' {m} := rfl rw [hpre] exact hdrop -- ─────────────────────────────────────────────────────────────────────────── -- Main chain: combine (i) partition, (B,C) drop + marginal, (D) inner. -- ─────────────────────────────────────────────────────────────────────────── rw [integral_eq_sum_integral_MofA (S := S) _ (hA.integrable_YofA a) a] -- Now the goal is ∑ m, ∫ in {MofA a = m}, YofA a = frontdoorTerm a. -- Rewrite the LHS sum using hOuter, hMarginal, hInner. have hStep : ∀ m : β, ∫ ω in mSet m, S.YofA a ω ∂P.μ = S.pMgivenA m a * ∑ a' : Bool, S.EYgivenAM a' m * S.pA a' := by intro m by_cases hm_pos : 0 < P.μ (mSet m) · rw [hOuter m, hInner m hm_pos, hMarginal m] · have hm_zero : P.μ (mSet m) = 0 := le_antisymm (not_lt.mp hm_pos) bot_le rw [hOuter m, ← hMarginal m, hm_zero] simp have hLHS : ∑ m : β, ∫ ω in mSet m, S.YofA a ω ∂P.μ = ∑ m : β, S.pMgivenA m a * ∑ a' : Bool, S.EYgivenAM a' m * S.pA a' := Finset.sum_congr rfl (fun m _ => hStep m) rw [hLHS] -- Remaining: ∑ m, pMgivenA m a * (∑ a', EYgivenAM a' m * pA a') = frontdoorTerm a. unfold frontdoorTerm refine Finset.sum_congr rfl (fun m _ => ?_) -- pMgivenA m a * (EYgivenAM true m * pA true + EYgivenAM false m * pA false) -- = (EYgivenAM true m * pA true + EYgivenAM false m * pA false) * pMgivenA m a. rw [Fintype.sum_bool] ring
theorem ate_frontdoor reviewed
Causalean.PO.POFrontdoorSystem

Frontdoor identification of the ATE. In a frontdoor system, under the frontdoor identifying assumption bundle, the average treatment effect equals the frontdoor estimand frontdoorATE, the difference of the frontdoor functional evaluated at the two treatment arms.

Formal statement
P :
shared
β :
Type u_1
shared
S :
shared
hA :
S.Assumptions
S.ATE = S.frontdoorATE
Proof (Lean source)
theorem ate_frontdoor (hA : S.Assumptions) : S.ATE = S.frontdoorATE := by unfold ATE frontdoorATE rw [integral_sub (hA.integrable_YofA true) (hA.integrable_YofA false)] rw [EofY_eq_frontdoorTerm S hA true, EofY_eq_frontdoorTerm S hA false]
15 supporting declarations (lemmas, instances)
  • measurable_YofA lemma — In a frontdoor system, the potential outcome under a treatment arm is measurable, so its population mean can define the total effect.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    a :
    Measurable (S.YofA a)
    Proof (Lean source)
    @[fun_prop] lemma measurable_YofA (a : Bool) : Measurable (S.YofA a) := S.yVar.measurable_cfUnder S.aVar a
    Causalean.PO.POFrontdoorSystem.measurable_YofA · Causalean/PO/ID/Exact/Frontdoor.lean:136
  • measurable_MofA lemma — In a frontdoor system, the potential mediator under a treatment arm is measurable, so its distribution can weight the adjustment formula.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    a :
    Measurable (S.MofA a)
    Proof (Lean source)
    @[fun_prop] lemma measurable_MofA (a : Bool) : Measurable (S.MofA a) := S.mVar.measurable_cfUnder S.aVar a
    Causalean.PO.POFrontdoorSystem.measurable_MofA · Causalean/PO/ID/Exact/Frontdoor.lean:141
  • measurable_YofAM lemma — In a frontdoor system, the potential outcome under a treatment arm and mediator level is measurable, so joint-intervention means are well-defined.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    a :
    m :
    β
    Measurable (S.YofAM a m)
    Proof (Lean source)
    @[fun_prop] lemma measurable_YofAM (a : Bool) (m : β) : Measurable (S.YofAM a m) := S.yVar.measurable_cf _
    Causalean.PO.POFrontdoorSystem.measurable_YofAM · Causalean/PO/ID/Exact/Frontdoor.lean:146
  • measurable_factualA lemma — Observed treatment in a frontdoor system is measurable, so treatment-arm events and probabilities are well-defined.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualA
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualA : Measurable S.factualA := S.aVar.measurable_factual
    Causalean.PO.POFrontdoorSystem.measurable_factualA · Causalean/PO/ID/Exact/Frontdoor.lean:152
  • measurable_factualM lemma — The observed mediator in a frontdoor system is measurable, so mediator cells can be used in the adjustment formula.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualM
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualM : Measurable S.factualM := S.mVar.measurable_factual
    Causalean.PO.POFrontdoorSystem.measurable_factualM · Causalean/PO/ID/Exact/Frontdoor.lean:156
  • measurable_factualY lemma — Observed outcome in a frontdoor system is measurable, so treatment–mediator cell means are valid.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    Measurable S.factualY
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualY : Measurable S.factualY := S.yVar.measurable_factual
    Causalean.PO.POFrontdoorSystem.measurable_factualY · Causalean/PO/ID/Exact/Frontdoor.lean:160
  • measurableSet_aEvent lemma — In a frontdoor system, an observed treatment arm defines a measurable event suitable for probabilities and conditional means.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    a :
    MeasurableSet (S.aEvent a)
    Proof (Lean source)
    lemma measurableSet_aEvent (a : Bool) : MeasurableSet (S.aEvent a) := S.aVar.measurableSet_event _ (measurableSet_singleton _)
    Causalean.PO.POFrontdoorSystem.measurableSet_aEvent · Causalean/PO/ID/Exact/Frontdoor.lean:176
  • measurableSet_mEvent lemma — In a frontdoor system, an observed mediator level defines a measurable event suitable for cell probabilities and conditional means.
    P :
    shared
    β :
    Type u_1
    shared
    S :
    shared
    m :
    β
    MeasurableSet (S.mEvent m)
    Proof (Lean source)
    lemma measurableSet_mEvent (m : β) : MeasurableSet (S.mEvent m) := S.mVar.measurableSet_event _ (measurableSet_singleton _)
    Causalean.PO.POFrontdoorSystem.measurableSet_mEvent · Causalean/PO/ID/Exact/Frontdoor.lean:180
  • MofA_eq_factualM_on_aEvent lemma — On the event {A = a}, M(a)(ω) = factualM ω. Single-target consistency.
    P :
    shared
    β :
    Type u_1
    shared
    hC :
    P.Consistency
    a :
    ω :
    P.Ω
    hω :
    ω ∈ S.aEvent a
    S.MofA a ω = S.factualM ω
    Proof (Lean source)
    lemma MofA_eq_factualM_on_aEvent (hC : P.Consistency) (a : Bool) {ω : P.Ω} (hω : ω ∈ S.aEvent a) : S.MofA a ω = S.factualM ω := POVar.cf_eq_factual_on_event hC S.mVar S.aVar a (Ne.symm S.hAM) hω
    Causalean.PO.POFrontdoorSystem.MofA_eq_factualM_on_aEvent · Causalean/PO/ID/Exact/Frontdoor.lean:315
  • YofAM_eq_factualY_on_aMEvent lemma — On the event {A = a} ∩ {M = m}, Y(a,m)(ω) = factualY ω. Multi-target consistency via cf_eq_factual_of_factualAgrees.
    P :
    shared
    β :
    Type u_1
    shared
    hC :
    P.Consistency
    a :
    m :
    β
    ω :
    P.Ω
    hω :
    ω ∈ S.aEvent a ∩ S.mEvent m
    S.YofAM a m ω = S.factualY ω
    Proof (Lean source)
    lemma YofAM_eq_factualY_on_aMEvent (hC : P.Consistency) (a : Bool) (m : β) {ω : P.Ω} (hω : ω ∈ S.aEvent a ∩ S.mEvent m) : S.YofAM a m ω = S.factualY ω := by -- The target set of `regimeAM a m` is `{A, M}`; `Y ∉ {A, M}` since `hAY, hMY`. have h_notmem : S.yVar.v ∉ (S.regimeAM a m).target := by simp only [regimeAM, Regime.sqcup_target, Regime.single_target, Finset.singleton_union, yVar, Finset.mem_insert, Finset.mem_singleton, not_or] exact ⟨S.hAY.symm, S.hMY.symm⟩ -- On `{A=a} ∩ {M=m}`, `ω` factually agrees with `regimeAM a m`, by combining -- the per-variable factual equalities `aVar.factual ω = a`, `mVar.factual ω = m`. have hAgrees : P.FactualAgrees (S.regimeAM a m) ω := POSystem.factualAgrees_sqcup _ (S.aVar.factualAgrees_single a hω.1) (S.mVar.factualAgrees_single m hω.2) exact POVar.cf_eq_factual_of_factualAgrees hC S.yVar (S.regimeAM a m) h_notmem ω hAgrees
    Causalean.PO.POFrontdoorSystem.YofAM_eq_factualY_on_aMEvent · Causalean/PO/ID/Exact/Frontdoor.lean:321
  • integrable_factualY_of_consistency_integrable_YofAM lemma — In a frontdoor system, consistency and integrability of every joint treatment–mediator potential outcome imply that the observed outcome has a finite population mean; the observed treatment–mediator cell selects one of the integrable counterfactuals.
    P :
    shared
    β :
    Type u_1
    shared
    hC :
    P.Consistency
    hY :
    ∀ (a : Bool) (m : β), Integrable (S.YofAM a m) P.μ
    Integrable S.factualY P.μ
    Proof (Lean source)
    lemma integrable_factualY_of_consistency_integrable_YofAM (hC : P.Consistency) (hY : ∀ (a : Bool) (m : β), Integrable (S.YofAM a m) P.μ) : Integrable S.factualY P.μ := by let cell : Bool → β → P.Ω → ℝ := fun a m ω => S.YofAM a m ω * S.aVar.indicator a ω * S.mVar.indicator m ω have hcell_int : ∀ a m, Integrable (cell a m) P.μ := by intro a m have hA_int : Integrable (fun ω => S.YofAM a m ω * S.aVar.indicator a ω) P.μ := S.aVar.integrable_mul_indicator a (measurableSet_singleton a) (hY a m) simpa [cell, mul_assoc] using S.mVar.integrable_mul_indicator m (measurableSet_singleton m) hA_int have hsum_int : Integrable (fun ω => ∑ a : Bool, ∑ m : β, cell a m ω) P.μ := by have hsum_beta : ∀ a, Integrable (fun ω => ∑ m : β, cell a m ω) P.μ := by intro a have hsum_finset : ∀ s : Finset β, Integrable (fun ω => s.sum fun m => cell a m ω) P.μ := by intro s refine Finset.induction_on s ?base ?step · simp · intro m s hms hs simp only [Finset.sum_insert hms] exact (hcell_int a m).add hs simpa using hsum_finset Finset.univ have htrue : Integrable (fun ω => ∑ m : β, cell true m ω) P.μ := hsum_beta true have hfalse : Integrable (fun ω => ∑ m : β, cell false m ω) P.μ := hsum_beta false simp only [Fintype.sum_bool] exact htrue.add hfalse refine hsum_int.congr (Filter.Eventually.of_forall ?_) intro ω have hA_indicator : ∀ a, S.aVar.indicator a ω = if S.factualA ω = a then 1 else 0 := by intro a by_cases hωa : S.factualA ω = a · simp [S.aVar.indicator_apply_eq_one hωa, hωa] · simp [S.aVar.indicator_apply_eq_zero hωa, hωa] have hM_indicator : ∀ m, S.mVar.indicator m ω = if S.factualM ω = m then 1 else 0 := by intro m by_cases hωm : S.factualM ω = m · simp [S.mVar.indicator_apply_eq_one hωm, hωm] · simp [S.mVar.indicator_apply_eq_zero hωm, hωm] change (∑ a : Bool, ∑ m : β, cell a m ω) = S.factualY ω rw [Fintype.sum_bool] cases hAω : S.factualA ω · simp only [hA_indicator, hAω, Bool.false_eq_true, ↓reduceIte, mul_zero, hM_indicator, mul_ite, mul_one, ite_self, Finset.sum_const_zero, Finset.sum_ite_eq, Finset.mem_univ, zero_add, cell] exact YofAM_eq_factualY_on_aMEvent hC false (S.factualM ω) (show ω ∈ S.aEvent false ∩ S.mEvent (S.factualM ω) from ⟨hAω, rfl⟩) · simp only [hA_indicator, hAω, ↓reduceIte, mul_one, hM_indicator, mul_ite, mul_zero, Finset.sum_ite_eq, Finset.mem_univ, Bool.true_eq_false, ite_self, Finset.sum_const_zero, add_zero, cell] exact YofAM_eq_factualY_on_aMEvent hC true (S.factualM ω) (show ω ∈ S.aEvent true ∩ S.mEvent (S.factualM ω) from ⟨hAω, rfl⟩)
    Causalean.PO.POFrontdoorSystem.integrable_factualY_of_consistency_integrable_YofAM · Causalean/PO/ID/Exact/Frontdoor.lean:340
  • integrable_factualY lemma — Compatibility projection for older call sites: factual outcome integrability is derived from consistency plus integrability of the finite Y(a,m) cells.
    P :
    shared
    β :
    Type u_1
    shared
    hA :
    S.Assumptions
    Integrable S.factualY P.μ
    Proof (Lean source)
    @[fun_prop] lemma integrable_factualY (hA : S.Assumptions) : Integrable S.factualY P.μ := S.integrable_factualY_of_consistency_integrable_YofAM hA.consistency hA.integrable_YofAM
    Causalean.PO.POFrontdoorSystem.Assumptions.integrable_factualY · Causalean/PO/ID/Exact/Frontdoor.lean:402
  • YofAM_eq_YofA_on_MofA_event lemma — Composition lemma (def:po-consistency, composition clause): on the event {M(a) = m}, Y(a, m)(ω) = Y(a)(ω).
    P :
    shared
    β :
    Type u_1
    shared
    hC :
    P.CompositionConsistency
    a :
    m :
    β
    ω :
    P.Ω
    hω :
    S.MofA a ω = m
    S.YofAM a m ω = S.YofA a ω
    Proof (Lean source)
    lemma YofAM_eq_YofA_on_MofA_event (hC : P.CompositionConsistency) (a : Bool) (m : β) {ω : P.Ω} (hω : S.MofA a ω = m) : S.YofAM a m ω = S.YofA a ω := by -- Disjointness of the two single-target regimes. have hdisj : (Regime.single S.A (S.hAbool.symm a)).Disjoint (Regime.single S.M (S.hMequiv.symm m)) := Regime.single_disjoint_single S.hAM _ _ -- `Y ∉ {A} ∪ {M}`. have hY_notmem : _root_.Disjoint ({S.Y} : Finset P.V) ((Regime.single S.A (S.hAbool.symm a)).target ∪ (Regime.single S.M (S.hMequiv.symm m)).target) := by simp only [Regime.single_target, Finset.singleton_union, Finset.disjoint_singleton_left, Finset.mem_insert, Finset.mem_singleton, not_or] exact ⟨fun h => S.hAY h.symm, fun h => S.hMY h.symm⟩ -- `IntermediateAgrees`: under `{A ← a}`, `M` evaluates to `hMequiv.symm m`. have hInter : P.IntermediateAgrees (Regime.single S.A (S.hAbool.symm a)) (Regime.single S.M (S.hMequiv.symm m)) ω := by intro v hv have hvM : v = S.M := Finset.mem_singleton.mp hv subst hvM -- `MofA a ω = m` ⇒ `hMequiv (P.eval r₁ ω M) = m` ⇒ `P.eval r₁ ω M = hMequiv.symm m`. have hM : S.hMequiv (P.eval (Regime.single S.A (S.hAbool.symm a)) ω S.M) = m := hω change P.eval (Regime.single S.A (S.hAbool.symm a)) ω S.M = S.hMequiv.symm m exact S.hMequiv.eq_symm_apply.mpr hM -- Apply `hC.composition`. have hComp := hC.composition (Regime.single S.A (S.hAbool.symm a)) (Regime.single S.M (S.hMequiv.symm m)) hdisj {S.Y} hY_notmem ω hInter -- Extract the `Y`-coordinate. have hYcoord : P.eval (Regime.single S.A (S.hAbool.symm a) |>.sqcup (Regime.single S.M (S.hMequiv.symm m)) hdisj) ω S.Y = P.eval (Regime.single S.A (S.hAbool.symm a)) ω S.Y := by simpa [POSystem.poVariable] using congrFun hComp ⟨S.Y, mem_singleton_self S.Y⟩ -- Push through `yVar.equiv`. change S.yVar.equiv (P.eval _ ω S.Y) = S.yVar.equiv (P.eval _ ω S.Y) exact congrArg S.yVar.equiv hYcoord
    Causalean.PO.POFrontdoorSystem.YofAM_eq_YofA_on_MofA_event · Causalean/PO/ID/Exact/Frontdoor.lean:412
  • integral_eq_sum_integral_MofA lemma — Partition of ∫ f along fibers of MofA a (finite codomain β).
    P :
    shared
    β :
    Type u_1
    shared
    f :
    P.Ω → ℝ
    hf :
    Integrable f P.μ
    a :
    ∫ ω, f ω ∂P.μ = ∑ m : β, ∫ ω in {ω' | S.MofA a ω' = m}, f ω ∂P.μ
    Proof (Lean source)
    lemma integral_eq_sum_integral_MofA (f : P.Ω → ℝ) (hf : Integrable f P.μ) (a : Bool) : ∫ ω, f ω ∂P.μ = ∑ m : β, ∫ ω in {ω' | S.MofA a ω' = m}, f ω ∂P.μ := by -- Sets `{ω | MofA a ω = m}` for `m : β` are the fibers of `MofA a`. set s : β → Set P.Ω := fun m => {ω | S.MofA a ω = m} with hs have hmeas : ∀ m, MeasurableSet (s m) := fun m => S.measurable_MofA a (MeasurableSet.singleton m) have hdisj : Pairwise (onFun Disjoint s) := by intro m₁ m₂ hne refine Set.disjoint_left.mpr ?_ intro ω hω₁ hω₂ apply hne simp only [Set.mem_setOf_eq, s] at hω₁ hω₂ exact hω₁ ▸ hω₂ have hcov : ⋃ m, s m = univ := by refine Set.eq_univ_of_forall (fun ω => ?_) exact Set.mem_iUnion.mpr ⟨S.MofA a ω, rfl⟩ have hintOn : ∀ m, IntegrableOn f (s m) P.μ := fun m => hf.integrableOn have hsplit : ∫ ω in ⋃ m, s m, f ω ∂P.μ = ∑ m : β, ∫ ω in s m, f ω ∂P.μ := MeasureTheory.integral_iUnion_fintype hmeas hdisj hintOn rw [← setIntegral_univ, ← hcov, hsplit]
    Causalean.PO.POFrontdoorSystem.integral_eq_sum_integral_MofA · Causalean/PO/ID/Exact/Frontdoor.lean:465
  • integral_eq_sum_eventCondExp_aEvent lemma — Bool-partition tower identity for normalizedRestrictedIntegral.
    P :
    shared
    β :
    Type u_1
    shared
    g :
    P.Ω → ℝ
    hg :
    Integrable g P.μ
    ∫ ω, g ω ∂P.μ
    = ∑ a' : Bool, normalizedRestrictedIntegral P.μ (S.aEvent a') g * (P.μ (S.aEvent a')).toReal
    Proof (Lean source)
    lemma integral_eq_sum_eventCondExp_aEvent (g : P.Ω → ℝ) (hg : Integrable g P.μ) : ∫ ω, g ω ∂P.μ = ∑ a' : Bool, normalizedRestrictedIntegral P.μ (S.aEvent a') g * (P.μ (S.aEvent a')).toReal := by -- Rewrite each RHS term as a set integral. have hterm : ∀ a' : Bool, normalizedRestrictedIntegral P.μ (S.aEvent a') g * (P.μ (S.aEvent a')).toReal = ∫ ω in S.aEvent a', g ω ∂P.μ := by intro a' exact eventCondExp_mul_measure_toReal P.μ (S.aEvent a') (measure_ne_top _ _) g -- Swap the sum to set-integrals. have hsum : ∑ a' : Bool, normalizedRestrictedIntegral P.μ (S.aEvent a') g * (P.μ (S.aEvent a')).toReal = ∑ a' : Bool, ∫ ω in S.aEvent a', g ω ∂P.μ := by exact Finset.sum_congr rfl (fun a' _ => hterm a') rw [hsum] -- Now prove `∫ g = ∑ a', ∫ in aEvent a', g`. have hmeas : ∀ a' : Bool, MeasurableSet (S.aEvent a') := S.measurableSet_aEvent have hdisj : Pairwise (onFun Disjoint (fun a' : Bool => S.aEvent a')) := by intro a₁ a₂ hne refine Set.disjoint_left.mpr ?_ intro ω hω₁ hω₂ apply hne show a₁ = a₂ have h1 : S.factualA ω = a₁ := hω₁ have h2 : S.factualA ω = a₂ := hω₂ exact h1.symm.trans h2 have hcov : ⋃ a' : Bool, S.aEvent a' = univ := by refine Set.eq_univ_of_forall (fun ω => ?_) exact Set.mem_iUnion.mpr ⟨S.factualA ω, rfl⟩ have hintOn : ∀ a' : Bool, IntegrableOn g (S.aEvent a') P.μ := fun _ => hg.integrableOn have hsplit : ∫ ω in ⋃ a' : Bool, S.aEvent a', g ω ∂P.μ = ∑ a' : Bool, ∫ ω in S.aEvent a', g ω ∂P.μ := MeasureTheory.integral_iUnion_fintype hmeas hdisj hintOn rw [← setIntegral_univ, ← hcov, hsplit]
    Causalean.PO.POFrontdoorSystem.integral_eq_sum_eventCondExp_aEvent · Causalean/PO/ID/Exact/Frontdoor.lean:490
LATE 22 core · 14 supporting This file formalizes the binary-instrument local average treatment effect in the potential-outcome framework. ★ POIVSystem★ late_wald

Instrumental Variables LATE

This file formalizes the binary-instrument local average treatment effect in the potential-outcome framework. It defines the IV subsystem POIVSystem, potential treatments DofZ, potential outcomes YofD, the complier event, event-conditional observable means, the IV assumption bundle, and the target LATE.

The proof surface decomposes the Wald argument into public identities: first_stage_identity, reduced_form_identity, pointwise_monotonicity, and event_conditioning_identity. The theorem late_wald assembles these pieces to identify the observable Wald ratio with the complier average treatment effect.

structure POIVSystem reviewed
Causalean.PO

A binary instrumental-variables subsystem (def:po-iv-system) records, within an ambient potential-outcome system, an instrument, a treatment, and an outcome, where the three nodes are required to be pairwise distinct.

Definition (Lean source)
P :
Z :
P.V
D :
P.V
Y :
P.V
hZbool :
P.X Z ≃ᵐ Bool
hDbool :
P.X D ≃ᵐ Bool
hYreal :
P.X Y ≃ᵐ ℝ
hZD :
Z ≠ D
hDY :
D ≠ Y
hZY :
Z ≠ Y
Causalean.PO.POIVSystem · Causalean/PO/ID/Exact/LATE.lean:45 · uses POSystem
def zVar reviewed
Causalean.PO.POIVSystem

The binary instrument variable exposes the instrument node of an IV system on the zero-one scale used by the LATE model.

Definition (Lean source)
P :
shared
S :
shared
zVar S :
⟨S.Z, S.hZbool⟩
def dVar reviewed
Causalean.PO.POIVSystem

The binary treatment variable exposes the treatment node of an IV system on the zero-one scale used to define compliance types.

Definition (Lean source)
P :
shared
S :
shared
dVar S :
⟨S.D, S.hDbool⟩
def yVar reviewed
Causalean.PO.POIVSystem

The real-valued outcome variable exposes the outcome node of an IV system on the scale over which treatment effects are averaged.

Definition (Lean source)
P :
shared
S :
shared
yVar S :
POVar P ℝ
⟨S.Y, S.hYreal⟩
def instrumentRegime reviewed
Causalean.PO.POIVSystem

The instrument intervention fixes an IV system at one binary instrument value, defining the counterfactual world used for the first stage.

Definition (Lean source)
P :
shared
S :
shared
z :
instrumentRegime S z :
Regime P.V P.X
Regime.single S.Z (S.hZbool.symm z)
Causalean.PO.POIVSystem.instrumentRegime · Causalean/PO/ID/Exact/LATE.lean:75 · uses POIVSystem , POSystem , Regime
def treatmentRegime reviewed
Causalean.PO.POIVSystem

The treatment intervention fixes an IV system at one binary treatment value, defining the counterfactual world used for causal outcomes.

Definition (Lean source)
P :
shared
S :
shared
d :
treatmentRegime S d :
Regime P.V P.X
Regime.single S.D (S.hDbool.symm d)
Causalean.PO.POIVSystem.treatmentRegime · Causalean/PO/ID/Exact/LATE.lean:80 · uses POIVSystem , POSystem , Regime
def DofZ reviewed
Causalean.PO.POIVSystem

Potential treatment records what each unit in the IV system would choose under a fixed binary instrument value, which determines compliance type.

Definition (Lean source)
P :
shared
S :
shared
z :
DofZ S z :
P.Ω → Bool
S.dVar.cfUnder S.zVar z
Causalean.PO.POIVSystem.DofZ · Causalean/PO/ID/Exact/LATE.lean:85 · uses POIVSystem , POSystem
def YofD reviewed
Causalean.PO.POIVSystem

Potential outcome records what each unit in the IV system would experience under a fixed binary treatment value, the primitive contrast averaged by LATE.

Definition (Lean source)
P :
shared
S :
shared
d :
YofD S d :
P.Ω → ℝ
S.yVar.cfUnder S.dVar d
Causalean.PO.POIVSystem.YofD · Causalean/PO/ID/Exact/LATE.lean:95 · uses POIVSystem , POSystem
def factualZ reviewed
Causalean.PO.POIVSystem

The observed instrument extracts each unit's realized assignment from the IV system.

Definition (Lean source)
P :
shared
S :
shared
factualZ S :
P.Ω → Bool
S.zVar.factual
Causalean.PO.POIVSystem.factualZ · Causalean/PO/ID/Exact/LATE.lean:106 · uses POIVSystem , POSystem
def factualD reviewed
Causalean.PO.POIVSystem

The observed treatment extracts each unit's realized uptake from the IV system.

Definition (Lean source)
P :
shared
S :
shared
factualD S :
P.Ω → Bool
S.dVar.factual
Causalean.PO.POIVSystem.factualD · Causalean/PO/ID/Exact/LATE.lean:110 · uses POIVSystem , POSystem
def factualY reviewed
Causalean.PO.POIVSystem

The observed outcome extracts each unit's realized response from the IV system.

Definition (Lean source)
P :
shared
S :
shared
factualY S :
P.Ω → ℝ
S.yVar.factual
Causalean.PO.POIVSystem.factualY · Causalean/PO/ID/Exact/LATE.lean:114 · uses POIVSystem , POSystem
def complierEvent reviewed
Causalean.PO.POIVSystem

The complier population in a binary IV system consists of units induced into treatment by switching the instrument on and not treated when it is off.

Definition (Lean source)
P :
shared
S :
shared
complierEvent S :
Set P.Ω
{ ω | S.DofZ true ω = true ∧ S.DofZ false ω = false }
Causalean.PO.POIVSystem.complierEvent · Causalean/PO/ID/Exact/LATE.lean:118 · uses POIVSystem , POSystem
def zEvent reviewed
Causalean.PO.POIVSystem

An observed instrument cell selects units in the IV system whose realized instrument equals the chosen binary value.

Definition (Lean source)
P :
shared
S :
shared
z :
zEvent S z :
Set P.Ω
S.zVar.event z
Causalean.PO.POIVSystem.zEvent · Causalean/PO/ID/Exact/LATE.lean:123 · uses POIVSystem , POSystem
def YofDofZ reviewed
Causalean.PO.POIVSystem

Outcome under instrument-induced treatment selects each unit's treated or untreated potential outcome in the IV system according to uptake under the chosen instrument value.

Definition (Lean source)
P :
shared
S :
shared
z :
YofDofZ S z :
P.Ω → ℝ
fun ω => if S.DofZ z ω then S.YofD true ω else S.YofD false ω
Causalean.PO.POIVSystem.YofDofZ · Causalean/PO/ID/Exact/LATE.lean:166 · uses POIVSystem , POSystem
def condExpDZ reviewed
Causalean.PO.POIVSystem

The observed first-stage cell mean averages treatment uptake in the IV system among units receiving the selected instrument value.

Definition (Lean source)
P :
shared
S :
shared
z :
condExpDZ S z :
ℝ
normalizedRestrictedIntegral P.μ (S.zEvent z) (fun ω => ((S.factualD ω).toNat : ℝ))
Causalean.PO.POIVSystem.condExpDZ · Causalean/PO/ID/Exact/LATE.lean:180 · uses POIVSystem , POSystem
def condExpYZ reviewed
Causalean.PO.POIVSystem

The observed reduced-form cell mean averages outcomes in the IV system among units receiving the selected instrument value.

Definition (Lean source)
P :
shared
S :
shared
z :
condExpYZ S z :
ℝ
normalizedRestrictedIntegral P.μ (S.zEvent z) S.factualY
Causalean.PO.POIVSystem.condExpYZ · Causalean/PO/ID/Exact/LATE.lean:189 · uses POIVSystem , POSystem
def dUnderZ reviewed
Causalean.PO.POIVSystem

Treatment under an instrument intervention packages the treatment response in the IV system with the assignment value that generates it, enabling exogeneity statements about that counterfactual.

Definition (Lean source)
P :
shared
S :
shared
z :
dUnderZ S z :
⟨S.dVar, Regime.single S.Z (S.hZbool.symm z)⟩
def yUnderD reviewed
Causalean.PO.POIVSystem

Outcome under a treatment intervention packages the potential response in the IV system with the treatment arm that generates it, enabling joint exogeneity statements.

Definition (Lean source)
P :
shared
S :
shared
d :
yUnderD S d :
⟨S.yVar, Regime.single S.D (S.hDbool.symm d)⟩
def cfBundle reviewed
Causalean.PO.POIVSystem

The full LATE counterfactual bundle collects both potential treatments and both potential outcomes from the binary IV system, making instrument independence a single joint assumption.

Definition (Lean source)
P :
shared
S :
shared
cfBundle S :
POCFBundle.cons (S.dUnderZ true) <| POCFBundle.cons (S.dUnderZ false) <| POCFBundle.cons (S.yUnderD true) <| POCFBundle.cons (S.yUnderD false) <| POCFBundle.nil P
structure Assumptions reviewed
Causalean.PO.POIVSystem

Classical binary-instrument IV assumptions (def:po-iv-assumptions). Bundles consistency (SUTVA): the observed treatment and outcome equal the realized potential treatment and outcome, instrument exogeneity: the instrument is independent of the full counterfactual bundle of potential treatments and outcomes, monotonicity (no defiers): turning the instrument on never moves a unit out of treatment, and relevance: the complier event has positive probability.

Definition (Lean source)
P :
shared
S :
consistency :
P.Consistency

Consistency (SUTVA): the observed D/Y equal the realized potential treatment/outcome (D = D(Z), Y = Y(D)). Links observed data to the counterfactuals. (Exclusion — Z affects Y only through D — is built into the Y(d) interface: outcomes carry no z argument, see the type docstring above.)

instrumentIndep :
P.IndepCF (RegimedVar.ofFactual S.zVar) S.cfBundle P.μ

Instrument independence (random/ignorable instrument): the instrument is independent of the full counterfactual bundle, Z ⟂ (D(1), D(0), Y(1), Y(0)). Phrased as independence of the factual instrument from the counterfactual bundle. This is the IV exogeneity condition.

monotonicity :
∀ᵐ ω ∂P.μ, S.DofZ false ω = true → S.DofZ true ω = true

Monotonicity (no defiers): turning the instrument on never moves a unit out of treatment — D(1) ≥ D(0) a.s. On Bool this is D(0)=1 → D(1)=1. Rules out defiers so the IV ratio identifies the complier effect.

relevance :
0 < (P.μ S.complierEvent).toReal

Relevance (non-trivial first stage): the complier event C = {D(1)=1, D(0)=0} has positive probability, so the instrument actually shifts treatment for a positive mass of units (the LATE denominator is non-zero).

Causalean.PO.POIVSystem.Assumptions · Causalean/PO/ID/Exact/LATE.lean:220 · uses POIVSystem , POSystem
def LATE reviewed
Causalean.PO.POIVSystem

The local average treatment effect in a binary IV system is the mean treated- versus-untreated outcome contrast among compliers, with the zero convention when that population has zero probability.

Definition (Lean source)
P :
shared
S :
shared
LATE S :
ℝ
normalizedRestrictedIntegral P.μ S.complierEvent (fun ω => S.YofD true ω - S.YofD false ω)
Causalean.PO.POIVSystem.LATE · Causalean/PO/ID/Exact/LATE.lean:254 · uses POIVSystem , POSystem
theorem late_wald reviewed
Causalean.PO.POIVSystem

Wald identification of LATE (prop:po-late). Under the binary- instrument LATE identifying assumption bundle, when the event {Z=1} has positive probability, the event {Z=0} has positive probability, and the potential outcomes under treatment and under control are integrable, the Wald ratio (E[Y|Z=1] − E[Y|Z=0]) / (E[D|Z=1] − E[D|Z=0]) equals the local average treatment effect LATE.

Formal statement
P :
shared
S :
shared
hA :
S.Assumptions
hZ1 :
0 < (P.μ (S.zEvent true)).toReal
hZ0 :
0 < (P.μ (S.zEvent false)).toReal
hY1 :
Integrable (S.YofD true) P.μ
hY0 :
Integrable (S.YofD false) P.μ
(S.condExpYZ true - S.condExpYZ false) / (S.condExpDZ true - S.condExpDZ false) = S.LATE
Proof (Lean source)
theorem late_wald (hA : S.Assumptions) (hZ1 : 0 < (P.μ (S.zEvent true)).toReal) (hZ0 : 0 < (P.μ (S.zEvent false)).toReal) (hY1 : Integrable (S.YofD true) P.μ) (hY0 : Integrable (S.YofD false) P.μ) : (S.condExpYZ true - S.condExpYZ false) / (S.condExpDZ true - S.condExpDZ false) = S.LATE := by rw [S.first_stage_identity hA hZ1 hZ0] rw [S.reduced_form_identity hA hZ1 hZ0 hY1 hY0] have heq : ∀ᵐ ω ∂P.μ, S.YofDofZ true ω - S.YofDofZ false ω = (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω := S.pointwise_monotonicity hA rw [MeasureTheory.integral_congr_ae heq] rw [S.event_conditioning_identity] have hC : (P.μ S.complierEvent).toReal ≠ 0 := ne_of_gt hA.relevance field_simp
14 supporting declarations (lemmas, instances)
  • measurable_DofZ lemma — Potential treatment under a fixed instrument value is measurable, so the IV system admits probabilities and expectations involving treatment response to that value.
    P :
    shared
    S :
    shared
    z :
    Measurable (S.DofZ z)
    Proof (Lean source)
    @[fun_prop] lemma measurable_DofZ (z : Bool) : Measurable (S.DofZ z) := S.dVar.measurable_cfUnder S.zVar z
    Causalean.PO.POIVSystem.measurable_DofZ · Causalean/PO/ID/Exact/LATE.lean:127
  • measurable_factualZ lemma — The observed instrument is measurable, making its assignment cells observable in the IV system.
    P :
    shared
    S :
    shared
    Measurable S.factualZ
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualZ : Measurable S.factualZ := S.zVar.measurable_factual
    Causalean.PO.POIVSystem.measurable_factualZ · Causalean/PO/ID/Exact/LATE.lean:134
  • measurable_factualD lemma — The observed treatment is measurable, so treatment-cell probabilities are defined for the IV system.
    P :
    shared
    S :
    shared
    Measurable S.factualD
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualD : Measurable S.factualD := S.dVar.measurable_factual
    Causalean.PO.POIVSystem.measurable_factualD · Causalean/PO/ID/Exact/LATE.lean:139
  • measurable_factualY lemma — The observed outcome is measurable, so its population moments are defined for the IV system.
    P :
    shared
    S :
    shared
    Measurable S.factualY
    Proof (Lean source)
    @[fun_prop] lemma measurable_factualY : Measurable S.factualY := S.yVar.measurable_factual
    Causalean.PO.POIVSystem.measurable_factualY · Causalean/PO/ID/Exact/LATE.lean:144
  • measurable_YofD lemma — Potential outcome under a fixed treatment value is measurable, permitting causal outcome averages in the IV system for that treatment arm.
    P :
    shared
    S :
    shared
    d :
    Measurable (S.YofD d)
    Proof (Lean source)
    @[fun_prop] lemma measurable_YofD (d : Bool) : Measurable (S.YofD d) := S.yVar.measurable_cfUnder S.dVar d
    Causalean.PO.POIVSystem.measurable_YofD · Causalean/PO/ID/Exact/LATE.lean:149
  • measurableSet_complierEvent lemma — The complier population is a measurable event, so the IV system assigns it a probability and supports complier-conditional outcome means.
    P :
    shared
    S :
    shared
    MeasurableSet S.complierEvent
    Proof (Lean source)
    lemma measurableSet_complierEvent : MeasurableSet S.complierEvent := (S.measurable_DofZ true (MeasurableSpace.measurableSet_top (s := {true}))).inter (S.measurable_DofZ false (MeasurableSpace.measurableSet_top (s := {false})))
    Causalean.PO.POIVSystem.measurableSet_complierEvent · Causalean/PO/ID/Exact/LATE.lean:155
  • measurableSet_zEvent lemma — Each observed instrument cell is measurable, allowing the IV system to condition observed moments on the selected assignment.
    P :
    shared
    S :
    shared
    z :
    MeasurableSet (S.zEvent z)
    Proof (Lean source)
    lemma measurableSet_zEvent (z : Bool) : MeasurableSet (S.zEvent z) := S.zVar.measurableSet_event _ (measurableSet_singleton _)
    Causalean.PO.POIVSystem.measurableSet_zEvent · Causalean/PO/ID/Exact/LATE.lean:161
  • YofDofZ_def lemma — Instrument-induced outcome equals the treated potential outcome when uptake occurs and the untreated potential outcome otherwise in the IV system under the selected instrument value.
    P :
    shared
    S :
    shared
    z :
    S.YofDofZ z = fun ω => if S.DofZ z ω then S.YofD true ω else S.YofD false ω
    Proof (Lean source)
    @[causal_defs_simps] lemma YofDofZ_def (z : Bool) : S.YofDofZ z = fun ω => if S.DofZ z ω then S.YofD true ω else S.YofD false ω := rfl
    Causalean.PO.POIVSystem.YofDofZ_def · Causalean/PO/ID/Exact/LATE.lean:172
  • DofZ_eq_factualD_on_zEvent lemma — Consistency identifies potential treatment with observed treatment for an IV system satisfying the identifying assumptions, at an instrument value, and for a unit observed in that instrument cell.
    P :
    shared
    S :
    shared
    hA :
    S.Assumptions
    z :
    ω :
    P.Ω
    hω :
    ω ∈ S.zEvent z
    S.DofZ z ω = S.factualD ω
    Proof (Lean source)
    lemma DofZ_eq_factualD_on_zEvent (hA : S.Assumptions) (z : Bool) {ω : P.Ω} (hω : ω ∈ S.zEvent z) : S.DofZ z ω = S.factualD ω := POVar.cf_eq_factual_on_event hA.consistency S.dVar S.zVar z S.hZD.symm hω
    Causalean.PO.POIVSystem.DofZ_eq_factualD_on_zEvent · Causalean/PO/ID/Exact/LATE.lean:267
  • factualY_eq_YofD_factualD lemma — Consistency identifies each observed outcome with the potential outcome under realized treatment for an IV system satisfying the identifying assumptions and the unit being evaluated.
    P :
    shared
    S :
    shared
    hA :
    S.Assumptions
    ω :
    P.Ω
    S.factualY ω = S.YofD (S.factualD ω) ω
    Proof (Lean source)
    lemma factualY_eq_YofD_factualD (hA : S.Assumptions) (ω : P.Ω) : S.factualY ω = S.YofD (S.factualD ω) ω := POVar.factual_eq_cfUnder_self_selected hA.consistency S.yVar S.dVar S.hDY.symm ω
    Causalean.PO.POIVSystem.factualY_eq_YofD_factualD · Causalean/PO/ID/Exact/LATE.lean:275
  • first_stage_identity theorem — The observed first-stage contrast equals the complier share under the binary-IV identifying assumptions when both instrument-on and instrument-off cells have positive probability. Monotonicity is needed to exclude cancellation by defiers.
    P :
    shared
    S :
    shared
    hA :
    S.Assumptions
    hZ1 :
    0 < (P.μ (S.zEvent true)).toReal
    hZ0 :
    0 < (P.μ (S.zEvent false)).toReal
    S.condExpDZ true - S.condExpDZ false = (P.μ S.complierEvent).toReal
    Proof (Lean source)
    theorem first_stage_identity (hA : S.Assumptions) (hZ1 : 0 < (P.μ (S.zEvent true)).toReal) (hZ0 : 0 < (P.μ (S.zEvent false)).toReal) : S.condExpDZ true - S.condExpDZ false = (P.μ S.complierEvent).toReal := by -- Step 1: `condExpDZ z = ∫ (DofZ z ω).toNat ∂μ`. have hμne_zero : ∀ z, 0 < (P.μ (S.zEvent z)).toReal → P.μ (S.zVar.event z) ≠ 0 := fun z hZ h => absurd hZ (by simp [show S.zEvent z = S.zVar.event z from rfl, h]) have hμne_top : ∀ z, P.μ (S.zVar.event z) ≠ ⊤ := fun _ => measure_ne_top _ _ have hCE : ∀ z (_hZ : 0 < (P.μ (S.zEvent z)).toReal), S.condExpDZ z = ∫ ω, ((S.DofZ z ω).toNat : ℝ) ∂P.μ := by intro z hZ -- `h_proj` on the bundle `jointValue`: indices 0,1 are `D(1),D(0)`. let h_proj : (∀ i : Fin S.cfBundle.n, S.cfBundle.type i) → ℝ := fun f => ((cond z ((f (0 : Fin 4)) : Bool) ((f (1 : Fin 4)) : Bool)).toNat : ℝ) have hh_meas : Measurable h_proj := by let instCf : ∀ a : Fin 4, MeasurableSpace (S.cfBundle.type a) := fun a => S.cfBundle.inst a change Measurable fun f : ∀ i : Fin S.cfBundle.n, S.cfBundle.type i => ((cond z ((f (0 : Fin 4)) : Bool) ((f (1 : Fin 4)) : Bool)).toNat : ℝ) cases z · exact (by fun_prop : Measurable fun n : ℕ => (n : ℝ)).comp ((by fun_prop : Measurable Bool.toNat).comp (measurable_pi_apply (1 : Fin 4))) · exact (by fun_prop : Measurable fun n : ℕ => (n : ℝ)).comp ((by fun_prop : Measurable Bool.toNat).comp (measurable_pi_apply (0 : Fin 4))) have h_cons : ∀ ω ∈ S.zVar.event z, ((S.factualD ω).toNat : ℝ) = h_proj (S.cfBundle.jointValue ω) := by intro ω hω rw [← S.DofZ_eq_factualD_on_zEvent hA z hω] change ((S.DofZ z ω).toNat : ℝ) = ((cond z ((S.cfBundle.jointValue ω (0 : Fin 4)) : Bool) ((S.cfBundle.jointValue ω (1 : Fin 4)) : Bool)).toNat : ℝ) cases z <;> rfl have hbridge : S.condExpDZ z = normalizedRestrictedIntegral P.μ (S.zVar.event z) (fun ω => ((S.factualD ω).toNat : ℝ)) := rfl rw [hbridge, POSystem.eventCondExp_of_ae_eq_IndepCF hA.instrumentIndep (a := S.zVar) hh_meas (measurableSet_singleton z) (ae_restrict_of_forall_mem (S.measurableSet_zEvent z) h_cons) (hμne_zero z hZ) (hμne_top z)] refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) intro ω change ((cond z ((S.cfBundle.jointValue ω (0 : Fin 4)) : Bool) ((S.cfBundle.jointValue ω (1 : Fin 4)) : Bool)).toNat : ℝ) = ((S.DofZ z ω).toNat : ℝ) cases z <;> rfl rw [hCE true hZ1, hCE false hZ0] -- Step 2: fold the two integrals into `∫ ((DofZ true).toNat - (DofZ false).toNat) ∂μ`. have hDbdd : ∀ z, ∀ ω, |((S.DofZ z ω).toNat : ℝ)| ≤ 1 := fun z ω => by cases S.DofZ z ω <;> simp have hDint : ∀ z, Integrable (fun ω => ((S.DofZ z ω).toNat : ℝ)) P.μ := fun z => (MeasureTheory.integrable_const (1:ℝ)).mono' ((by fun_prop : Measurable (fun n : ℕ => (n : ℝ))).comp ((by fun_prop : Measurable Bool.toNat).comp (S.measurable_DofZ z)) |>.aestronglyMeasurable) (Filter.Eventually.of_forall (hDbdd z)) rw [← MeasureTheory.integral_sub (hDint true) (hDint false)] -- Step 3: under monotonicity, `(DofZ true).toNat - (DofZ false).toNat = 1_C a.s.`. have hInd : ∀ᵐ ω ∂P.μ, ((S.DofZ true ω).toNat : ℝ) - ((S.DofZ false ω).toNat : ℝ) = S.complierEvent.indicator (fun _ => (1:ℝ)) ω := by refine hA.monotonicity.mono (fun ω hω => ?_) by_cases h1 : S.DofZ true ω = true · by_cases h0 : S.DofZ false ω = true · have hnC : ω ∉ S.complierEvent := by intro ⟨_, h0'⟩; rw [h0] at h0'; exact Bool.noConfusion h0' simp [h1, h0, Set.indicator_of_notMem hnC] · have h0' : S.DofZ false ω = false := Bool.not_eq_true _ |>.mp h0 have hC : ω ∈ S.complierEvent := ⟨h1, h0'⟩ simp [h1, h0', Set.indicator_of_mem hC] · have h1' : S.DofZ true ω = false := Bool.not_eq_true _ |>.mp h1 by_cases h0 : S.DofZ false ω = true · exfalso; rw [hω h0] at h1'; exact Bool.noConfusion h1'.symm · have h0' : S.DofZ false ω = false := Bool.not_eq_true _ |>.mp h0 have hnC : ω ∉ S.complierEvent := by intro ⟨h1'', _⟩; rw [h1'] at h1''; exact Bool.false_ne_true h1'' simp [h1', h0', Set.indicator_of_notMem hnC] rw [MeasureTheory.integral_congr_ae hInd] rw [MeasureTheory.integral_indicator_const (1:ℝ) S.measurableSet_complierEvent] simp [MeasureTheory.measureReal_def]
    Causalean.PO.POIVSystem.first_stage_identity · Causalean/PO/ID/Exact/LATE.lean:282
  • reduced_form_identity theorem — The observed outcome contrast across instrument cells equals the population contrast between instrument-induced potential outcomes under the binary-IV identifying assumptions, positive instrument-on and instrument-off cells, and integrable treated and untreated potential outcomes.
    P :
    shared
    S :
    shared
    hA :
    S.Assumptions
    hZ1 :
    0 < (P.μ (S.zEvent true)).toReal
    hZ0 :
    0 < (P.μ (S.zEvent false)).toReal
    hY1 :
    Integrable (S.YofD true) P.μ
    hY0 :
    Integrable (S.YofD false) P.μ
    S.condExpYZ true - S.condExpYZ false = ∫ ω, (S.YofDofZ true ω - S.YofDofZ false ω) ∂P.μ
    Proof (Lean source)
    theorem reduced_form_identity (hA : S.Assumptions) (hZ1 : 0 < (P.μ (S.zEvent true)).toReal) (hZ0 : 0 < (P.μ (S.zEvent false)).toReal) (hY1 : Integrable (S.YofD true) P.μ) (hY0 : Integrable (S.YofD false) P.μ) : S.condExpYZ true - S.condExpYZ false = ∫ ω, (S.YofDofZ true ω - S.YofDofZ false ω) ∂P.μ := by -- Measurability and integrability of `YofDofZ z`. have hYDZ_meas : ∀ z, Measurable (S.YofDofZ z) := fun z => by unfold YofDofZ exact Measurable.ite (S.measurable_DofZ z (MeasurableSet.singleton true)) (S.measurable_YofD true) (S.measurable_YofD false) have hYDZ_bdd : ∀ z, ∀ ω, |S.YofDofZ z ω| ≤ |S.YofD true ω| + |S.YofD false ω| := fun z ω => by have h1 := abs_nonneg (S.YofD true ω) have h0 := abs_nonneg (S.YofD false ω) unfold YofDofZ; cases S.DofZ z ω <;> simp [h1, h0] have hYDZ_int : ∀ z, Integrable (S.YofDofZ z) P.μ := fun z => (hY1.norm.add hY0.norm).mono' (hYDZ_meas z).aestronglyMeasurable (Filter.Eventually.of_forall (hYDZ_bdd z)) -- Step 1: `condExpYZ z = ∫ YofDofZ z ω ∂μ`. have hμne_zero : ∀ z, 0 < (P.μ (S.zEvent z)).toReal → P.μ (S.zVar.event z) ≠ 0 := fun z hZ h => absurd hZ (by simp [show S.zEvent z = S.zVar.event z from rfl, h]) have hμne_top : ∀ z, P.μ (S.zVar.event z) ≠ ⊤ := fun _ => measure_ne_top _ _ have hCE : ∀ z (_hZ : 0 < (P.μ (S.zEvent z)).toReal), S.condExpYZ z = ∫ ω, S.YofDofZ z ω ∂P.μ := by intro z hZ -- `h_proj` on the bundle: indices 0,1 are `D(1),D(0)`; 2,3 are `Y(1),Y(0)`. let h_proj : (∀ i : Fin S.cfBundle.n, S.cfBundle.type i) → ℝ := fun f => if ((cond z ((f (0 : Fin 4)) : Bool) ((f (1 : Fin 4)) : Bool)) : Bool) then ((f (2 : Fin 4)) : ℝ) else ((f (3 : Fin 4)) : ℝ) have hh_meas : Measurable h_proj := by let instCf : ∀ a : Fin 4, MeasurableSpace (S.cfBundle.type a) := fun a => S.cfBundle.inst a change Measurable fun f : ∀ i : Fin S.cfBundle.n, S.cfBundle.type i => if ((cond z ((f (0 : Fin 4)) : Bool) ((f (1 : Fin 4)) : Bool)) : Bool) then ((f (2 : Fin 4)) : ℝ) else ((f (3 : Fin 4)) : ℝ) cases z · refine Measurable.ite ?_ ?_ ?_ · exact (by fun_prop : Measurable fun f : ∀ i : Fin S.cfBundle.n, S.cfBundle.type i => ((f (1 : Fin 4)) : Bool)) (MeasurableSet.singleton true) · exact measurable_pi_apply (2 : Fin 4) · exact measurable_pi_apply (3 : Fin 4) · refine Measurable.ite ?_ ?_ ?_ · exact (by fun_prop : Measurable fun f : ∀ i : Fin S.cfBundle.n, S.cfBundle.type i => ((f (0 : Fin 4)) : Bool)) (MeasurableSet.singleton true) · exact measurable_pi_apply (2 : Fin 4) · exact measurable_pi_apply (3 : Fin 4) have h_cons : ∀ ω ∈ S.zVar.event z, S.factualY ω = h_proj (S.cfBundle.jointValue ω) := by intro ω hω rw [S.factualY_eq_YofD_factualD hA ω, ← S.DofZ_eq_factualD_on_zEvent hA z hω] have hJV0 : (S.cfBundle.jointValue ω (0 : Fin 4) : Bool) = S.DofZ true ω := rfl have hJV1 : (S.cfBundle.jointValue ω (1 : Fin 4) : Bool) = S.DofZ false ω := rfl have hJV2 : (S.cfBundle.jointValue ω (2 : Fin 4) : ℝ) = S.YofD true ω := rfl have hJV3 : (S.cfBundle.jointValue ω (3 : Fin 4) : ℝ) = S.YofD false ω := rfl change S.YofD (S.DofZ z ω) ω = if ((cond z ((S.cfBundle.jointValue ω (0 : Fin 4)) : Bool) ((S.cfBundle.jointValue ω (1 : Fin 4)) : Bool)) : Bool) then ((S.cfBundle.jointValue ω (2 : Fin 4)) : ℝ) else ((S.cfBundle.jointValue ω (3 : Fin 4)) : ℝ) rw [hJV0, hJV1, hJV2, hJV3] cases z <;> cases S.DofZ _ ω <;> simp have hbridge : S.condExpYZ z = normalizedRestrictedIntegral P.μ (S.zVar.event z) S.factualY := rfl rw [hbridge, POSystem.eventCondExp_of_ae_eq_IndepCF hA.instrumentIndep (a := S.zVar) hh_meas (measurableSet_singleton z) (ae_restrict_of_forall_mem (S.measurableSet_zEvent z) h_cons) (hμne_zero z hZ) (hμne_top z)] refine MeasureTheory.integral_congr_ae (Filter.Eventually.of_forall ?_) intro ω change (if ((cond z ((S.cfBundle.jointValue ω (0 : Fin 4)) : Bool) ((S.cfBundle.jointValue ω (1 : Fin 4)) : Bool)) : Bool) then ((S.cfBundle.jointValue ω (2 : Fin 4)) : ℝ) else ((S.cfBundle.jointValue ω (3 : Fin 4)) : ℝ)) = S.YofDofZ z ω unfold YofDofZ cases z <;> rfl rw [hCE true hZ1, hCE false hZ0] rw [← MeasureTheory.integral_sub (hYDZ_int true) (hYDZ_int false)]
    Causalean.PO.POIVSystem.reduced_form_identity · Causalean/PO/ID/Exact/LATE.lean:368
  • pointwise_monotonicity theorem — The instrument-induced outcome change equals the treatment effect on compliers and vanishes for everyone else, almost surely under the binary-IV identifying assumptions. This isolates the population whose effect survives in the reduced form.
    P :
    shared
    S :
    shared
    hA :
    S.Assumptions
    ∀ᵐ ω ∂P.μ, S.YofDofZ true ω - S.YofDofZ false ω
    = (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω
    Proof (Lean source)
    theorem pointwise_monotonicity (hA : S.Assumptions) : ∀ᵐ ω ∂P.μ, S.YofDofZ true ω - S.YofDofZ false ω = (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω := by refine hA.monotonicity.mono (fun ω hω => ?_) unfold YofDofZ complierEvent rcases hD1 : S.DofZ true ω <;> rcases hD0 : S.DofZ false ω <;> simp_all [indicator]
    Causalean.PO.POIVSystem.pointwise_monotonicity · Causalean/PO/ID/Exact/LATE.lean:457
  • event_conditioning_identity theorem — The population mean of the complier-restricted treatment effect factors into the complier share times LATE for the binary IV system, converting the reduced-form numerator into the target estimand.
    P :
    shared
    S :
    shared
    ∫ ω, (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω ∂P.μ
    = (P.μ S.complierEvent).toReal * S.LATE
    Proof (Lean source)
    theorem event_conditioning_identity : ∫ ω, (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω ∂P.μ = (P.μ S.complierEvent).toReal * S.LATE := by unfold LATE have hC : MeasurableSet S.complierEvent := S.measurableSet_complierEvent have h_rw : (fun ω => (S.YofD true ω - S.YofD false ω) * S.complierEvent.indicator (fun _ => (1:ℝ)) ω) = S.complierEvent.indicator (fun ω => S.YofD true ω - S.YofD false ω) := by funext ω by_cases hω : ω ∈ S.complierEvent · simp [Set.indicator_of_mem hω] · simp [Set.indicator_of_notMem hω] rw [h_rw, MeasureTheory.integral_indicator hC] simpa [mul_comm] using (eventCondExp_mul_measure_toReal P.μ S.complierEvent (measure_ne_top _ _) (fun ω => S.YofD true ω - S.YofD false ω)).symm
    Causalean.PO.POIVSystem.event_conditioning_identity · Causalean/PO/ID/Exact/LATE.lean:470