Estimation.Minimax­ATE.Varying­Center­Case1

First varying-center MinimaxATE lower-bound construction: cell-varying mixture laws, class membership, χ² overlap, ATE gap, and risk lower bound.

Construction 7 core · 3 supporting This file defines the cell-varying-center Rademacher construction for the structure-agnostic ATE lower bound. ★ validDGP_hatV★ validDGP_pertV

Cell-Varying Construction

This file defines the cell-varying-center Rademacher construction for the structure-agnostic ATE lower bound. The nuisance center may vary by paired cell while remaining constant within each pair, preserving the exact cancellation used by the gap and overlap calculations.

The structure VarConstr stores the bump magnitudes α, β, the pair-indexed nuisance center m₀, g₀, g₁, and the inequalities that keep all perturbed nuisances in [0, 1]. Its namespace defines the center functions mhatV and ghatV, the sign-dependent perturbations mPertV and gPertV, the denominator positivity lemma denomV_pos, and the validity proofs validDGP_hatV and validDGP_pertV.

structure VarConstr reviewed
Causalean.Estimation.MinimaxATE

Cell-varying-center construction data for a Rademacher perturbation whose nuisance center may vary by paired cell (Jin–Syrgkanis 2024, Assumption 2, restricted to centers constant within a pair). It packages two bump-magnitude scalars, one on the treated outcome arm and one on the propensity, together with a nuisance center given by the pair-indexed functions m₀, g₀ and g₁ for the propensity and the two potential-outcome regressions, plus the inequalities certifying that both bump magnitudes are nonnegative, the center is pointwise strictly inside (0,1) for m₀, g₀ and g₁, the propensity bump is smaller than the treated-arm center, keeping the perturbation denominator positive, the treated-arm bump does not exceed the treated center, keeping the perturbed outcome regression nonnegative, and worst-case bounds forcing the perturbed outcome regression to stay at most one and the perturbed propensity to stay at most one.

Definition (Lean source)
K :
Bump magnitude on the treated outcome arm.
α :
Bump magnitude on the propensity.
β :
Cell-varying propensity center `m̂`.
m₀ :
Fin K → ℝ
Cell-varying control-arm center `ĝ(0,·)`.
g₀ :
Fin K → ℝ
Cell-varying treated-arm center `ĝ(1,·)`.
g₁ :
Fin K → ℝ
:
0 ≤ α
:
0 ≤ β
hm₀0 :
∀ j, 0 < m₀ j
hm₀1 :
∀ j, m₀ j < 1
hg₀0 :
∀ j, 0 < g₀ j
hg₀1 :
∀ j, g₀ j < 1
hg₁0 :
∀ j, 0 < g₁ j
hg₁1 :
∀ j, g₁ j < 1
The propensity bump is smaller than the treated center (keeps the denominator `1 − (β/g₁)·Δ` positive).
hβg₁ :
∀ j, β < g₁ j
The treated-arm bump does not exceed the treated center (keeps `gλ(1) ≥ 0`).
hαg₁ :
∀ j, α ≤ g₁ j
Worst-case upper bound keeping `gλ(1) ≤ 1`.
hgU :
∀ j, g₁ j + α + β / g₁ j ≤ 1
Worst-case upper bound keeping `mλ ≤ 1`.
hmU :
∀ j, m₀ j * (1 + β / g₁ j) ≤ 1
def mhatV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The cell-varying propensity center as a function of the covariate.

Definition (Lean source)
noncomputable def mhatV : (Fin K × Bool) → ℝ := fun x => P.m₀ x.1
Causalean.Estimation.MinimaxATE.VarConstr.mhatV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Construction.lean:105 · uses VarConstr
def ghatV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The cell-varying outcome-regression center: g₁ j on the treated arm, g₀ j on control, where j is the pair index of the cell.

Definition (Lean source)
noncomputable def ghatV : Bool → (Fin K × Bool) → ℝ := fun d x => if d then P.g₁ x.1 else P.g₀ x.1
Causalean.Estimation.MinimaxATE.VarConstr.ghatV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Construction.lean:108 · uses VarConstr
def mPertV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The perturbed propensity mλ x = m₀ x.1·(1 − (β/g₁ x.1)·Δ).

Definition (Lean source)
noncomputable def mPertV (lam : Fin K → Bool) : (Fin K × Bool) → ℝ := fun x => P.m₀ x.1 * (1 - (P.β / P.g₁ x.1) * Δ lam x)
Causalean.Estimation.MinimaxATE.VarConstr.mPertV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Construction.lean:113 · uses VarConstr
def gPertV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The perturbed outcome regression: control arm = g₀ x.1, treated arm gλ(1,x) = (g₁ x.1 + α·Δ)/(1 − (β/g₁ x.1)·Δ).

Definition (Lean source)
noncomputable def gPertV (lam : Fin K → Bool) : Bool → (Fin K × Bool) → ℝ := fun d x => if d then (P.g₁ x.1 + P.α * Δ lam x) / (1 - (P.β / P.g₁ x.1) * Δ lam x) else P.g₀ x.1
Causalean.Estimation.MinimaxATE.VarConstr.gPertV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Construction.lean:117 · uses VarConstr
theorem validDGP_hatV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The null cell-varying-center data-generating process, with propensity mhatV and outcome regressions ghatV, is a valid finite observed-data model, i.e. all its component probabilities lie in [0,1].

Formal statement
ValidDGP (C := Fin K × Bool) P.mhatV P.ghatV
Proof (Lean source)
theorem validDGP_hatV : ValidDGP (C := Fin K × Bool) P.mhatV P.ghatV := by refine ⟨fun x => ?_, fun d x => ?_⟩ · simp only [mhatV]; exact ⟨(P.hm₀0 x.1).le, (P.hm₀1 x.1).le⟩ · simp only [ghatV]; cases d · exact ⟨(P.hg₀0 x.1).le, (P.hg₀1 x.1).le⟩ · exact ⟨(P.hg₁0 x.1).le, (P.hg₁1 x.1).le⟩
theorem validDGP_pertV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

For any Rademacher sign vector lam indexing the perturbation, the perturbed propensity and outcome-regression functions define a valid finite observed-data model, i.e. take values in [0,1].

Formal statement
lam :
Fin K → Bool
ValidDGP (P.mPertV lam) (P.gPertV lam)
Proof (Lean source)
theorem validDGP_pertV (lam : Fin K → Bool) : ValidDGP (P.mPertV lam) (P.gPertV lam) := by refine ⟨fun x => ?_, fun d x => ?_⟩ · -- propensity `m₀·(1 − (β/g₁)·Δ) ∈ [0,1]` have hr := P.ratio_nonneg x.1 have hr1 := P.ratio_lt_one x.1 have hmU := P.hmU x.1 have hm0 := P.hm₀0 x.1 simp only [mPertV] rcases Δ_mem lam x with h | h · rw [h]; constructor · nlinarith · nlinarith · rw [h]; constructor · nlinarith · nlinarith · -- outcome `gλ(d,·) ∈ [0,1]` have hd := P.denomV_pos lam x rcases d with _ | _ · simp only [gPertV, Bool.false_eq_true, if_false]; exact ⟨(P.hg₀0 x.1).le, (P.hg₀1 x.1).le⟩ · simp only [gPertV, if_true] have hr := P.ratio_nonneg x.1 have hgU := P.hgU x.1 have hαg₁ := P.hαg₁ x.1 have hg₁0 := P.hg₁0 x.1 have hg₁1 := P.hg₁1 x.1 have hα := P.hα rcases Δ_mem lam x with h | h · rw [h] at hd ⊢ refine ⟨div_nonneg (by nlinarith) hd.le, ?_⟩ rw [div_le_one hd]; nlinarith · rw [h] at hd ⊢ refine ⟨div_nonneg (by nlinarith) hd.le, ?_⟩ rw [div_le_one hd]; nlinarith
3 supporting declarations (lemmas, instances)
Chi­Sq­Overlap 3 core · 2 supporting This file computes the single-observation chi-squared overlap for the first cell-varying perturbation family in the structure-agnostic average treatment effect lower bound. ★ chiSqOverlap_eqV

Cell-Varying Chi-Squared Second-Moment Overlap

This file computes the single-observation chi-squared overlap for the first cell-varying perturbation family in the structure-agnostic average treatment effect lower bound. The result isolates the per-pair overlap coefficient that feeds the non-uniform Ingster inequality. This overlap is a χ² second-moment quantity for the lower-bound construction, not the causal positivity/overlap assumption.

The declaration ΓV is the nonnegative per-pair coefficient proved by ΓV_nonneg. The quantity chiSqOverlapV lam lam' is the finite second moment of two perturbed observation laws relative to the null. The algebraic lemmas obsReal_pertV_eq and chiSqOverlap_eqV compute that overlap as 1 + sum_j (ΓV j / K) * signOf (lam j) * signOf (lam' j), which is the form consumed by ingster_bound_general.

def ΓV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The per-pair χ²-overlap coefficient.

Definition (Lean source)
noncomputable def ΓV (j : Fin K) : ℝ := P.m₀ j * P.α ^ 2 / P.g₁ j + P.m₀ j * (P.α + P.β / P.g₁ j) ^ 2 / (1 - P.g₁ j) + P.m₀ j ^ 2 * P.β ^ 2 / (P.g₁ j ^ 2 * (1 - P.m₀ j))
Causalean.Estimation.MinimaxATE.VarConstr.ΓV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/ChiSqOverlap.lean:48 · uses VarConstr
def chiSqOverlapV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The single-observation χ² second-moment overlap of two perturbed laws relative to the null.

Definition (Lean source)
noncomputable def chiSqOverlapV (lam lam' : Fin K → Bool) : ℝ := ∑ z : Obs (Fin K × Bool), obsReal (P.mPertV lam) (P.gPertV lam) z * obsReal (P.mPertV lam') (P.gPertV lam') z / obsReal P.mhatV P.ghatV z
Causalean.Estimation.MinimaxATE.VarConstr.chiSqOverlapV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/ChiSqOverlap.lean:67 · uses VarConstr
theorem chiSqOverlap_eqV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

For any two Rademacher sign vectors lam and lam' indexing perturbed data-generating processes, the single-observation χ² overlap between them equals one plus the sum over pairs j of the per-pair coefficient ΓV j / K times the sign agreement between lam and lam' at pair j.

Formal statement
lam lam' :
Fin K → Bool
P.chiSqOverlapV lam lam'
= 1 + ∑ j, (P.ΓV j / (K : ℝ)) * (signOf (lam j) * signOf (lam' j))
Proof (Lean source)
theorem chiSqOverlap_eqV [NeZero K] (lam lam' : Fin K → Bool) : P.chiSqOverlapV lam lam' = 1 + ∑ j, (P.ΓV j / (K : ℝ)) * (signOf (lam j) * signOf (lam' j)) := by have hK : (K : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr (NeZero.ne K) have hcard : (card (Fin K × Bool) : ℝ) = 2 * K := by rw [Fintype.card_prod, Fintype.card_fin, Fintype.card_bool]; push_cast; ring -- Rewrite the overlap as a per-pair sum. have hsum : P.chiSqOverlapV lam lam' = ∑ j : Fin K, (1 / (K : ℝ)) * (1 + P.ΓV j * (signOf (lam j) * signOf (lam' j))) := by unfold chiSqOverlapV rw [Fintype.sum_prod_type, Fintype.sum_prod_type] refine Finset.sum_congr rfl fun j _ => ?_ simp only [Fintype.sum_prod_type, Fintype.sum_bool] simp only [obsReal_pertV_eq] simp only [obsReal, mhatV, ghatV, Bool.false_eq_true, if_false, if_true] have e1 : Δ lam (j, true) = signOf (lam j) := by simp [Δ] have e2 : Δ lam (j, false) = -signOf (lam j) := by simp [Δ] have e3 : Δ lam' (j, true) = signOf (lam' j) := by simp [Δ] have e4 : Δ lam' (j, false) = -signOf (lam' j) := by simp [Δ] simp only [e1, e2, e3, e4] rw [hcard] have hg₁ne : P.g₁ j ≠ 0 := ne_of_gt (P.hg₁0 j) have hm₀ne : P.m₀ j ≠ 0 := ne_of_gt (P.hm₀0 j) have hg₀ne : P.g₀ j ≠ 0 := ne_of_gt (P.hg₀0 j) have h1g₁ : (1 : ℝ) - P.g₁ j ≠ 0 := by have := P.hg₁1 j; intro hc; linarith have h1m₀ : (1 : ℝ) - P.m₀ j ≠ 0 := by have := P.hm₀1 j; intro hc; linarith have h1g₀ : (1 : ℝ) - P.g₀ j ≠ 0 := by have := P.hg₀1 j; intro hc; linarith rcases signOf_mem (lam j) with h | h <;> rcases signOf_mem (lam' j) with h' | h' <;> rw [h, h'] <;> · simp only [ΓV] field_simp ring rw [hsum] have hsplit : ∀ j : Fin K, (1 / (K : ℝ)) * (1 + P.ΓV j * (signOf (lam j) * signOf (lam' j))) = 1 / (K : ℝ) + P.ΓV j / (K : ℝ) * (signOf (lam j) * signOf (lam' j)) := by intro j; ring rw [Finset.sum_congr rfl (fun j _ => hsplit j), Finset.sum_add_distrib, Finset.sum_const, Finset.card_univ, Fintype.card_fin, nsmul_eq_mul] field_simp
2 supporting declarations (lemmas, instances)
  • ΓV_nonneg theorem — Γⱼ ≥ 0.
    j :
    Fin K
    0 ≤ P.ΓV j
    Proof (Lean source)
    theorem ΓV_nonneg (j : Fin K) : 0 ≤ P.ΓV j := by have h1 := P.hm₀0 j; have h2 := P.hm₀1 j; have h3 := P.hg₁0 j; have h4 := P.hg₁1 j unfold ΓV have t1 : 0 ≤ P.m₀ j * P.α ^ 2 / P.g₁ j := by positivity have t2 : 0 ≤ P.m₀ j * (P.α + P.β / P.g₁ j) ^ 2 / (1 - P.g₁ j) := by apply div_nonneg (by positivity); linarith have t3 : 0 ≤ P.m₀ j ^ 2 * P.β ^ 2 / (P.g₁ j ^ 2 * (1 - P.m₀ j)) := by apply div_nonneg (by positivity) have : 0 < 1 - P.m₀ j := by linarith positivity linarith
    Causalean.Estimation.MinimaxATE.VarConstr.ΓV_nonneg · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/ChiSqOverlap.lean:54
  • obsReal_pertV_eq theorem — Denominator-free value of the perturbed observed mass at the four (d, y).
    lam :
    Fin K → Bool
    x :
    Fin K × Bool
    d y :
    obsReal (P.mPertV lam) (P.gPertV lam) (x, d, y)
    = (card (Fin K × Bool) : ℝ)⁻¹ * (match d, y with | true, true => P.m₀ x.1 * (P.g₁ x.1 + P.α * Δ lam x) | true, false => P.m₀ x.1 * ((1 - P.g₁ x.1) - (P.α + P.β / P.g₁ x.1) * Δ lam x) | false, true => (1 - P.m₀ x.1 + P.m₀ x.1 * (P.β / P.g₁ x.1) * Δ lam x) * P.g₀ x.1 | false, false => (1 - P.m₀ x.1 + P.m₀ x.1 * (P.β / P.g₁ x.1) * Δ lam x) * (1 - P.g₀ x.1))
    Proof (Lean source)
    theorem obsReal_pertV_eq (lam : Fin K → Bool) (x : Fin K × Bool) (d y : Bool) : obsReal (P.mPertV lam) (P.gPertV lam) (x, d, y) = (card (Fin K × Bool) : ℝ)⁻¹ * (match d, y with | true, true => P.m₀ x.1 * (P.g₁ x.1 + P.α * Δ lam x) | true, false => P.m₀ x.1 * ((1 - P.g₁ x.1) - (P.α + P.β / P.g₁ x.1) * Δ lam x) | false, true => (1 - P.m₀ x.1 + P.m₀ x.1 * (P.β / P.g₁ x.1) * Δ lam x) * P.g₀ x.1 | false, false => (1 - P.m₀ x.1 + P.m₀ x.1 * (P.β / P.g₁ x.1) * Δ lam x) * (1 - P.g₀ x.1)) := by have hd : (1 - (P.β / P.g₁ x.1) * Δ lam x) ≠ 0 := (P.denomV_pos lam x).ne' have hg₁ne : P.g₁ x.1 ≠ 0 := ne_of_gt (P.hg₁0 x.1) have hden : P.g₁ x.1 - P.β * Δ lam x ≠ 0 := by rcases Δ_mem lam x with h | h <;> rw [h] <;> · have := P.hβg₁ x.1; have := P.hβ; intro hc; nlinarith unfold obsReal mPertV gPertV cases d <;> cases y <;> simp only [Bool.false_eq_true, if_false, if_true] <;> rw [mul_assoc] <;> refine congrArg _ ?_ <;> field_simp <;> ring
    Causalean.Estimation.MinimaxATE.VarConstr.obsReal_pertV_eq · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/ChiSqOverlap.lean:74
Gap 2 core · 4 supporting This file computes the exact average-treatment-effect gap for the cell-varying-center Rademacher construction. ★ ate_gPertV★ ate_gapV

Cell-Varying ATE Gap

This file computes the exact average-treatment-effect gap for the cell-varying-center Rademacher construction. Because each paired cell shares the same nuisance center, the two positions in a pair cancel the sign dependence and yield a nonnegative separation common to all sign vectors.

The main public lemmas are gPertV_true_eq, which rewrites the treated perturbed arm with a cleared denominator; ate_ghatV, the ATE of the cell-varying center; ate_gPertV, the exact ATE of each perturbed sign vector; ate_gapV, the closed form for ate (gPertV lam) - ate ghatV; and ate_gap_nonneg, the nonnegativity of that common gap.

theorem ate_gPertV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

Exact ATE of the perturbed construction. For any Rademacher sign vector lam, the average treatment effect of the perturbed outcome regression equals the average over pairs j of 2g₁ⱼ(g₁ⱼ²+αβ)/(g₁ⱼ²−β²) − 2g₀ⱼ, independent of lam.

Formal statement
lam :
Fin K → Bool
ate (P.gPertV lam)
= (card (Fin K × Bool) : ℝ)⁻¹ * ∑ j : Fin K, (2 * P.g₁ j * (P.g₁ j ^ 2 + P.α * P.β) / (P.g₁ j ^ 2 - P.β ^ 2) - 2 * P.g₀ j)
Proof (Lean source)
theorem ate_gPertV [NeZero K] (lam : Fin K → Bool) : ate (P.gPertV lam) = (card (Fin K × Bool) : ℝ)⁻¹ * ∑ j : Fin K, (2 * P.g₁ j * (P.g₁ j ^ 2 + P.α * P.β) / (P.g₁ j ^ 2 - P.β ^ 2) - 2 * P.g₀ j) := by rw [ate, Fintype.sum_prod_type] congr 1 refine Finset.sum_congr rfl fun j _ => ?_ rw [Fintype.sum_bool] have := P.perPairV lam j linarith [this]
Causalean.Estimation.MinimaxATE.VarConstr.ate_gPertV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:99 · uses VarConstr , gPertV , ate
theorem ate_gapV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

For any Rademacher sign vector lam, the gap between the perturbed construction's ATE and the null estimate's ATE equals 2β(α+β)/(2K) times the sum over pairs j of g₁ⱼ/(g₁ⱼ² − β²).

Formal statement
lam :
Fin K → Bool
ate (P.gPertV lam) - ate (P.ghatV (K := K))
= (card (Fin K × Bool) : ℝ)⁻¹ * (2 * P.β * (P.α + P.β)) * ∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2)
Proof (Lean source)
theorem ate_gapV [NeZero K] (lam : Fin K → Bool) : ate (P.gPertV lam) - ate (P.ghatV (K := K)) = (card (Fin K × Bool) : ℝ)⁻¹ * (2 * P.β * (P.α + P.β)) * ∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2) := by rw [P.ate_gPertV lam, P.ate_ghatV, ← mul_sub, ← Finset.sum_sub_distrib, mul_assoc] congr 1 rw [Finset.mul_sum] refine Finset.sum_congr rfl fun j _ => ?_ have hg₁ne : P.g₁ j ≠ 0 := ne_of_gt (P.hg₁0 j) have d3 : P.g₁ j ^ 2 - P.β ^ 2 ≠ 0 := ne_of_gt (P.g1sq_sub_betasq_pos j) field_simp ring
Causalean.Estimation.MinimaxATE.VarConstr.ate_gapV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:114 · uses VarConstr , gPertV , ghatV , ate
4 supporting declarations (lemmas, instances)
  • g1sq_sub_betasq_pos theorem — g₁ⱼ² − β² > 0 since 0 ≤ β < g₁ⱼ.
    j :
    Fin K
    0 < P.g₁ j ^ 2 - P.β ^ 2
    Proof (Lean source)
    theorem g1sq_sub_betasq_pos (j : Fin K) : 0 < P.g₁ j ^ 2 - P.β ^ 2 := by have := P.hβg₁ j; have := P.hβ; have := P.hg₁0 j; nlinarith
    Causalean.Estimation.MinimaxATE.VarConstr.g1sq_sub_betasq_pos · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:46
  • gPertV_true_eq theorem — Cleared treated arm. gλ(1,x) = (g₁ x.1² + α·g₁ x.1·Δ)/(g₁ x.1 − β·Δ).
    lam :
    Fin K → Bool
    x :
    Fin K × Bool
    P.gPertV lam true x
    = (P.g₁ x.1 ^ 2 + P.α * P.g₁ x.1 * Δ lam x) / (P.g₁ x.1 - P.β * Δ lam x)
    Proof (Lean source)
    theorem gPertV_true_eq (lam : Fin K → Bool) (x : Fin K × Bool) : P.gPertV lam true x = (P.g₁ x.1 ^ 2 + P.α * P.g₁ x.1 * Δ lam x) / (P.g₁ x.1 - P.β * Δ lam x) := by have hg₁ne : P.g₁ x.1 ≠ 0 := ne_of_gt (P.hg₁0 x.1) have hden0 := P.denomV_pos lam x have hden : P.g₁ x.1 - P.β * Δ lam x ≠ 0 := by rcases Δ_mem lam x with h | h <;> rw [h] <;> · have := P.hβg₁ x.1; have := P.hβ; intro hc; nlinarith simp only [gPertV, if_true] rw [div_eq_div_iff hden0.ne' hden] field_simp
    Causalean.Estimation.MinimaxATE.VarConstr.gPertV_true_eq · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:50
  • ate_ghatV theorem — The null estimate ĝ has ATE (1/2K) Σⱼ 2(g₁ⱼ − g₀ⱼ).
    ate (P.ghatV (K := K))
    = (card (Fin K × Bool) : ℝ)⁻¹ * ∑ j : Fin K, 2 * (P.g₁ j - P.g₀ j)
    Proof (Lean source)
    theorem ate_ghatV : ate (P.ghatV (K := K)) = (card (Fin K × Bool) : ℝ)⁻¹ * ∑ j : Fin K, 2 * (P.g₁ j - P.g₀ j) := by rw [ate] have hpt : ∀ x : Fin K × Bool, P.ghatV true x - P.ghatV false x = P.g₁ x.1 - P.g₀ x.1 := by intro x; simp [ghatV] rw [Finset.sum_congr rfl (fun x _ => hpt x), Fintype.sum_prod_type] congr 1 refine Finset.sum_congr rfl fun j _ => ?_ rw [Fintype.sum_bool] change (P.g₁ j - P.g₀ j) + (P.g₁ j - P.g₀ j) = 2 * (P.g₁ j - P.g₀ j) ring
    Causalean.Estimation.MinimaxATE.VarConstr.ate_ghatV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:63
  • ate_gap_nonneg theorem — The ATE gap is nonnegative.
    lam :
    Fin K → Bool
    0 ≤ ate (P.gPertV lam) - ate (P.ghatV (K := K))
    Proof (Lean source)
    theorem ate_gap_nonneg [NeZero K] (lam : Fin K → Bool) : 0 ≤ ate (P.gPertV lam) - ate (P.ghatV (K := K)) := by rw [P.ate_gapV lam] have hcard : (0 : ℝ) ≤ (card (Fin K × Bool) : ℝ)⁻¹ := by positivity have hβ := P.hβ; have hα := P.hα have hsum : 0 ≤ ∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2) := by refine sum_nonneg fun j _ => ?_ exact div_nonneg (P.hg₁0 j).le (P.g1sq_sub_betasq_pos j).le have h2 : (0 : ℝ) ≤ 2 * P.β * (P.α + P.β) := by positivity positivity
    Causalean.Estimation.MinimaxATE.VarConstr.ate_gap_nonneg · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Gap.lean:130
Ingster 1 core · 0 supporting This file proves the Ingster chi-squared average bound with coordinate-specific nonnegative weights. ★ ingster_bound_general

Non-Uniform Ingster Bound

This file proves the Ingster chi-squared average bound with coordinate-specific nonnegative weights. The result supports the cell-varying lower-bound constructions, where each covariate pair contributes its own overlap coefficient.

The public theorem ingster_bound_general bounds the doubly averaged Rademacher expression (1 + sum_j d j * signOf (lam j) * signOf (lam' j))^n by 2, assuming the weights are nonnegative, have total mass at most 1, and satisfy the regularity budget (n^2 / 2) * sum_j (d j)^2 <= log 2. This is the non-uniform chi-squared step used after chiSqOverlap_eqV rewrites the cell-varying overlap.

theorem ingster_bound_general reviewed
Causalean.Estimation.MinimaxATE

For nonnegative per-coordinate weights d j summing to at most 1 satisfying the regularity budget (n²/2)·Σⱼ (d j)² ≤ log 2, the uniform double average, over pairs of Rademacher sign vectors lam, lam' : Fin K → Bool, of (1 + Σⱼ d j·signOf(lam j)·signOf(lam' j))^n is at most 2.

Formal statement
K n :
Fin K → ℝ
hd0 :
∀ j, 0 ≤ d j
hdsum :
∑ j, d j ≤ 1
hreg :
(n : ℝ) ^ 2 / 2 * ∑ j, (d j) ^ 2 ≤ log 2
∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, ((2 : ℝ) ^ K)⁻¹ * ((2 : ℝ) ^ K)⁻¹ * (1 + ∑ j, d j * (signOf (lam j) * signOf (lam' j))) ^ n
≤ 2
Proof (Lean source)
theorem ingster_bound_general (K n : ℕ) [NeZero K] {d : Fin K → ℝ} (hd0 : ∀ j, 0 ≤ d j) (hdsum : ∑ j, d j ≤ 1) (hreg : (n : ℝ) ^ 2 / 2 * ∑ j, (d j) ^ 2 ≤ log 2) : ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, ((2 : ℝ) ^ K)⁻¹ * ((2 : ℝ) ^ K)⁻¹ * (1 + ∑ j, d j * (signOf (lam j) * signOf (lam' j))) ^ n ≤ 2 := by -- abbreviations set w : ℝ := ((2 : ℝ) ^ K)⁻¹ with hw_def have hw0 : 0 ≤ w := by rw [hw_def]; positivity -- Per-term: `(1 + S)^n ≤ exp (n S)` where `S = ∑ j, d j*(signOf (lam j)*signOf (lam' j))`. have step1 : ∀ lam lam' : Fin K → Bool, (1 + ∑ j, d j * (signOf (lam j) * signOf (lam' j))) ^ n ≤ exp ((n : ℝ) * ∑ j, d j * (signOf (lam j) * signOf (lam' j))) := by intro lam lam' set S : ℝ := ∑ j, d j * (signOf (lam j) * signOf (lam' j)) with hS_def -- Each summand `d j * (signOf (lam j)*signOf (lam' j)) ≥ d j * (-1) = -(d j)`. have hSlow : -(1 : ℝ) ≤ S := by rw [hS_def] have hterm : ∀ j ∈ univ, -(d j) ≤ d j * (signOf (lam j) * signOf (lam' j)) := by intro j _ have hmem : -1 ≤ signOf (lam j) * signOf (lam' j) := by rcases signOf_mem (lam j) with h1 | h1 <;> rcases signOf_mem (lam' j) with h2 | h2 <;> simp [h1, h2] have := mul_le_mul_of_nonneg_left hmem (hd0 j) simpa using this calc -(1 : ℝ) ≤ -(∑ j, d j) := by linarith _ = ∑ j, -(d j) := by rw [Finset.sum_neg_distrib] _ ≤ ∑ j, d j * (signOf (lam j) * signOf (lam' j)) := Finset.sum_le_sum hterm have h0 : (0 : ℝ) ≤ 1 + S := by linarith -- `1 + S ≤ exp (S)` have hexp : 1 + S ≤ exp S := by have := Real.add_one_le_exp S linarith calc (1 + S) ^ n ≤ (exp S) ^ n := pow_le_pow_left₀ h0 hexp n _ = exp ((n : ℝ) * S) := by rw [Real.exp_nat_mul] -- Step 2: bound the whole double sum by the exp double sum. have step2 : ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, w * w * (1 + ∑ j, d j * (signOf (lam j) * signOf (lam' j))) ^ n ≤ ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, w * w * exp ((n : ℝ) * ∑ j, d j * (signOf (lam j) * signOf (lam' j))) := by apply Finset.sum_le_sum intro lam _ apply Finset.sum_le_sum intro lam' _ apply mul_le_mul_of_nonneg_left (step1 lam lam') positivity -- Step 3: the exp double sum equals `∏ j, cosh (n * d j)`. have step3 : ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, w * w * exp ((n : ℝ) * ∑ j, d j * (signOf (lam j) * signOf (lam' j))) = ∏ j, Real.cosh ((n : ℝ) * d j) := by -- Define the per-coordinate factor. set h : Fin K → Bool × Bool → ℝ := fun j p => (1 / 4 : ℝ) * exp ((n : ℝ) * d j * (signOf p.1 * signOf p.2)) with hh_def -- The single-coordinate sum is cosh. have hsum_h : ∀ j, (∑ p : Bool × Bool, h j p) = Real.cosh ((n : ℝ) * d j) := by intro j rw [Fintype.sum_prod_type] simp only [hh_def, Fintype.sum_bool, signOf_true, signOf_false] rw [show (n : ℝ) * d j * (1 * 1) = (n : ℝ) * d j by ring, show (n : ℝ) * d j * (1 * -1) = -((n : ℝ) * d j) by ring, show (n : ℝ) * d j * (-1 * 1) = -((n : ℝ) * d j) by ring, show (n : ℝ) * d j * (-1 * -1) = (n : ℝ) * d j by ring] rw [Real.cosh_eq] ring -- Rewrite the RHS product as a product of single-coordinate sums. have hprod_eq : ∏ j, Real.cosh ((n : ℝ) * d j) = ∏ j, ∑ p : Bool × Bool, h j p := by apply Finset.prod_congr rfl intro j _ rw [hsum_h j] rw [hprod_eq] -- `∏ j, ∑ p, h j p = ∑ ρ : Fin K → Bool×Bool, ∏ j, h j (ρ j)` (distribute product of sums). rw [Finset.prod_univ_sum, Fintype.piFinset_univ] -- LHS: convert the double sum into a sum over the product, then reindex by the equiv. rw [← Fintype.sum_prod_type (f := fun p : (Fin K → Bool) × (Fin K → Bool) => w * w * exp ((n : ℝ) * ∑ j, d j * (signOf (p.1 j) * signOf (p.2 j))))] rw [← Equiv.sum_comp (Equiv.arrowProdEquivProdArrow (Fin K) (fun _ => Bool) (fun _ => Bool)).symm] apply Finset.sum_congr rfl intro ρ _ -- For a fixed `ρ : Fin K → Bool × Bool`. simp only [Equiv.arrowProdEquivProdArrow_symm_apply] -- Goal: w*w*exp((n)*∑ j, d j*(signOf (ρ j).1 * signOf (ρ j).2)) = ∏ j, h j (ρ j) rw [hh_def] -- ∏ j, (1/4)*exp(n*d j*(signOf (ρ j).1 * signOf (ρ j).2)) rw [Finset.prod_mul_distrib] -- = (∏ j, 1/4) * (∏ j, exp(...)) rw [← Real.exp_sum] rw [Finset.prod_const, Finset.card_univ, Fintype.card_fin] -- w*w = (1/4)^K have hww : w * w = (1 / 4 : ℝ) ^ K := by rw [hw_def] rw [← mul_inv] rw [show (2 : ℝ) ^ K * 2 ^ K = 4 ^ K by rw [← mul_pow]; norm_num] rw [show (1 / 4 : ℝ) = (4 : ℝ)⁻¹ by norm_num] rw [inv_pow] rw [hww] -- now goal: (1/4)^K * exp((n)*∑ j ...) = (1/4)^K * exp(∑ j, n*d j*(...)) congr 1 congr 1 rw [Finset.mul_sum] apply Finset.sum_congr rfl intro j _ ring -- Step 4: `∏ j, cosh (n * d j) ≤ 2`. have step4 : ∏ j, Real.cosh ((n : ℝ) * d j) ≤ 2 := by calc ∏ j, Real.cosh ((n : ℝ) * d j) ≤ ∏ j, exp (((n : ℝ) * d j) ^ 2 / 2) := by apply Finset.prod_le_prod · intro j _; exact le_of_lt (Real.cosh_pos _) · intro j _; exact Real.cosh_le_exp_half_sq _ _ = exp (∑ j, ((n : ℝ) * d j) ^ 2 / 2) := by rw [← Real.exp_sum] _ ≤ exp (log 2) := by apply Real.exp_le_exp.mpr have hsum_eq : (∑ j, ((n : ℝ) * d j) ^ 2 / 2) = (n : ℝ) ^ 2 / 2 * ∑ j, (d j) ^ 2 := by rw [Finset.mul_sum] apply Finset.sum_congr rfl intro j _ ring rw [hsum_eq] exact hreg _ = 2 := by rw [Real.exp_log]; norm_num -- Chain everything. The LHS of the goal matches step2's LHS. calc ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, w * w * (1 + ∑ j, d j * (signOf (lam j) * signOf (lam' j))) ^ n ≤ ∑ lam : Fin K → Bool, ∑ lam' : Fin K → Bool, w * w * exp ((n : ℝ) * ∑ j, d j * (signOf (lam j) * signOf (lam' j))) := step2 _ = ∏ j, Real.cosh ((n : ℝ) * d j) := step3 _ ≤ 2 := step4
Causalean.Estimation.MinimaxATE.ingster_bound_general · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Ingster.lean:42 · uses signOf
Lower­Bound 4 core · 11 supporting This file assembles the cell-varying-center construction into the structure-agnostic ATE minimax lower bound. ★ minimax_lower_bound_var

Cell-Varying Lower Bound

This file assembles the cell-varying-center construction into the structure-agnostic ATE minimax lower bound. It combines per-pair class membership, ATE-gap, and chi-squared-overlap arguments with a non-uniform Ingster bound to handle nuisance centers that vary across paired cells.

It defines the null and alternative sample laws QfalseV, QpertV, and QtrueV, proves their probability-measure and point-mass facts, computes the mixture second moment in one_add_chiSqDiv_QtrueV_QfalseV, and derives the chi-squared and total-variation indistinguishability bounds chiSqDiv_QtrueV_QfalseV_le_one and tvDist_QfalseV_QtrueV_le_half. The headline theorem minimax_lower_bound_var packages these ingredients into a TwoPointWitness, proving a 1 / 4 minimax miss lower bound at half the cell-varying ATE gap.

def QfalseV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The null n-sample law P̂^⊗n.

Definition (Lean source)
noncomputable def QfalseV (P : VarConstr K) (n : ℕ) [NeZero K] : Measure (Fin n → Obs (Fin K × Bool)) := productLaw (P.validDGP_hatV (K := K)) n
Causalean.Estimation.MinimaxATE.VarConstr.QfalseV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/LowerBound.lean:65 · uses Obs , VarConstr
def QpertV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The perturbed n-sample law Qλ^⊗n.

Definition (Lean source)
noncomputable def QpertV (P : VarConstr K) (n : ℕ) [NeZero K] (lam : Fin K → Bool) : Measure (Fin n → Obs (Fin K × Bool)) := productLaw (P.validDGP_pertV lam) n
Causalean.Estimation.MinimaxATE.VarConstr.QpertV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/LowerBound.lean:70 · uses Obs , VarConstr
def QtrueV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

The alternative n-sample law: the uniform Rademacher mixture of the perturbed laws.

Definition (Lean source)
noncomputable def QtrueV (P : VarConstr K) (n : ℕ) [NeZero K] : Measure (Fin n → Obs (Fin K × Bool)) := mixture (signWeight K) (fun lam => QpertV P n lam)
Causalean.Estimation.MinimaxATE.VarConstr.QtrueV · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/LowerBound.lean:75 · uses Obs , VarConstr
theorem minimax_lower_bound_var reviewed
Causalean.Estimation.MinimaxATE.VarConstr

Structure-agnostic minimax lower bound (cell-varying center). Around a nuisance center P that varies across pairs (constant within each pair), suppose every pair's propensity-bump budget (m₀ⱼ·(β/g₁ⱼ))² ≤ εm holds and every pair's treated-arm budget g₁ⱼ²(α+β)²/(g₁ⱼ−β)² ≤ εg holds for nonnegative error tolerances εg, εm, and the per-pair overlap coefficients satisfy the total-mass bound Σⱼ Γⱼ/K ≤ 1 and the sample-size regularity budget (n²/2)·Σⱼ (Γⱼ/K)² ≤ log 2. Then for any measurable estimator of the average treatment effect, the worst-case-over-class probability that it misses the true ATE by half the cell-varying gap ate gλ − ate ĝ is at least 1/4.

Formal statement
P :
n :
εg εm :
hm :
∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm
hg :
∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg
hεg :
0 ≤ εg
hεm :
0 ≤ εm
hΓsum :
∑ j, P.ΓV j / (K : ℝ) ≤ 1
hreg :
(n : ℝ) ^ 2 / 2 * ∑ j, (P.ΓV j / (K : ℝ)) ^ 2 ≤ log 2
est :
(Fin n → Obs (Fin K × Bool)) → ℝ
hest :
1 / 4
minimaxMiss P.mhatV P.ghatV εg εm n est ((card (Fin K × Bool) : ℝ)⁻¹ * (2 * P.β * (P.α + P.β)) * (∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2)) / 2)
Proof (Lean source)
theorem minimax_lower_bound_var (P : VarConstr K) {n : ℕ} [NeZero K] {εg εm : ℝ} (hm : ∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm) (hg : ∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg) (hεg : 0 ≤ εg) (hεm : 0 ≤ εm) (hΓsum : ∑ j, P.ΓV j / (K : ℝ) ≤ 1) (hreg : (n : ℝ) ^ 2 / 2 * ∑ j, (P.ΓV j / (K : ℝ)) ^ 2 ≤ log 2) {est : (Fin n → Obs (Fin K × Bool)) → ℝ} (hest : Measurable est) : 1 / 4 ≤ minimaxMiss P.mhatV P.ghatV εg εm n est ((card (Fin K × Bool) : ℝ)⁻¹ * (2 * P.β * (P.α + P.β)) * (∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2)) / 2) := by set gap := (card (Fin K × Bool) : ℝ)⁻¹ * (2 * P.β * (P.α + P.β)) * ∑ j : Fin K, P.g₁ j / (P.g₁ j ^ 2 - P.β ^ 2) with hgap have hgap0 : 0 ≤ gap := by have h := P.ate_gap_nonneg (fun _ => true) rwa [P.ate_gapV (fun _ => true)] at h set s := gap / 2 with hs set θ0 := ate (P.ghatV (K := K)) with hθ0 -- the two-point witness let W : TwoPointWitness (Fin K × Bool) n P.mhatV P.ghatV εg εm := { s := s c := 1 / 2 Q := fun j => cond j (QtrueV P n) (QfalseV P n) prob := by intro j; cases j · exact QfalseV_isProb P n · exact QtrueV_isProb P n θ := fun j => cond j (θ0 + gap) θ0 sep := by change 2 * s ≤ |(θ0 + gap) - θ0| rw [add_sub_cancel_left, abs_of_nonneg hgap0, hs]; linarith tvBound := by simpa using P.tvDist_QfalseV_QtrueV_le_half (n := n) hΓsum hreg dominated := by intro est' j cases j · -- null branch change (QfalseV P n).real {x | s ≤ |est' x - θ0|} ≤ minimaxMiss P.mhatV P.ghatV εg εm n est' s have hb := P.realV_le_minimaxMiss (n := n) (inClass_nullV P hεg hεm) est' s rw [hθ0] exact hb · -- mixture branch change (QtrueV P n).real {x | s ≤ |est' x - (θ0 + gap)|} ≤ minimaxMiss P.mhatV P.ghatV εg εm n est' s haveI : ∀ lam : Fin K → Bool, IsProbabilityMeasure (QpertV P n lam) := fun lam => QpertV_isProb P n lam unfold QtrueV refine mixtureReal_le (signWeight K) (signWeight_sum K) (fun lam => QpertV P n lam) _ _ ?_ intro lam have hb := P.realV_le_minimaxMiss (n := n) (P.inClassV hm hg hεg lam) est' s have hkey : ate (P.gPertV lam) = θ0 + gap := by have := P.ate_gapV lam rw [hθ0, hgap]; linarith [this] rw [hkey] at hb exact hb } exact twoPointWitness_quarter W (le_refl _) hest
11 supporting declarations (lemmas, instances)
Membership 1 core · 4 supporting This file proves that the cell-varying perturbation family for the structure-agnostic average treatment effect lower bound belongs to the finite nuisance class whenever the per-cell propensity and outcome-regression erro ★ inClassV

Cell-Varying Class Membership

This file proves that the cell-varying perturbation family for the structure-agnostic average treatment effect lower bound belongs to the finite nuisance class whenever the per-cell propensity and outcome-regression error budgets hold. It supplies the membership estimates used to assemble the first cell-varying minimax lower bound.

The lemmas l2sq_mPertV_le, l2sq_gPertV_false, gPertV_true_sub, and l2sq_gPertV_true_le bound the propensity and outcome-arm L²(P_X) errors. The capstone inClassV combines those estimates with validDGP_pertV to show every perturbed sign vector lies in InClass around the cell-varying center.

theorem inClassV reviewed
Causalean.Estimation.MinimaxATE.VarConstr

Class membership. Suppose every pair's propensity-bump budget (m₀ⱼ·(β/g₁ⱼ))² ≤ εm holds and every pair's treated-arm budget g₁ⱼ²(α+β)²/(g₁ⱼ−β)² ≤ εg holds for a nonnegative outcome-error tolerance εg. Then the perturbed data-generating process (mλ, gλ) indexed by a Rademacher sign vector lam lies in the structure-agnostic nuisance class ℱ(εg, εm) around the cell-varying center (m̂, ĝ).

Formal statement
εg εm :
hm :
∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm
hg :
∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg
hεg :
0 ≤ εg
lam :
Fin K → Bool
InClass (P.mhatV (K := K)) P.ghatV εg εm (P.mPertV lam) (P.gPertV lam)
Proof (Lean source)
theorem inClassV [NeZero K] {εg εm : ℝ} (hm : ∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm) (hg : ∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg) (hεg : 0 ≤ εg) (lam : Fin K → Bool) : InClass (P.mhatV (K := K)) P.ghatV εg εm (P.mPertV lam) (P.gPertV lam) := by refine ⟨P.validDGP_pertV lam, ?_, ?_⟩ · intro d cases d with | false => rw [P.l2sq_gPertV_false lam]; exact hεg | true => exact P.l2sq_gPertV_true_le hg lam · exact P.l2sq_mPertV_le hm lam
4 supporting declarations (lemmas, instances)
  • l2sq_mPertV_le theorem — The propensity perturbation's squared L² error is ≤ εm whenever every pair's bump magnitude (m₀ⱼ·(β/g₁ⱼ))² is ≤ εm.
    εm :
    hm :
    ∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm
    lam :
    Fin K → Bool
    l2sq (P.mPertV lam) (P.mhatV (K := K)) ≤ εm
    Proof (Lean source)
    theorem l2sq_mPertV_le [NeZero K] {εm : ℝ} (hm : ∀ j, (P.m₀ j * (P.β / P.g₁ j)) ^ 2 ≤ εm) (lam : Fin K → Bool) : l2sq (P.mPertV lam) (P.mhatV (K := K)) ≤ εm := by set C := Fin K × Bool have hC : (Fintype.card C : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr Fintype.card_ne_zero have hterm : ∀ x : C, (P.mPertV lam x - P.mhatV x) ^ 2 ≤ εm := by intro x have hdiff : P.mPertV lam x - P.mhatV x = -(P.m₀ x.1 * (P.β / P.g₁ x.1)) * Δ lam x := by simp only [mPertV, mhatV]; ring rw [hdiff, mul_pow, neg_sq, Δ_sq lam x, mul_one] exact hm x.1 rw [l2sq] have hsum : ∑ x : C, (P.mPertV lam x - P.mhatV x) ^ 2 ≤ ∑ _x : C, εm := Finset.sum_le_sum (fun x _ => hterm x) rw [Finset.sum_const, Finset.card_univ, nsmul_eq_mul] at hsum calc (Fintype.card C : ℝ)⁻¹ * ∑ x : C, (P.mPertV lam x - P.mhatV x) ^ 2 ≤ (Fintype.card C : ℝ)⁻¹ * ((Fintype.card C : ℝ) * εm) := by apply mul_le_mul_of_nonneg_left hsum; positivity _ = εm := by field_simp
    Causalean.Estimation.MinimaxATE.VarConstr.l2sq_mPertV_le · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Membership.lean:46
  • l2sq_gPertV_false theorem — The control outcome arm is unchanged, so its L² error is 0.
    lam :
    Fin K → Bool
    l2sq (P.gPertV lam false) (P.ghatV false) = 0
    Proof (Lean source)
    theorem l2sq_gPertV_false (lam : Fin K → Bool) : l2sq (P.gPertV lam false) (P.ghatV false) = 0 := by have h : P.gPertV lam false = P.ghatV false := by funext x; simp only [gPertV, ghatV, Bool.false_eq_true, if_false] rw [h, l2sq_self]
    Causalean.Estimation.MinimaxATE.VarConstr.l2sq_gPertV_false · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Membership.lean:68
  • gPertV_true_sub theorem — The treated arm's pointwise deviation from ĝ(1,x) = g₁ x.1 is g₁ x.1·(α+β)·Δ/(g₁ x.1 − β·Δ).
    lam :
    Fin K → Bool
    x :
    Fin K × Bool
    P.gPertV lam true x - P.g₁ x.1
    = P.g₁ x.1 * (P.α + P.β) * Δ lam x / (P.g₁ x.1 - P.β * Δ lam x)
    Proof (Lean source)
    theorem gPertV_true_sub (lam : Fin K → Bool) (x : Fin K × Bool) : P.gPertV lam true x - P.g₁ x.1 = P.g₁ x.1 * (P.α + P.β) * Δ lam x / (P.g₁ x.1 - P.β * Δ lam x) := by have hden : P.g₁ x.1 - P.β * Δ lam x ≠ 0 := by rcases Δ_mem lam x with h | h <;> rw [h] <;> · have := P.hβg₁ x.1; have := P.hβ; intro hc; nlinarith rw [gPertV_true_eq, eq_div_iff hden, sub_mul, div_mul_cancel₀ _ hden] ring
    Causalean.Estimation.MinimaxATE.VarConstr.gPertV_true_sub · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Membership.lean:75
  • l2sq_gPertV_true_le theorem — The treated arm's squared L² error is ≤ εg whenever every pair's bound g₁ⱼ²(α+β)²/(g₁ⱼ − β)² is ≤ εg.
    εg :
    hg :
    ∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg
    lam :
    Fin K → Bool
    l2sq (P.gPertV lam true) (P.ghatV true) ≤ εg
    Proof (Lean source)
    theorem l2sq_gPertV_true_le [NeZero K] {εg : ℝ} (hg : ∀ j, P.g₁ j ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ j - P.β) ^ 2 ≤ εg) (lam : Fin K → Bool) : l2sq (P.gPertV lam true) (P.ghatV true) ≤ εg := by set C := Fin K × Bool have hC : (Fintype.card C : ℝ) ≠ 0 := Nat.cast_ne_zero.mpr Fintype.card_ne_zero have hterm : ∀ x : C, (P.gPertV lam true x - P.ghatV true x) ^ 2 ≤ εg := by intro x have hghat : P.ghatV true x = P.g₁ x.1 := by simp [ghatV] have hden : (0 : ℝ) < P.g₁ x.1 - P.β := by have := P.hβg₁ x.1; linarith have hden2 : (0 : ℝ) < (P.g₁ x.1 - P.β) ^ 2 := by positivity have hdenΔ : (0 : ℝ) < (P.g₁ x.1 - P.β * Δ lam x) ^ 2 := by have hdne : P.g₁ x.1 - P.β * Δ lam x ≠ 0 := by rcases Δ_mem lam x with h | h <;> rw [h] <;> · have := P.hβg₁ x.1; have := P.hβ; intro hc; nlinarith positivity rw [hghat, P.gPertV_true_sub lam x] have hsq : (P.g₁ x.1 * (P.α + P.β) * Δ lam x / (P.g₁ x.1 - P.β * Δ lam x)) ^ 2 = P.g₁ x.1 ^ 2 * (P.α + P.β) ^ 2 / (P.g₁ x.1 - P.β * Δ lam x) ^ 2 := by rw [div_pow, mul_pow, mul_pow, Δ_sq, mul_one] rw [hsq] have hcmp : (P.g₁ x.1 - P.β) ^ 2 ≤ (P.g₁ x.1 - P.β * Δ lam x) ^ 2 := by have hβ := P.hβ have hβg₁ := P.hβg₁ x.1 have hg₁0 := P.hg₁0 x.1 rcases Δ_mem lam x with h | h · rw [h]; nlinarith · rw [h]; nlinarith refine le_trans ?_ (hg x.1) apply div_le_div_of_nonneg_left (by positivity) hden2 hcmp rw [l2sq] have hsum : ∑ x : C, (P.gPertV lam true x - P.ghatV true x) ^ 2 ≤ ∑ _x : C, εg := Finset.sum_le_sum (fun x _ => hterm x) rw [Finset.sum_const, Finset.card_univ, nsmul_eq_mul] at hsum calc (Fintype.card C : ℝ)⁻¹ * ∑ x : C, (P.gPertV lam true x - P.ghatV true x) ^ 2 ≤ (Fintype.card C : ℝ)⁻¹ * ((Fintype.card C : ℝ) * εg) := by apply mul_le_mul_of_nonneg_left hsum; positivity _ = εg := by field_simp
    Causalean.Estimation.MinimaxATE.VarConstr.l2sq_gPertV_true_le · Causalean/Estimation/MinimaxATE/VaryingCenterCase1/Membership.lean:86