Estimation.ATT

AIPW/DML estimation of the average treatment effect on the treated (Hahn-form moment), mirroring the ATE development; the top-level theorem files are pending repair against the current Mathlib pin.

Score 15 core · 21 supporting · 5 submodules AIPW score infrastructure for ATT DML: treated-effect moments, influence functions, finite variance, mean-zero facts, L2 continuity, and arm-specific pull-out lemmas. Remainder 4 core · 0 supporting · 2 submodules Roll-up for the ATT second-order AIPW remainder development.
Setup 9 core · 5 supporting Defines the treated-estimation system for ATT estimation under back-door assumptions. ★ θ₀_eq_ATT

Defines the treated-estimation system for ATT estimation under back-door assumptions. The structure bundles value-space representatives for the control outcome regression, propensity score, treatment probability, and compatibility fields needed by ATT AIPW moments.

The file introduces TreatedEstimationSystem, derives the control-arm counterfactual compatibility lemma μ₀_compat, defines the one-sided overlap predicate OneSidedOverlap, the covariate and data laws P_X and P_Z, the value-space target θ₀, and proves θ₀_eq_ATT. It also constructs a TreatedEstimationSystem from a POBackdoorSystem with overlap and an integrable observed outcome via POBackdoorSystem.toTreatedEstimationSystem.

structure TreatedEstimationSystem reviewed
Causalean.Estimation.ATT

A treated estimation system extends a potential-outcome back-door system with the value-space nuisance representatives needed for ATT AIPW estimation: the control-arm outcome regression μ₀(x) and a propensity score e(x) that is bounded away from 1, together with the control regression's agreement, almost everywhere, with the σ(X)-measurable observable control regression adjustedCE false, composed with the factual covariate and the analogous agreement of the propensity score with the observable propensity propScore.

Definition (Lean source)
P :
γ :
extends :
Value-space control-arm outcome regression `μ₀(x)`.
μ₀_val :
γ → ℝ
μ₀_meas :
Measurable μ₀_val
Value-space propensity `e(x)`.
e_val :
γ → ℝ
e_meas :
One-sided overlap on the value-space propensity.
e_lt_one :
∀ x, e_val x < 1
The control-arm regression `μ₀_val` represents the **observable** adjustment functional `adjustedCE false = E[Y·1_{D=0}|σX] / P[D=0|σX]`, with NO identification assumptions: `μ₀_val (factualX ·) =ᵐ adjustedCE false`. This is the ML/regression target (`adjustedCE false` is the control regression `E[Y|D=0,X]`, see `regression_adjustment`). The counterfactual reading `μ[Y(0)|σX] =ᵐ μ₀_val ∘ factualX` is NOT assumed here — it is the *derived* lemma `μ₀_compat` below, which requires the one-sided ATT backdoor assumptions.
μ₀_reg_compat :
(fun ω => μ₀_val (toPOBackdoorSystem.factualX ω))
=ᵐ[P.μ] toPOBackdoorSystem.adjustedCE false
Propensity factors through `factualX`: `propScore true =ᵐ e_val (factualX ·)`.
e_compat :
toPOBackdoorSystem.propScore true =ᵐ[P.μ] (fun ω => e_val (toPOBackdoorSystem.factualX ω))
Causalean.Estimation.ATT.TreatedEstimationSystem · Causalean/Estimation/ATT/Setup.lean:56 · uses POSystem
def OneSidedOverlap reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

One-sided overlap predicate propScore true ω ≤ 1 − ε a.s., with ε ∈ (0, 1/2]. The 0 < propScore true half is implied at the PO level by Assumptions.overlap; for ATT only the upper bound matters because the IPW correction divides by 1 − e(X).

Definition (Lean source)
def OneSidedOverlap (S : TreatedEstimationSystem P γ) (ε : ℝ) : Prop := 0 < ε ∧ ε ≤ 1 / 2 ∧ (∀ᵐ ω ∂P.μ, S.toPOBackdoorSystem.propScore true ω ≤ 1 - ε)
Causalean.Estimation.ATT.TreatedEstimationSystem.OneSidedOverlap · Causalean/Estimation/ATT/Setup.lean:143 · uses TreatedEstimationSystem , POSystem
def P_X reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Covariate marginal: P_X := μ.map factualX.

Definition (Lean source)
noncomputable def P_X (S : TreatedEstimationSystem P γ) : Measure γ := P.μ.map S.toPOBackdoorSystem.factualX
Causalean.Estimation.ATT.TreatedEstimationSystem.P_X · Causalean/Estimation/ATT/Setup.lean:153 · uses TreatedEstimationSystem , POSystem
def factualZ reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Data triple (X, A, Y) : Ω → γ × Bool × ℝ.

Definition (Lean source)
noncomputable def factualZ (S : TreatedEstimationSystem P γ) : P.Ω → γ × Bool × ℝ := fun ω => (S.toPOBackdoorSystem.factualX ω, S.toPOBackdoorSystem.factualD ω, S.toPOBackdoorSystem.factualY ω)
Causalean.Estimation.ATT.TreatedEstimationSystem.factualZ · Causalean/Estimation/ATT/Setup.lean:157 · uses TreatedEstimationSystem , POSystem
def P_Z reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Joint data law P_Z := μ.map (X, A, Y).

Definition (Lean source)
noncomputable def P_Z (S : TreatedEstimationSystem P γ) : Measure (γ × Bool × ℝ) := P.μ.map S.factualZ
Causalean.Estimation.ATT.TreatedEstimationSystem.P_Z · Causalean/Estimation/ATT/Setup.lean:171 · uses TreatedEstimationSystem , POSystem
def π_val reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Marginal treatment probability π = P[A = 1], viewed at the value-space layer. Delegates to the PO-level definition POBackdoorSystem.propTreated.

Definition (Lean source)
noncomputable def π_val (S : TreatedEstimationSystem P γ) : ℝ := S.toPOBackdoorSystem.propTreated
Causalean.Estimation.ATT.TreatedEstimationSystem.π_val · Causalean/Estimation/ATT/Setup.lean:188 · uses TreatedEstimationSystem , POSystem
def θ₀ reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Value-space ATT estimand: delegates to the PO-level adjusted form POBackdoorSystem.adjustedATT.

Definition (Lean source)
noncomputable def θ₀ (S : TreatedEstimationSystem P γ) : ℝ := S.toPOBackdoorSystem.adjustedATT
Causalean.Estimation.ATT.TreatedEstimationSystem.θ₀ · Causalean/Estimation/ATT/Setup.lean:193 · uses TreatedEstimationSystem , POSystem
theorem θ₀_eq_ATT reviewed
Causalean.Estimation.ATT.TreatedEstimationSystem

Value-space estimand equals the potential-outcome ATT. Under the one-sided back-door ATT assumptions, the value-space ATT estimand θ₀ (the adjusted control-regression functional) coincides with the average treatment effect on the treated defined on potential outcomes.

Formal statement
hA :
S.toPOBackdoorSystem.ATTAssumptions
S.θ₀ = S.toPOBackdoorSystem.ATT
Proof (Lean source)
theorem θ₀_eq_ATT (S : TreatedEstimationSystem P γ) (hA : S.toPOBackdoorSystem.ATTAssumptions) : S.θ₀ = S.toPOBackdoorSystem.ATT := by unfold θ₀ exact (S.toPOBackdoorSystem.ATT_eq_adjustedATT hA).symm
Causalean.Estimation.ATT.TreatedEstimationSystem.θ₀_eq_ATT · Causalean/Estimation/ATT/Setup.lean:198 · uses TreatedEstimationSystem , θ₀ , ATT , ATTAssumptions , POSystem
def toTreatedEstimationSystem reviewed
Causalean.PO.POBackdoorSystem

The compatibility/positivity fields are free. From a POBackdoorSystem with two-sided overlap and an integrable observed outcome — and no unconfoundedness — one constructs a TreatedEstimationSystem: μ₀_val is the control-arm regression regFn false and e_val is the propensity lift eLift clamped below 1. Every added field is discharged (μ₀_reg_compat from regression_adjustment false; e_lt_one from the clamp; e_compat from overlap). So the control regression and propensity lifts were never genuine assumptions.

Definition (Lean source)
noncomputable def _root_.Causalean.PO.POBackdoorSystem.toTreatedEstimationSystem {P : POSystem} {γ : Type*} [MeasurableSpace γ] (S : PO.POBackdoorSystem P γ) [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (hov : ∀ᵐ ω ∂P.μ, 0 < S.propScore true ω ∧ S.propScore true ω < 1) (hY : Integrable S.factualY P.μ) : TreatedEstimationSystem P γ where toPOBackdoorSystem := S μ₀_val := fun x => S.regFn (false, x) μ₀_meas := S.measurable_regFn.comp (measurable_const.prodMk measurable_id) e_val := Set.piecewise {x : γ | S.eLift x < 1} S.eLift (fun _ => 1 / 2) e_meas := Measurable.piecewise (measurableSet_lt S.measurable_eLift measurable_const) S.measurable_eLift measurable_const e_lt_one := by intro x by_cases hx : x ∈ {x : γ | S.eLift x < 1} · rw [Set.piecewise_eq_of_mem _ _ _ hx]; exact hx · rw [Set.piecewise_eq_of_notMem _ _ _ hx]; norm_num μ₀_reg_compat := (S.regression_adjustment false hY (S.propScore_ne_of_overlap hov false)).symm e_compat := by filter_upwards [hov] with ω hω have heq : S.propScore true ω = S.eLift (S.factualX ω) := congrFun S.propScore_true_eq_eLift ω have hmem : S.factualX ω ∈ {x : γ | S.eLift x < 1} := by rw [Set.mem_setOf_eq, ← heq]; exact hω.2 rw [heq, Set.piecewise_eq_of_mem _ _ _ hmem]
5 supporting declarations (lemmas, instances)
  • control_cate_backdoor lemma — Control-arm backdoor CATE under ATT assumptions. The conditional mean of the untreated potential outcome given the covariates equals the observable control regression when consistency, conditional ignorability, integrability, and one-sided control overlap hold. No treated-arm overlap is used.
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    S.toPOBackdoorSystem.CATE false =ᵐ[P.μ] S.toPOBackdoorSystem.adjustedCE false
    Proof (Lean source)
    lemma control_cate_backdoor (S : TreatedEstimationSystem P γ) (hA : S.toPOBackdoorSystem.ATTAssumptions) : S.toPOBackdoorSystem.CATE false =ᵐ[P.μ] S.toPOBackdoorSystem.adjustedCE false := S.toPOBackdoorSystem.cate_backdoor_of_propScore_ne hA.consistency hA.unconfoundedness hA.integrable_Y1 hA.integrable_Y0 false hA.propScore_false_ne
    Causalean.Estimation.ATT.TreatedEstimationSystem.control_cate_backdoor · Causalean/Estimation/ATT/Setup.lean:107
  • propScore_true_nonneg_ae lemma — Treated propensity nonnegativity. The conditional treatment probability P[D=1 | X] is nonnegative almost surely because it is the conditional expectation of a nonnegative treatment indicator.
    ∀ᵐ ω ∂P.μ, 0 ≤ S.toPOBackdoorSystem.propScore true ω
    Proof (Lean source)
    lemma propScore_true_nonneg_ae (S : TreatedEstimationSystem P γ) : ∀ᵐ ω ∂P.μ, 0 ≤ S.toPOBackdoorSystem.propScore true ω := MeasureTheory.condExp_nonneg (Filter.Eventually.of_forall (fun ω => by rcases S.toPOBackdoorSystem.dVar.indicator_eq_one_or_zero true ω with h | h <;> simp [h]))
    Causalean.Estimation.ATT.TreatedEstimationSystem.propScore_true_nonneg_ae · Causalean/Estimation/ATT/Setup.lean:119
  • μ₀_compat lemma — Counterfactual compatibility (derived, under ATT identification). The control-arm outcome-regression representative equals the conditional mean of the untreated potential outcome given the covariates, almost surely.
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    P.μ[S.toPOBackdoorSystem.YofD false | S.toPOBackdoorSystem.sigmaX]
    =ᵐ[P.μ] (fun ω => S.μ₀_val (S.toPOBackdoorSystem.factualX ω))
    Proof (Lean source)
    lemma μ₀_compat (S : TreatedEstimationSystem P γ) (hA : S.toPOBackdoorSystem.ATTAssumptions) : P.μ[S.toPOBackdoorSystem.YofD false | S.toPOBackdoorSystem.sigmaX] =ᵐ[P.μ] (fun ω => S.μ₀_val (S.toPOBackdoorSystem.factualX ω)) := (S.control_cate_backdoor hA).trans S.μ₀_reg_compat.symm
    Causalean.Estimation.ATT.TreatedEstimationSystem.μ₀_compat · Causalean/Estimation/ATT/Setup.lean:129
  • measurable_factualZ lemma — Measurability of the data triple.
    Measurable S.factualZ
    Proof (Lean source)
    lemma measurable_factualZ (S : TreatedEstimationSystem P γ) : Measurable S.factualZ := (S.toPOBackdoorSystem.measurable_factualX).prodMk ((S.toPOBackdoorSystem.measurable_factualD).prodMk S.toPOBackdoorSystem.measurable_factualY)
    Causalean.Estimation.ATT.TreatedEstimationSystem.measurable_factualZ · Causalean/Estimation/ATT/Setup.lean:164
  • P_Z_map_projX_eq_P_X lemma — The covariate marginal P_X is the pushforward of P_Z along the projection (x, a, y) ↦ x. Used to bridge integrals/eLpNorm between P_X (covariates only) and P_Z (full data triple).
    S.P_Z.map (fun z : γ × Bool × ℝ => z.1) = S.P_X
    Proof (Lean source)
    lemma P_Z_map_projX_eq_P_X (S : TreatedEstimationSystem P γ) : S.P_Z.map (fun z : γ × Bool × ℝ => z.1) = S.P_X := by unfold TreatedEstimationSystem.P_Z TreatedEstimationSystem.P_X rw [Measure.map_map (by fun_prop : Measurable (fun z : γ × Bool × ℝ => z.1)) S.measurable_factualZ] rfl
    Causalean.Estimation.ATT.TreatedEstimationSystem.P_Z_map_projX_eq_P_X · Causalean/Estimation/ATT/Setup.lean:176
ATTInstance 2 core · 2 supporting Instantiates the abstract orthogonal-moment DML theorem for the average treatment effect on the treated. ★ att_dml_isAsymLinear

Instantiates the abstract orthogonal-moment DML theorem for the average treatment effect on the treated. It connects the ATT AIPW score, remainder identity, score-continuity bounds, and sample-splitting assumptions to asymptotic linearity.

The main declarations are attGeneralMoment, the MeanZero bridge att_meanZero, the bilinear remainder bridge att_bilinearRem, and the headline abstract asymptotic-linearity theorem att_dml_isAsymLinear. This file is the ATT specialization of the general orthogonal-moment interface; the user-facing estimator wrapper is in Estimation/ATT/DML.lean.

def attGeneralMoment reviewed
Causalean.Estimation.ATT

ATT AIPW instance of the abstract GeneralMoment.

Definition (Lean source)
noncomputable def attGeneralMoment (S : TreatedEstimationSystem P γ) {ε : ℝ} (hη₀_mem : S.η₀ ∈ H_ε S ε) (hπ_pos : 0 < S.π_val) : GeneralMoment P.Ω P.μ (γ × Bool × ℝ) S.P_Z (TreatedNuisanceVec γ) where m := fun η z θ => aipwMomentATTFunctional η z θ η₀ := S.η₀ θ₀ := S.θ₀ H_ε := H_ε S ε ρ₁ := fun η η' => ⟨(eLpNorm (fun x => η.μ₀_fn x - η'.μ₀_fn x) 2 S.P_X).toReal, ENNReal.toReal_nonneg⟩ ρ₂ := fun η η' => ⟨(eLpNorm (fun x => η.e_fn x - η'.e_fn x) 2 S.P_X).toReal, ENNReal.toReal_nonneg⟩ m_meas := fun η θ => TreatedEstimationSystem.measurable_aipwMomentATTFunctional η θ η₀_mem := hη₀_mem -- ATT AIPW is a linear-in-`θ` score `m_AIPW^ATT(η, z, θ) = ψ̃(η, z) − A·θ`, -- so the population Jacobian is -- `J₀ = ∂_θ ∫ m(η₀, z, θ) dP_Z |_{θ=θ₀} = −∫ A dP_Z = −π_T`. J₀ := -S.π_val J₀_ne_zero := by intro h have : S.π_val = 0 := by linarith [show -S.π_val = 0 from h] linarith
theorem att_dml_isAsymLinear reviewed
Causalean.Estimation.ATT

Headline ATT AIPW DML asymptotic-linearity theorem, derived from the abstract dml_chernozhukov_asymptoticLinear in Estimation/OrthogonalMoments/DMLChernozhukov.lean. Fix an estimated-nuisance sequence η_hat, an i.i.d. sample of the data triple, and a one-shot cross-fitting split of that sample. Under membership of the truth nuisance in the overlap-bounded realization set H_ε, nonnegativity of the true propensity, one-sided overlap ε on the true propensity, the one-sided back-door ATT assumptions, a strictly positive marginal treatment probability, square-integrability of the factual outcome and of the untreated potential outcome Y(0), integrability of the truth-side control-arm IPW correction, and a limiting fold-size fraction c strictly between 0 and 1 with the treated-fold cardinality fraction converging to c: if every candidate draw η_hat n ω lies in the overlap-bounded realization set H_ε, every candidate propensity is nonnegative, each candidate control-regression and propensity error admits an L²(P_X) witness, each candidate IPW correction is integrable, the AIPW moment functional is measurable jointly in the probability-space and data arguments, and on each cross-fitting fold, both singly and jointly, the moment at every candidate nuisance is integrable and square-integrable against the observed data law, the control-regression and propensity error rates are individually o_p(1) in L²(P_X), and their product is o_p(n^{-1/2}), then the Chernozhukov one-step DML estimator built from the ATT AIPW moment, the sample, the split, and the candidate nuisance sequence is asymptotically linear at the true ATT θ₀, with influence function ψ(z) = (1/π_T) · aipwMomentATTFunctional η₀ z θ₀.

Formal statement
ε :
hη₀_mem :
S.η₀ ∈ H_ε S ε
h_e_lb :
∀ x, 0 ≤ S.e_val x
h_overlap :
S.OneSidedOverlap ε
hA :
S.toPOBackdoorSystem.ATTAssumptions
hπ_pos :
0 < S.π_val
h_y2 :
Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
h_y0_2 :
Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
hIPW :
Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ
sample :
IIDSample P.Ω (γ × Bool × ℝ) P.μ S.P_Z
split :
c :
hc_pos :
0 < c
_hc_lt :
c < 1
h_split_rate :
Tendsto (fun n => ((split.foldB n).card : ℝ) / n) atTop (𝓝 c)
η_hat :
ℕ → P.Ω → TreatedNuisanceVec γ
h_in_Hε :
∀ n ω, η_hat n ω ∈ H_ε S ε
h_e_lb_hat :
∀ n ω x, 0 ≤ (η_hat n ω).e_fn x
h_mu_diff_memLp :
∀ n ω, MemLp (fun x => (η_hat n ω).μ₀_fn x - S.μ₀_val x) 2 S.P_X
h_e_diff_memLp :
∀ n ω, MemLp (fun x => (η_hat n ω).e_fn x - S.e_val x) 2 S.P_X
h_IPW_at :
∀ n ω,
Integrable (fun z => (1 - indA z) * ((η_hat n ω).e_fn (projX z) / (1 - (η_hat n ω).e_fn (projX z))) * (projY z - (η_hat n ω).μ₀_fn (projX z))) S.P_Z
h_m_meas :
∀ n,
Measurable (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀)
h_m_foldA :
∀ n,
Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (fun ω z => aipwMomentATTFunctional (η_hat n ω) z S.θ₀)
h_m_foldA_uncurry :
∀ n,
Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace (γ × Bool × ℝ))] (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀)
h_m_int :
∀ n ω, Integrable (fun z => aipwMomentATTFunctional (η_hat n ω) z S.θ₀) S.P_Z
h_m_sq_int :
∀ n ω, Integrable (fun z => (aipwMomentATTFunctional (η_hat n ω) z S.θ₀) ^ 2) S.P_Z
h_indiv_rate_ρ₁ :
IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₁ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun _ => (1 : ℝ)) P.μ
h_indiv_rate_ρ₂ :
IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₂ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun _ => (1 : ℝ)) P.μ
h_product_rate :
IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₁ (η_hat n ω) S.η₀ : NNReal) : ℝ) * (((attGeneralMoment S hη₀_mem hπ_pos).ρ₂ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun n => (n : ℝ) ^ (-(1 / 2 : ℝ))) P.μ
IsAsymLinear (dmlChernozhukovEstimator (attGeneralMoment S hη₀_mem hπ_pos) sample split η_hat) S.θ₀ (fun z => -(attGeneralMoment S hη₀_mem hπ_pos).J₀_inv * aipwMomentATTFunctional S.η₀ z S.θ₀) sample split.foldB
Proof (Lean source)
theorem att_dml_isAsymLinear (S : TreatedEstimationSystem P γ) {ε : ℝ} (hη₀_mem : S.η₀ ∈ H_ε S ε) (h_e_lb : ∀ x, 0 ≤ S.e_val x) (h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (hπ_pos : 0 < S.π_val) (h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) (hIPW : Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ) (sample : IIDSample P.Ω (γ × Bool × ℝ) P.μ S.P_Z) (split : OneShotSplit sample) {c : ℝ} (hc_pos : 0 < c) (_hc_lt : c < 1) (h_split_rate : Tendsto (fun n => ((split.foldB n).card : ℝ) / n) atTop (𝓝 c)) (η_hat : ℕ → P.Ω → TreatedNuisanceVec γ) (h_in_Hε : ∀ n ω, η_hat n ω ∈ H_ε S ε) (h_e_lb_hat : ∀ n ω x, 0 ≤ (η_hat n ω).e_fn x) (h_mu_diff_memLp : ∀ n ω, MemLp (fun x => (η_hat n ω).μ₀_fn x - S.μ₀_val x) 2 S.P_X) (h_e_diff_memLp : ∀ n ω, MemLp (fun x => (η_hat n ω).e_fn x - S.e_val x) 2 S.P_X) (h_IPW_at : ∀ n ω, Integrable (fun z => (1 - indA z) * ((η_hat n ω).e_fn (projX z) / (1 - (η_hat n ω).e_fn (projX z))) * (projY z - (η_hat n ω).μ₀_fn (projX z))) S.P_Z) (h_m_meas : ∀ n, Measurable (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀)) (h_m_foldA : ∀ n, Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (fun ω z => aipwMomentATTFunctional (η_hat n ω) z S.θ₀)) (h_m_foldA_uncurry : ∀ n, Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace (γ × Bool × ℝ))] (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀)) (h_m_int : ∀ n ω, Integrable (fun z => aipwMomentATTFunctional (η_hat n ω) z S.θ₀) S.P_Z) (h_m_sq_int : ∀ n ω, Integrable (fun z => (aipwMomentATTFunctional (η_hat n ω) z S.θ₀) ^ 2) S.P_Z) (h_indiv_rate_ρ₁ : IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₁ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun _ => (1 : ℝ)) P.μ) (h_indiv_rate_ρ₂ : IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₂ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun _ => (1 : ℝ)) P.μ) (h_product_rate : IsLittleOp (fun n ω => (((attGeneralMoment S hη₀_mem hπ_pos).ρ₁ (η_hat n ω) S.η₀ : NNReal) : ℝ) * (((attGeneralMoment S hη₀_mem hπ_pos).ρ₂ (η_hat n ω) S.η₀ : NNReal) : ℝ)) (fun n => (n : ℝ) ^ (-(1 / 2 : ℝ))) P.μ) : IsAsymLinear (dmlChernozhukovEstimator (attGeneralMoment S hη₀_mem hπ_pos) sample split η_hat) S.θ₀ (fun z => -(attGeneralMoment S hη₀_mem hπ_pos).J₀_inv * aipwMomentATTFunctional S.η₀ z S.θ₀) sample split.foldB := by have hMZ := att_meanZero S hη₀_mem h_overlap hA hπ_pos h_y2 h_y0_2 hIPW have hFV : Integrable (fun z => ((attGeneralMoment S hη₀_mem hπ_pos).m (attGeneralMoment S hη₀_mem hπ_pos).η₀ z (attGeneralMoment S hη₀_mem hπ_pos).θ₀) ^ 2) S.P_Z := by simpa [attGeneralMoment, ψ_ATT, η₀, aipwMomentATTFunctional] using aipw_finite_var_ATT S h_overlap hA h_y2 h_y0_2 have hBR_at : ∀ n ω, |∫ z, (attGeneralMoment S hη₀_mem hπ_pos).m (η_hat n ω) z (attGeneralMoment S hη₀_mem hπ_pos).θ₀ ∂S.P_Z| ≤ aipw_rem_const_ATT ε * (((attGeneralMoment S hη₀_mem hπ_pos).ρ₁ (η_hat n ω) (attGeneralMoment S hη₀_mem hπ_pos).η₀ : NNReal) : ℝ) * (((attGeneralMoment S hη₀_mem hπ_pos).ρ₂ (η_hat n ω) (attGeneralMoment S hη₀_mem hπ_pos).η₀ : NNReal) : ℝ) := by intro n ω have h := aipw_remainder_bound_ATT S h_overlap hA hπ_pos h_y2 h_y0_2 (η_hat n ω) (h_in_Hε n ω) (h_mu_diff_memLp n ω) (h_e_diff_memLp n ω) (h_IPW_at n ω) change |∫ z, aipwMomentATTFunctional (η_hat n ω) z S.θ₀ ∂(S.P_Z)| ≤ aipw_rem_const_ATT ε * (eLpNorm (fun x => (η_hat n ω).μ₀_fn x - S.μ₀_val x) 2 S.P_X).toReal * (eLpNorm (fun x => (η_hat n ω).e_fn x - S.e_val x) 2 S.P_X).toReal exact h have h_mu_rate : IsLittleOp (fun n ω => (eLpNorm (fun x => (η_hat n ω).μ₀_fn x - S.μ₀_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ := by exact h_indiv_rate_ρ₁ have h_e_rate : IsLittleOp (fun n ω => (eLpNorm (fun x => (η_hat n ω).e_fn x - S.e_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ := by exact h_indiv_rate_ρ₂ have h_score_diff_rate : IsLittleOp (fun n ω => (eLpNorm (fun z => (attGeneralMoment S hη₀_mem hπ_pos).m (η_hat n ω) z (attGeneralMoment S hη₀_mem hπ_pos).θ₀ - (attGeneralMoment S hη₀_mem hπ_pos).m (attGeneralMoment S hη₀_mem hπ_pos).η₀ z (attGeneralMoment S hη₀_mem hπ_pos).θ₀) 2 S.P_Z).toReal) (fun _ => (1 : ℝ)) P.μ := by simpa [attGeneralMoment] using aipw_score_diff_isLittleOp_one_ATT S h_overlap hη₀_mem h_e_lb hA h_y2 h_y0_2 η_hat h_in_Hε h_e_lb_hat h_mu_diff_memLp h_e_diff_memLp h_mu_rate h_e_rate simpa [attGeneralMoment] using (dml_chernozhukov_asymptoticLinear (attGeneralMoment S hη₀_mem hπ_pos) hMZ hFV sample split hc_pos h_split_rate η_hat (Crem := aipw_rem_const_ATT ε) hBR_at h_m_meas h_m_foldA h_m_foldA_uncurry h_m_int h_m_sq_int h_score_diff_rate h_product_rate)
2 supporting declarations (lemmas, instances)
  • att_meanZero theorem — ATT AIPW satisfies MeanZero. Direct repackaging of aipw_mean_zero_ATT from Estimation/ATT/Score/MeanZero.lean.
    ε :
    hη₀_mem :
    S.η₀ ∈ H_ε S ε
    _h_overlap :
    S.OneSidedOverlap ε
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    hπ_pos :
    0 < S.π_val
    _h_y2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
    _h_y0_2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
    hIPW :
    Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ
    MeanZero (attGeneralMoment S hη₀_mem hπ_pos)
    Proof (Lean source)
    theorem att_meanZero (S : TreatedEstimationSystem P γ) {ε : ℝ} (hη₀_mem : S.η₀ ∈ H_ε S ε) (_h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (hπ_pos : 0 < S.π_val) (_h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (_h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) (hIPW : Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ) : MeanZero (attGeneralMoment S hη₀_mem hπ_pos) := by unfold MeanZero attGeneralMoment exact aipw_mean_zero_ATT S hA hπ_pos hIPW
    Causalean.Estimation.ATT.att_meanZero · Causalean/Estimation/ATT/ATTInstance.lean:110
  • att_bilinearRem theorem — ATT AIPW satisfies BilinearRemainder with constant aipw_rem_const_ATT ε.
    ε :
    hη₀_mem :
    S.η₀ ∈ H_ε S ε
    h_overlap :
    S.OneSidedOverlap ε
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    hπ_pos :
    0 < S.π_val
    h_y2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
    h_y0_2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
    h_L2 :
    ∀ η ∈ H_ε S ε,
    MemLp (fun x => η.μ₀_fn x - S.μ₀_val x) 2 S.P_X ∧
    MemLp (fun x => η.e_fn x - S.e_val x) 2 S.P_X
    h_IPW :
    ∀ η ∈ H_ε S ε,
    Integrable (fun z => (1 - indA z) * (η.e_fn (projX z) / (1 - η.e_fn (projX z))) * (projY z - η.μ₀_fn (projX z))) S.P_Z
    ∃ C, BilinearRemainder (attGeneralMoment S hη₀_mem hπ_pos) C
    Proof (Lean source)
    theorem att_bilinearRem (S : TreatedEstimationSystem P γ) {ε : ℝ} (hη₀_mem : S.η₀ ∈ H_ε S ε) (h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (hπ_pos : 0 < S.π_val) (h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) (h_L2 : ∀ η ∈ H_ε S ε, MemLp (fun x => η.μ₀_fn x - S.μ₀_val x) 2 S.P_X ∧ MemLp (fun x => η.e_fn x - S.e_val x) 2 S.P_X) (h_IPW : ∀ η ∈ H_ε S ε, Integrable (fun z => (1 - indA z) * (η.e_fn (projX z) / (1 - η.e_fn (projX z))) * (projY z - η.μ₀_fn (projX z))) S.P_Z) : ∃ C, BilinearRemainder (attGeneralMoment S hη₀_mem hπ_pos) C := by refine ⟨aipw_rem_const_ATT ε, ?_⟩ intro η hη obtain ⟨hΔμ₀, hΔe⟩ := h_L2 η hη have h := aipw_remainder_bound_ATT S h_overlap hA hπ_pos h_y2 h_y0_2 η hη hΔμ₀ hΔe (h_IPW η hη) change |∫ z, aipwMomentATTFunctional η z S.θ₀ ∂(S.P_Z)| ≤ aipw_rem_const_ATT ε * (eLpNorm (fun x => η.μ₀_fn x - S.μ₀_val x) 2 S.P_X).toReal * (eLpNorm (fun x => η.e_fn x - S.e_val x) 2 S.P_X).toReal exact h
    Causalean.Estimation.ATT.att_bilinearRem · Causalean/Estimation/ATT/ATTInstance.lean:130
DML 2 core · 2 supporting This file defines the one-shot sample-split augmented inverse-probability weighted estimator for the back-door average treatment effect on the treated and states its asymptotic linearity theorem. ★ dml_ATT_isAsymLinear

Double Machine Learning for ATT

This file defines the one-shot sample-split augmented inverse-probability weighted estimator for the back-door average treatment effect on the treated and states its asymptotic linearity theorem. The theorem connects the estimator to the ATT AIPW influence function under the one-sided ATT back-door assumption bundle, an additional one-sided upper-overlap bound, second-moment, sample-split, and nuisance-rate conditions. Parallel to Estimation/ATE/DML.lean.

The main declarations are dmlEstimator_ATT, the derived influence-function facts ψ_ATT_integral_zero and ψ_ATT_finite_var, and the production wrapper dml_ATT_isAsymLinear, which transports the abstract att_dml_isAsymLinear result to the population-π ATT estimator.

def dmlEstimator_ATT reviewed
Causalean.Estimation.ATT

One-shot DML / AIPW estimator of the back-door ATT (def:est-dml-att).

Definition (Lean source)
noncomputable def dmlEstimator_ATT (S : TreatedEstimationSystem P γ) (sample : IIDSample P.Ω (γ × Bool × ℝ) P.μ S.P_Z) (split : OneShotSplit sample) (μ₀_hat : ℕ → P.Ω → (γ → ℝ)) (e_hat : ℕ → P.Ω → (γ → ℝ)) (n : ℕ) : P.Ω → ℝ := fun ω => (1 / S.π_val) * (((split.foldB n).card : ℝ)⁻¹ * ∑ i ∈ split.foldB n, aipwMomentATT (sample.Z i ω) (μ₀_hat n ω) (e_hat n ω) 0)
theorem dml_ATT_isAsymLinear reviewed
Causalean.Estimation.ATT

Asymptotic linearity of the one-shot DML ATTthm:est-dml-att-al. Fix candidate control-regression and propensity estimator sequences μ₀_hat and e_hat, an i.i.d. sample of the data triple, and a one-shot cross-fitting split of that sample. Under the true propensity bounded above by 1 − ε almost everywhere, nonnegativity of the true propensity, one-sided overlap ε on the treated-arm propensity, the one-sided back-door ATT assumptions, a strictly positive marginal treatment probability, square-integrability of the factual outcome and of the untreated potential outcome Y(0), and a limiting fold-size fraction c strictly between 0 and 1 with the treated-fold cardinality fraction converging to c: if the candidate propensity is bounded above by 1 − ε almost everywhere, for every n, ω, the candidate propensity is nonnegative everywhere, the candidate regressions are jointly measurable in the probability-space and covariate arguments, each candidate regression, at every n, ω, is square-integrable against the covariate law, each candidate regression depends only on its own cross-fitting fold, singly and jointly with the covariate, the ATT AIPW moment at every candidate regression pair is integrable and square-integrable against the observed data law, the control-regression and propensity error rates are individually o_p(1) in L²(P_X), and their product is o_p(n^{-1/2}), then the population-π one-shot DML/AIPW ATT estimator is asymptotically linear at the true ATT θ₀, with influence function ψ_ATT, along the sample and the cross-fitting folds.

Formal statement
ε :
h_e_overlap :
∀ᵐ x ∂S.P_X, S.e_val x ≤ 1 - ε
h_e_lb :
∀ x, 0 ≤ S.e_val x
h_overlap :
S.OneSidedOverlap ε
hA :
S.toPOBackdoorSystem.ATTAssumptions
hπ_pos :
0 < S.π_val
h_y2 :
Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
h_y0_2 :
Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
sample :
IIDSample P.Ω (γ × Bool × ℝ) P.μ S.P_Z
split :
c :
hc_pos :
0 < c
hc_lt :
c < 1
h_split_rate :
Tendsto (fun n => ((split.foldB n).card : ℝ) / n) atTop (𝓝 c)
μ₀_hat :
ℕ → P.Ω → (γ → ℝ)
e_hat :
ℕ → P.Ω → (γ → ℝ)
h_e_hat_overlap :
∀ n ω, ∀ᵐ x ∂S.P_X, e_hat n ω x ≤ 1 - ε
h_e_hat_lb :
∀ n ω x, 0 ≤ e_hat n ω x
h_μ₀_meas :
∀ n, Measurable (fun (p : P.Ω × γ) => μ₀_hat n p.1 p.2)
h_e_meas :
∀ n, Measurable (fun (p : P.Ω × γ) => e_hat n p.1 p.2)
h_μ₀_memLp :
∀ n ω, MemLp (fun x => μ₀_hat n ω x) 2 S.P_X
h_e_memLp :
∀ n ω, MemLp (fun x => e_hat n ω x) 2 S.P_X
h_μ₀_foldA :
∀ n,
Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (μ₀_hat n)
h_e_foldA :
∀ n,
Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (e_hat n)
h_μ₀_uncurry_foldA :
∀ n,
Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace γ)] (fun (p : P.Ω × γ) => μ₀_hat n p.1 p.2)
h_e_uncurry_foldA :
∀ n,
Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace γ)] (fun (p : P.Ω × γ) => e_hat n p.1 p.2)
h_m_int :
∀ n ω, Integrable (fun z => aipwMomentATT z (μ₀_hat n ω) (e_hat n ω) S.θ₀) S.P_Z
h_m_sq_int :
∀ n ω, Integrable (fun z => (aipwMomentATT z (μ₀_hat n ω) (e_hat n ω) S.θ₀) ^ 2) S.P_Z
h_mu_rate :
IsLittleOp (fun n ω => (eLpNorm (fun x => μ₀_hat n ω x - S.μ₀_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ
h_e_rate :
IsLittleOp (fun n ω => (eLpNorm (fun x => e_hat n ω x - S.e_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ
h_product_rate :
IsLittleOp (fun n ω => (eLpNorm (fun x => μ₀_hat n ω x - S.μ₀_val x) 2 S.P_X).toReal * (eLpNorm (fun x => e_hat n ω x - S.e_val x) 2 S.P_X).toReal) (fun n => (n : ℝ) ^ (-(1 / 2 : ℝ))) P.μ
IsAsymLinear (dmlEstimator_ATT S sample split μ₀_hat e_hat) S.θ₀ S.ψ_ATT sample split.foldB
Proof (Lean source)
theorem dml_ATT_isAsymLinear (S : TreatedEstimationSystem P γ) {ε : ℝ} (h_e_overlap : ∀ᵐ x ∂S.P_X, S.e_val x ≤ 1 - ε) (h_e_lb : ∀ x, 0 ≤ S.e_val x) (h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (hπ_pos : 0 < S.π_val) (h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) (sample : IIDSample P.Ω (γ × Bool × ℝ) P.μ S.P_Z) (split : OneShotSplit sample) {c : ℝ} (hc_pos : 0 < c) (hc_lt : c < 1) (h_split_rate : Tendsto (fun n => ((split.foldB n).card : ℝ) / n) atTop (𝓝 c)) (μ₀_hat : ℕ → P.Ω → (γ → ℝ)) (e_hat : ℕ → P.Ω → (γ → ℝ)) (h_e_hat_overlap : ∀ n ω, ∀ᵐ x ∂S.P_X, e_hat n ω x ≤ 1 - ε) (h_e_hat_lb : ∀ n ω x, 0 ≤ e_hat n ω x) (h_μ₀_meas : ∀ n, Measurable (fun (p : P.Ω × γ) => μ₀_hat n p.1 p.2)) (h_e_meas : ∀ n, Measurable (fun (p : P.Ω × γ) => e_hat n p.1 p.2)) (h_μ₀_memLp : ∀ n ω, MemLp (fun x => μ₀_hat n ω x) 2 S.P_X) (h_e_memLp : ∀ n ω, MemLp (fun x => e_hat n ω x) 2 S.P_X) (h_μ₀_foldA : ∀ n, Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (μ₀_hat n)) (h_e_foldA : ∀ n, Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (e_hat n)) (h_μ₀_uncurry_foldA : ∀ n, Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace γ)] (fun (p : P.Ω × γ) => μ₀_hat n p.1 p.2)) (h_e_uncurry_foldA : ∀ n, Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace γ)] (fun (p : P.Ω × γ) => e_hat n p.1 p.2)) (h_m_int : ∀ n ω, Integrable (fun z => aipwMomentATT z (μ₀_hat n ω) (e_hat n ω) S.θ₀) S.P_Z) (h_m_sq_int : ∀ n ω, Integrable (fun z => (aipwMomentATT z (μ₀_hat n ω) (e_hat n ω) S.θ₀) ^ 2) S.P_Z) (h_mu_rate : IsLittleOp (fun n ω => (eLpNorm (fun x => μ₀_hat n ω x - S.μ₀_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ) (h_e_rate : IsLittleOp (fun n ω => (eLpNorm (fun x => e_hat n ω x - S.e_val x) 2 S.P_X).toReal) (fun _ => (1 : ℝ)) P.μ) (h_product_rate : IsLittleOp (fun n ω => (eLpNorm (fun x => μ₀_hat n ω x - S.μ₀_val x) 2 S.P_X).toReal * (eLpNorm (fun x => e_hat n ω x - S.e_val x) 2 S.P_X).toReal) (fun n => (n : ℝ) ^ (-(1 / 2 : ℝ))) P.μ) : IsAsymLinear (dmlEstimator_ATT S sample split μ₀_hat e_hat) S.θ₀ S.ψ_ATT sample split.foldB := by -- 0. Discharge the truth-nuisance IPW integrability gate from overlap + L². have hIPW := ipw_truth_integrable S h_overlap hA h_y2 h_y0_2 -- 1. Build the abstract `η_hat : ℕ → P.Ω → TreatedNuisanceVec γ`. let η_hat : ℕ → P.Ω → TreatedNuisanceVec γ := fun n ω => { μ₀_fn := μ₀_hat n ω e_fn := e_hat n ω μ₀_meas := (h_μ₀_meas n).comp (Measurable.prodMk measurable_const measurable_id) e_meas := (h_e_meas n).comp (Measurable.prodMk measurable_const measurable_id) } -- `S.P_X` is a probability measure (used by `MemLp.of_bound` for `S.e_val`). haveI : IsProbabilityMeasure S.P_X := by unfold TreatedEstimationSystem.P_X exact Measure.isProbabilityMeasure_map S.toPOBackdoorSystem.measurable_factualX.aemeasurable -- `S.P_Z` is a probability measure (used by score integrability transport). haveI : IsProbabilityMeasure S.P_Z := by unfold TreatedEstimationSystem.P_Z exact Measure.isProbabilityMeasure_map S.measurable_factualZ.aemeasurable -- 2. Per-η̂ L² differences for the abstract remainder bound. have hμ₀_val_memLp : MemLp S.μ₀_val 2 S.P_X := by have hY0_L2 : MemLp (S.toPOBackdoorSystem.YofD false) 2 P.μ := (memLp_two_iff_integrable_sq (S.toPOBackdoorSystem.measurable_YofD false).aestronglyMeasurable).2 h_y0_2 have hcond_L2 : MemLp (P.μ[S.toPOBackdoorSystem.YofD false | S.toPOBackdoorSystem.sigmaX]) 2 P.μ := hY0_L2.condExp (by norm_num) have hcomp_L2 : MemLp (fun ω => S.μ₀_val (S.toPOBackdoorSystem.factualX ω)) 2 P.μ := hcond_L2.ae_eq (S.μ₀_compat hA) rw [TreatedEstimationSystem.P_X] exact (memLp_map_measure_iff S.μ₀_meas.aestronglyMeasurable S.toPOBackdoorSystem.measurable_factualX.aemeasurable).2 hcomp_L2 have he_val_memLp : MemLp S.e_val 2 S.P_X := by refine MemLp.of_bound S.e_meas.aestronglyMeasurable 1 ?_ filter_upwards [h_e_overlap] with x hx rw [Real.norm_eq_abs] exact abs_le.mpr ⟨by linarith [h_e_lb x], by linarith [hx, h_overlap.1]⟩ have he_val_memLp_top : MemLp S.e_val ⊤ S.P_X := by refine MemLp.of_bound S.e_meas.aestronglyMeasurable 1 ?_ filter_upwards [h_e_overlap] with x hx rw [Real.norm_eq_abs] exact abs_le.mpr ⟨by linarith [h_e_lb x], by linarith [hx, h_overlap.1]⟩ have hη₀_mem : S.η₀ ∈ H_ε S ε := by refine ⟨h_e_overlap, ?_, ?_⟩ · simpa [TreatedEstimationSystem.η₀] using hμ₀_val_memLp · simpa [TreatedEstimationSystem.η₀] using he_val_memLp_top have h_in_Hε : ∀ n ω, η_hat n ω ∈ H_ε S ε := by intro n ω refine ⟨h_e_hat_overlap n ω, ?_, ?_⟩ · simpa [η_hat] using h_μ₀_memLp n ω · refine MemLp.of_bound (η_hat n ω).e_meas.aestronglyMeasurable 1 ?_ filter_upwards [h_e_hat_overlap n ω] with x hx rw [Real.norm_eq_abs] exact abs_le.mpr ⟨by linarith [h_e_hat_lb n ω x], by linarith [hx, h_overlap.1]⟩ have h_mu_diff_memLp : ∀ n ω, MemLp (fun x => (η_hat n ω).μ₀_fn x - S.μ₀_val x) 2 S.P_X := by intro n ω exact (h_μ₀_memLp n ω).sub hμ₀_val_memLp have h_e_diff_memLp : ∀ n ω, MemLp (fun x => (η_hat n ω).e_fn x - S.e_val x) 2 S.P_X := by intro n ω exact (h_e_memLp n ω).sub he_val_memLp -- 3. Translate score measurability to the abstract interface. have h_m_meas : ∀ n, Measurable (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀) := by intro n unfold aipwMomentATTFunctional aipwMomentATT unfold indA projX projA projY dsimp [η_hat] have hA : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => p.2.2.1) := measurable_snd.snd.fst have hY : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => p.2.2.2) := measurable_snd.snd.snd have hproj : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => (p.1, p.2.1)) := Measurable.prodMk measurable_fst measurable_snd.fst have hμ : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => μ₀_hat n p.1 p.2.1) := (h_μ₀_meas n).comp hproj have he : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => e_hat n p.1 p.2.1) := (h_e_meas n).comp hproj have hindA : Measurable (fun p : P.Ω × (γ × Bool × ℝ) => if p.2.2.1 = true then (1 : ℝ) else 0) := by refine Measurable.ite ?_ measurable_const measurable_const exact hA (MeasurableSet.singleton true) have hOne : Measurable (fun _ : P.Ω × (γ × Bool × ℝ) => (1 : ℝ)) := measurable_const have hθ : Measurable (fun _ : P.Ω × (γ × Bool × ℝ) => S.θ₀) := measurable_const simpa [mul_assoc] using (((hindA.fun_mul (hY.fun_sub hμ)).fun_sub ((hOne.fun_sub hindA).fun_mul ((he.fun_div (hOne.fun_sub he)).fun_mul (hY.fun_sub hμ)))).fun_sub (hindA.fun_mul hθ)) have h_m_foldA : ∀ n, Measurable[comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance] (fun ω z => aipwMomentATTFunctional (η_hat n ω) z S.θ₀) := by intro n unfold aipwMomentATTFunctional aipwMomentATT unfold indA projX projA projY dsimp [η_hat] fun_prop have h_m_foldA_uncurry : ∀ n, Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace (γ × Bool × ℝ))] (fun (p : P.Ω × (γ × Bool × ℝ)) => aipwMomentATTFunctional (η_hat n p.1) p.2 S.θ₀) := by intro n change Measurable[(comap (fun ω (i : split.foldA n) => sample.Z i ω) inferInstance).prod (inferInstance : MeasurableSpace (γ × Bool × ℝ))] -- … truncated; follow the source link for the rest …
2 supporting declarations (lemmas, instances)
  • ψ_ATT_integral_zero theorem — Mean zero of the centered population-π ATT influence function ψ_ATT.
    ε :
    h_overlap :
    S.OneSidedOverlap ε
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    hπ_pos :
    0 < S.π_val
    h_y2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
    h_y0_2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
    hIPW :
    Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ
    ∫ z, S.ψ_ATT z ∂(S.P_Z) = 0
    Proof (Lean source)
    theorem ψ_ATT_integral_zero (S : TreatedEstimationSystem P γ) {ε : ℝ} (h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (hπ_pos : 0 < S.π_val) (h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) (hIPW : Integrable (fun ω => (1 - S.toPOBackdoorSystem.dVar.indicator true ω) * (S.toPOBackdoorSystem.propScore true ω / (1 - S.toPOBackdoorSystem.propScore true ω)) * (S.toPOBackdoorSystem.factualY ω - S.toPOBackdoorSystem.adjustedCE false ω)) P.μ) : ∫ z, S.ψ_ATT z ∂(S.P_Z) = 0 := by haveI : IsProbabilityMeasure S.P_Z := by unfold TreatedEstimationSystem.P_Z exact Measure.isProbabilityMeasure_map S.measurable_factualZ.aemeasurable have hπ_ne : S.π_val ≠ 0 := ne_of_gt hπ_pos have hmz : ∫ z, aipwMomentATT z S.μ₀_val S.e_val S.θ₀ ∂S.P_Z = 0 := aipw_mean_zero_ATT S hA hπ_pos hIPW have hm_meas : Measurable (fun z => aipwMomentATT z S.μ₀_val S.e_val S.θ₀) := measurable_aipwMomentATT_at_θ₀ S have hm_int : Integrable (fun z => aipwMomentATT z S.μ₀_val S.e_val S.θ₀) S.P_Z := ((memLp_two_iff_integrable_sq hm_meas.aestronglyMeasurable).2 (aipw_finite_var_ATT S h_overlap hA h_y2 h_y0_2)).integrable (by norm_num) have hindA_meas : Measurable (fun z : γ × Bool × ℝ => indA z) := by unfold indA projA refine Measurable.ite ?_ measurable_const measurable_const exact measurable_snd.fst (MeasurableSet.singleton true) have hindA_memLp : MemLp (fun z : γ × Bool × ℝ => indA z) 2 S.P_Z := by refine MemLp.of_bound hindA_meas.aestronglyMeasurable (1 : ℝ) ?_ filter_upwards with z rcases hb : z.2.1 with _ | _ <;> simp [indA, projA, hb] have hindA_int : Integrable (fun z : γ × Bool × ℝ => indA z) S.P_Z := hindA_memLp.integrable (by norm_num) have hindA_integral : ∫ z, indA z ∂S.P_Z = S.π_val := by rw [TreatedEstimationSystem.P_Z, integral_map S.measurable_factualZ.aemeasurable hindA_meas.aestronglyMeasurable] have hpt : (fun ω => indA (S.factualZ ω)) = (fun ω => S.toPOBackdoorSystem.dVar.indicator true ω) := by funext ω by_cases hD : S.toPOBackdoorSystem.factualD ω = true · have hInd : S.toPOBackdoorSystem.dVar.indicator true ω = 1 := S.toPOBackdoorSystem.dVar.indicator_apply_eq_one hD simp [TreatedEstimationSystem.factualZ, indA, projA, hD, hInd] · have hInd : S.toPOBackdoorSystem.dVar.indicator true ω = 0 := S.toPOBackdoorSystem.dVar.indicator_apply_eq_zero (x := true) hD simp [TreatedEstimationSystem.factualZ, indA, projA, hD, hInd] rw [hpt] rfl have hsplit : ∀ z, aipwMomentATT z S.μ₀_val S.e_val 0 = aipwMomentATT z S.μ₀_val S.e_val S.θ₀ + indA z * S.θ₀ := by intro z; unfold aipwMomentATT; ring have hm0_int : Integrable (fun z => aipwMomentATT z S.μ₀_val S.e_val 0) S.P_Z := by refine (hm_int.add (hindA_int.mul_const S.θ₀)).congr ?_ filter_upwards with z simp only [Pi.add_apply] rw [hsplit z] have hm0_integral : ∫ z, aipwMomentATT z S.μ₀_val S.e_val 0 ∂S.P_Z = S.θ₀ * S.π_val := by rw [integral_congr_ae (Filter.Eventually.of_forall hsplit), integral_add hm_int (hindA_int.mul_const S.θ₀), hmz, zero_add, integral_mul_const, hindA_integral] ring have hconst : ∫ _z : γ × Bool × ℝ, S.θ₀ ∂S.P_Z = S.θ₀ := by rw [integral_const]; simp unfold TreatedEstimationSystem.ψ_ATT rw [integral_sub (hm0_int.const_mul (1 / S.π_val)) (integrable_const S.θ₀), integral_const_mul, hm0_integral, hconst, one_div, mul_comm S.θ₀ S.π_val, inv_mul_cancel_left₀ hπ_ne, sub_self]
    Causalean.Estimation.ATT.ψ_ATT_integral_zero · Causalean/Estimation/ATT/DML.lean:111
  • ψ_ATT_finite_var theorem — Finite variance of the centered population-π ATT influence function. Integrable ψ_ATT² against P_Z. Derived (not assumed) from aipw_finite_var_ATT (square-integrability of the moment at θ₀) and boundedness of the treatment indicator, via ψ_ATT = (1/π_T)·(m(η₀,·,θ₀) + θ₀·A) − θ₀ ∈ L²(P_Z).
    ε :
    h_overlap :
    S.OneSidedOverlap ε
    hA :
    S.toPOBackdoorSystem.ATTAssumptions
    h_y2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ
    h_y0_2 :
    Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ
    Integrable (fun z => (S.ψ_ATT z) ^ 2) S.P_Z
    Proof (Lean source)
    theorem ψ_ATT_finite_var (S : TreatedEstimationSystem P γ) {ε : ℝ} (h_overlap : S.OneSidedOverlap ε) (hA : S.toPOBackdoorSystem.ATTAssumptions) (h_y2 : Integrable (fun ω => (S.toPOBackdoorSystem.factualY ω) ^ 2) P.μ) (h_y0_2 : Integrable (fun ω => (S.toPOBackdoorSystem.YofD false ω) ^ 2) P.μ) : Integrable (fun z => (S.ψ_ATT z) ^ 2) S.P_Z := by haveI : IsProbabilityMeasure S.P_Z := by unfold TreatedEstimationSystem.P_Z exact Measure.isProbabilityMeasure_map S.measurable_factualZ.aemeasurable have hm_meas : Measurable (fun z => aipwMomentATT z S.μ₀_val S.e_val S.θ₀) := measurable_aipwMomentATT_at_θ₀ S have hm_L2 : MemLp (fun z => aipwMomentATT z S.μ₀_val S.e_val S.θ₀) 2 S.P_Z := (memLp_two_iff_integrable_sq hm_meas.aestronglyMeasurable).2 (aipw_finite_var_ATT S h_overlap hA h_y2 h_y0_2) have hindA_meas : Measurable (fun z : γ × Bool × ℝ => indA z) := by unfold indA projA refine Measurable.ite ?_ measurable_const measurable_const exact measurable_snd.fst (MeasurableSet.singleton true) have hindA_L2 : MemLp (fun z : γ × Bool × ℝ => indA z) 2 S.P_Z := by refine MemLp.of_bound hindA_meas.aestronglyMeasurable (1 : ℝ) ?_ filter_upwards with z rcases hb : z.2.1 with _ | _ <;> simp [indA, projA, hb] have hm0_L2 : MemLp (fun z => aipwMomentATT z S.μ₀_val S.e_val 0) 2 S.P_Z := (hm_L2.add (hindA_L2.const_smul S.θ₀)).ae_eq (Filter.Eventually.of_forall fun z => by simp only [Pi.add_apply, Pi.smul_apply, smul_eq_mul] unfold aipwMomentATT; ring) have hψeq : (fun z => S.ψ_ATT z) = (fun z => (1 / S.π_val) • aipwMomentATT z S.μ₀_val S.e_val 0 - S.θ₀) := by funext z; unfold TreatedEstimationSystem.ψ_ATT; simp only [smul_eq_mul] have hψ_L2 : MemLp (fun z => S.ψ_ATT z) 2 S.P_Z := by rw [hψeq] exact (hm0_L2.const_smul (1 / S.π_val)).sub (memLp_const S.θ₀) exact hψ_L2.integrable_sq
    Causalean.Estimation.ATT.ψ_ATT_finite_var · Causalean/Estimation/ATT/DML.lean:189