PO.ID.Exact.DTR
Identification for dynamic treatment regimes over a countable treatment alphabet: sequential exchangeability, universal singleton overlap, and the g-formula.
Setup 20 core · 7 supporting This file provides the general finite-horizon potential-outcome setup for prescribed longitudinal treatment paths. ★ POLongitudinalPathSystem★ regimeUpTo_target_eq
Fixed Longitudinal Treatment Path Setup
This file provides the general finite-horizon potential-outcome setup for prescribed longitudinal treatment paths. It defines stagewise states, treatments, fixed-path interventions, sequential assumptions, and observable adjusted functionals used by treatment-path identification theorems.
Each intervention is fixed by dbar : Fin n → δ before histories are observed.
No action can depend on an observed history, so this API does not represent
adaptive treatment policies despite the historical DTR directory name and
source-section label.
The setup allows heterogeneous state types across stages and a common treatment value space across stages. The identification assumption bundle restricts that treatment alphabet to a countable measurable space: its universal singleton overlap condition cannot hold at a positive horizon for an uncountable alphabet. Sequential exchangeability and overlap are stated for each treatment sequence and stage.
The main public objects are POLongitudinalPathSystem, treatment-sequence regimes
regimeUpTo and regime, counterfactuals Y_of and S_of, history bundles,
the assumption bundle Assumptions, the backward-recursive regression
innerReg, and the estimands treatmentPathMean and adjustedTreatmentPathMean.
A fixed longitudinal treatment-path system packages stage-indexed state variables, treatment nodes, and a terminal outcome. It records common treatment-space identifications, a real-valued outcome identification, pairwise distinct state nodes, pairwise distinct treatment nodes, separation of states from treatments, separation of states from the outcome, and separation of treatments from the outcome.
Definition (Lean source)
The treatment variable at a decision stage in a longitudinal-path system uses the selected stage to represent its treatment node on the common treatment alphabet.
Definition (Lean source)
The terminal-outcome variable in a longitudinal-path system represents the terminal response on the real line.
Definition (Lean source)
The intervention target path for a longitudinal-path system contains no treatment nodes at cutoff zero and at each positive cutoff adds the current treatment node when that stage exists, so its targets are precisely the treatments assigned before the cutoff.
Definition (Lean source)
The certified partial regime for a longitudinal-path system, a prescribed treatment path, and a requested cutoff starts with the empty intervention at cutoff zero and at each positive cutoff adds the current treatment while certifying the resulting target set.
Definition (Lean source)
The partial treatment regime for a longitudinal-path system follows the prescribed treatment path through a selected cutoff, whose validity within the horizon ensures that exactly the earlier treatments are intervened on.
Definition (Lean source)
For a longitudinal-path system, a prescribed treatment path, a cutoff, and proof that it lies within the horizon, the partial regime's target equals the standalone target set.
Formal statement
Proof (Lean source)
The full treatment regime for a longitudinal-path system uses a prescribed treatment path to fix every stage's treatment to its corresponding path value.
The regime-specific terminal outcome in a longitudinal-path system uses a prescribed treatment path to record each unit's terminal response under the full intervention following that path.
Definition (Lean source)
The regime-specific state at a decision stage in a longitudinal-path system uses a prescribed treatment path and the selected stage to record the state reached after intervening on all earlier treatments along that path.
The factual treatment at a stage in a longitudinal-path system uses the selected stage to record each unit's observed treatment there.
Definition (Lean source)
The factual terminal outcome in a longitudinal-path system records each unit's observed response at the end of follow-up.
Definition (Lean source)
The factual state at a stage in a longitudinal-path system uses the selected stage to record each unit's observed state there.
Definition (Lean source)
The joint treatment-path agreement process for a longitudinal-path system and a prescribed treatment path equals one at cutoff zero and at each positive cutoff multiplies the prior value by agreement with the current treatment when that stage exists.
Definition (Lean source)
The observed history available at a decision point in a longitudinal-path system uses the selected stage cutoff to contain only the initial state at cutoff zero and recursively add each prior treatment and the next state at a positive cutoff.
Definition (Lean source)
The counterfactual outcome bundle for a longitudinal-path system uses a prescribed treatment path to package its terminal potential outcome as the single target of sequential exchangeability.
Definition (Lean source)
Sequential backdoor identification for a longitudinal-path system requires potential-outcome consistency for the ambient system; per-sequence sequential exchangeability, i.e. at each stage the treatment is conditionally independent of the counterfactual terminal outcome under the treatment sequence given the history observed up to that stage; pointwise positivity of the stagewise propensity given the same history, almost surely; and integrability of the counterfactual terminal outcome under every treatment sequence together with integrability of the factual terminal outcome.
Definition (Lean source)
Per-sequence sequential exchangeability.
Pointwise (a.s.) positivity of stagewise propensities.
Note the reach of this field: positivity is demanded for EVERY treatment sequence, so the
conditional law of each stage's treatment must have an atom at every point of δ. A probability
measure has at most countably many atoms, so at a positive horizon this is satisfiable only for
a countable alphabet — a continuous treatment needs a density-based positivity condition
(generalized propensity score) rather than this pointwise one. The restriction is stated here
rather than imposed as a Countable δ field, which would add a proof obligation to every
downstream result without changing what is provable.
The backward adjusted-regression process for a longitudinal-path system and a prescribed treatment path uses the final-history conditional-expectation ratio when the horizon is positive, and zero otherwise, then the analogous recursively defined earlier-history ratio when the indicated stage exists, and the preceding value otherwise.
Definition (Lean source)
The longitudinal-path mean outcome for a longitudinal-path system uses a prescribed treatment path and averages the terminal potential outcome under that path over the target population.
Definition (Lean source)
The observable adjusted longitudinal-path functional for a longitudinal-path system and a prescribed treatment path integrates the outermost backward regression when a decision stage exists and returns zero at a zero horizon.
Definition (Lean source)
7 supporting declarations (lemmas, instances)
-
regimeTarget_mem_ifflemma — The regime target of a fixed-treatment-path system contains a variable at a cutoff exactly when that variable is the treatment node of an earlier stage, so the recursive target set introduces no unintended interventions.hypothesesconclusionv ∈ S.regimeTarget k↔ ∃ i : Fin n, i.val < k ∧ v = S.D i | 0, _, v => by simp [regimeTarget] | k+ 1, h, v => by have hk : k < nProof (Lean source)
lemma regimeTarget_mem_iff (S : POLongitudinalPathSystem P n δ γ) : ∀ (k : ℕ) (_ : k ≤ n) (v : P.V), v ∈ S.regimeTarget k ↔ ∃ i : Fin n, i.val < k ∧ v = S.D i | 0, _, v => by simp [regimeTarget] | k + 1, h, v => by have hk : k < n := h simp only [regimeTarget, hk, ↓reduceDIte, Finset.mem_insert] constructor · rintro (rfl | hmem) · exact ⟨⟨k, hk⟩, lt_succ_self _, rfl⟩ · rcases (S.regimeTarget_mem_iff k (le_of_lt hk) v).mp hmem with ⟨i, hi, rfl⟩ exact ⟨i, Nat.lt_succ_of_lt hi, rfl⟩ · rintro ⟨i, hi, rfl⟩ rcases Nat.lt_succ_iff_lt_or_eq.mp hi with hi' | hi' · exact inr ((S.regimeTarget_mem_iff k (le_of_lt hk) _).mpr ⟨i, hi', rfl⟩) · left have : (⟨k, hk⟩ : Fin n) = i := by apply Fin.ext; simp [hi'] rw [this] -
measurable_Y_oflemma — The terminal outcome under a prescribed treatment path is measurable, so its mean and history-conditional expectations are defined.hypothesesconclusionMeasurable (S.Y_of dbar)Proof (Lean source)
@[fun_prop] lemma measurable_Y_of (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : Measurable (S.Y_of dbar) := S.yVar.measurable_cf _ -
measurable_S_oflemma — The state reached at a selected stage along a prescribed treatment path is measurable, so it can enter subsequent histories.hypothesesconclusionMeasurable (S.S_of dbar k)Proof (Lean source)
@[fun_prop] lemma measurable_S_of (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) (k : Fin n) : Measurable (S.S_of dbar k) := (S.S k).measurable_cf _ -
measurable_factualDlemma — The observed treatment at a selected decision stage is measurable, making stagewise treatment events observable.hypothesesconclusionMeasurable (S.factualD k)Proof (Lean source)
@[fun_prop] lemma measurable_factualD (S : POLongitudinalPathSystem P n δ γ) (k : Fin n) : Measurable (S.factualD k) := (S.dVar k).measurable_factual -
measurable_factualYlemma — The observed terminal outcome in a longitudinal-path system is measurable, so its adjusted and unadjusted means are defined.hypothesesconclusionMeasurable S.factualYProof (Lean source)
@[fun_prop] lemma measurable_factualY (S : POLongitudinalPathSystem P n δ γ) : Measurable S.factualY := S.yVar.measurable_factual -
measurable_factualSlemma — The observed state at a selected decision stage is measurable, so the stagewise history is observable.hypothesesconclusionMeasurable (S.factualS k)Proof (Lean source)
@[fun_prop] lemma measurable_factualS (S : POLongitudinalPathSystem P n δ γ) (k : Fin n) : Measurable (S.factualS k) := (S.S k).measurable_factual -
measurable_indDlemma — The indicator that observed treatment follows a prescribed path is measurable at every cutoff, allowing it to weight conditional expectations.hypothesesconclusionMeasurable (S.indD dbar k) | 0=> measurable_const | k+ 1=> by unfold indD by_cases hk : k < n · simp only [hk, ↓reduceDIte] exact (S.measurable_indD dbar k).mul ((S.dVar ⟨k, hk⟩).measurable_indicator (dbar ⟨k, hk⟩) (measurableSet_singleton _)) · simp only [hk, ↓reduceDIte] exact S.measurable_indD dbar kProof (Lean source)
@[fun_prop] lemma measurable_indD (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ k : ℕ, Measurable (S.indD dbar k) | 0 => measurable_const | k + 1 => by unfold indD by_cases hk : k < n · simp only [hk, ↓reduceDIte] exact (S.measurable_indD dbar k).mul ((S.dVar ⟨k, hk⟩).measurable_indicator (dbar ⟨k, hk⟩) (measurableSet_singleton _)) · simp only [hk, ↓reduceDIte] exact S.measurable_indD dbar k
Helpers 2 core · 20 supporting This file provides auxiliary measurability, integrability, and sigma-algebra comparison lemmas for the general finite-horizon fixed longitudinal treatment path proofs. ★ indD_mul_Y_integrable
Fixed Longitudinal Treatment Path Helpers
This file provides auxiliary measurability, integrability, and sigma-algebra comparison lemmas for the general finite-horizon fixed longitudinal treatment path proofs. These helpers support the backward-induction and final identification arguments but are split out because they are shared across DTR files.
Important public lemmas include historyBundle_sigma_mono,
indD_eq_indicator_event, stronglyMeasurable_indD_sigma_history,
factualAgrees_regime, indD_mul_Y_integrable, measurable_innerReg, and
yVar_notMem_regime.
The one-step history projection for a longitudinal-path system at a selected stage, when the next stage exists, recovers the earlier information set by dropping the new state and current-treatment coordinates.
Definition (Lean source)
For a longitudinal-path system, a prescribed treatment path, a cutoff, and an integrable path-specific outcome, the partial-regime indicator times that outcome is integrable.
Formal statement
Proof (Lean source)
20 supporting declarations (lemmas, instances)
-
measurable_hb_step_projlemma — The one-step history projection is measurable, which makes every earlier-history event observable from the next-stage history.hypothesesconclusionMeasurable (S.hb_step_proj k h)Proof (Lean source)
@[fun_prop] lemma measurable_hb_step_proj (S : POLongitudinalPathSystem P n δ γ) (k : ℕ) (h : k + 1 < n) : Measurable (S.hb_step_proj k h) := by apply measurable_pi_lambda intro j -- Instance search no longer unfolds `historyBundle (k+1)` to see that its -- index type is `Fin (… + 1 + 1)`, so supply the coordinate measurable-space -- family explicitly. let _ : ∀ i : Fin ((S.historyBundle k (lt_of_succ_lt h)).n + 1 + 1), MeasurableSpace ((S.historyBundle (k + 1) h).type i) := fun i => (S.historyBundle (k + 1) h).inst i exact measurable_pi_apply j.succ.succ -
hb_jointValue_step_eqlemma — Key algebraic identity: the stage-k joint value factors through the stage-(k+1) joint value via hb_step_proj.hypothesesconclusion(S.historyBundle k (lt_of_succ_lt h)).jointValue= S.hb_step_proj k h ∘ (S.historyBundle (k+1) h).jointValueProof (Lean source)
lemma hb_jointValue_step_eq (S : POLongitudinalPathSystem P n δ γ) (k : ℕ) (h : k + 1 < n) : (S.historyBundle k (lt_of_succ_lt h)).jointValue = S.hb_step_proj k h ∘ (S.historyBundle (k+1) h).jointValue := by funext ω j rfl -
historyBundle_sigma_mono_steplemma — One-step σ-algebra inclusion: σ(history k) ≤ σ(history (k+1)).hypothesesconclusionProof (Lean source)
lemma historyBundle_sigma_mono_step (S : POLongitudinalPathSystem P n δ γ) (k : ℕ) (h : k + 1 < n) : (S.historyBundle k (lt_of_succ_lt h)).sigma ≤ (S.historyBundle (k+1) h).sigma := by change comap (S.historyBundle k (lt_of_succ_lt h)).jointValue inferInstance ≤ comap (S.historyBundle (k+1) h).jointValue inferInstance rw [S.hb_jointValue_step_eq k h, ← MeasurableSpace.comap_comp] exact comap_mono (S.measurable_hb_step_proj k h).comap_le -
historyBundle_sigma_monolemma — Iterated σ-algebra monotonicity: σ(history j) ≤ σ(history k) for j ≤ k.hypothesesconclusionProof (Lean source)
lemma historyBundle_sigma_mono (S : POLongitudinalPathSystem P n δ γ) (j k : ℕ) (hjk : j ≤ k) (hk : k < n) : (S.historyBundle j (lt_of_le_of_lt hjk hk)).sigma ≤ (S.historyBundle k hk).sigma := by induction k with | zero => interval_cases j exact le_refl _ | succ k ih => rcases Nat.lt_or_ge j (k + 1) with hlt | hge · have hjk' : j ≤ k := Nat.lt_succ_iff.mp hlt have hkn : k < n := lt_of_succ_lt hk exact (ih hjk' hkn).trans (S.historyBundle_sigma_mono_step k hk) · have hjeq : j = k + 1 := le_antisymm hjk hge subst hjeq exact le_refl _ -
indD_eq_zero_or_onelemma — indD dbar k ω ∈ {0, 1} for every ω and every k.hypothesesconclusionS.indD dbar k ω+ 1, ω=> by unfold indD by_cases hk : k < n · simp only [hk, ↓reduceDIte] rcases indD_eq_zero_or_one S dbar k ω with h | h · left; simp [h] · rcases (S.dVar ⟨k, hk⟩).indicator_eq_one_or_zero (dbar ⟨k, hk⟩) ω with h' | h' · right; simp [h, h'] · left; simp [h, h'] · simp only [hk, ↓reduceDIte] exact indD_eq_zero_or_one S dbar k ωProof (Lean source)
lemma indD_eq_zero_or_one (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ (k : ℕ) (ω : P.Ω), S.indD dbar k ω = 0 ∨ S.indD dbar k ω = 1 | 0, _ => inr rfl | k + 1, ω => by unfold indD by_cases hk : k < n · simp only [hk, ↓reduceDIte] rcases indD_eq_zero_or_one S dbar k ω with h | h · left; simp [h] · rcases (S.dVar ⟨k, hk⟩).indicator_eq_one_or_zero (dbar ⟨k, hk⟩) ω with h' | h' · right; simp [h, h'] · left; simp [h, h'] · simp only [hk, ↓reduceDIte] exact indD_eq_zero_or_one S dbar k ω -
indD_integrablelemma — indD dbar k is bounded by 1, hence integrable for finite μ.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γdbar :Fin n → δk :ℕIsFiniteMeasure P.μconclusionIntegrable (S.indD dbar k) P.μProof (Lean source)
@[fun_prop] lemma indD_integrable (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) (k : ℕ) [IsFiniteMeasure P.μ] : Integrable (S.indD dbar k) P.μ := by refine Integrable.of_bound (S.measurable_indD dbar k).aestronglyMeasurable 1 (Filter.Eventually.of_forall ?_) intro ω rcases S.indD_eq_zero_or_one dbar k ω with h | h <;> simp [h] -
indD_eq_indicator_eventlemma — Event expression for indD: as a set-indicator of the agreement event.hypothesesProof (Lean source)
lemma indD_eq_indicator_event (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ (k : ℕ) (_ : k ≤ n), S.indD dbar k = ({ω | ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i}).indicator (fun _ => (1 : ℝ)) | 0, _ => by funext ω simp [indD] | k + 1, h => by have hk : k < n := h funext ω have hrec := indD_eq_indicator_event S dbar k (le_of_lt hk) -- Rewrite indD dbar (k+1) ω in terms of indD dbar k ω * indicator. have hstep : S.indD dbar (k+1) ω = S.indD dbar k ω * (S.dVar ⟨k, hk⟩).indicator (dbar ⟨k, hk⟩) ω := by change (if h' : k < n then S.indD dbar k ω * (S.dVar ⟨k, h'⟩).indicator (dbar ⟨k, h'⟩) ω else S.indD dbar k ω) = _ simp [hk] rw [hstep] rw [show S.indD dbar k = _ from hrec] by_cases hall : ∀ i : Fin n, i.val < k + 1 → S.factualD i ω = dbar i · have hprefix : ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i := fun i hi => hall i (Nat.lt_succ_of_lt hi) have hnew : S.factualD ⟨k, hk⟩ ω = dbar ⟨k, hk⟩ := hall ⟨k, hk⟩ (lt_succ_self _) have hmem : ω ∈ {ω | ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i} := hprefix have hmem' : ω ∈ {ω | ∀ i : Fin n, i.val < k + 1 → S.factualD i ω = dbar i} := hall rw [Set.indicator_of_mem hmem, Set.indicator_of_mem hmem'] rw [(S.dVar ⟨k, hk⟩).indicator_apply_eq_one hnew] ring · have hnmem' : ω ∉ {ω | ∀ i : Fin n, i.val < k + 1 → S.factualD i ω = dbar i} := hall rw [Set.indicator_of_notMem hnmem'] by_cases hprefix : ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i · have hnew : S.factualD ⟨k, hk⟩ ω ≠ dbar ⟨k, hk⟩ := by intro hn apply hall intro i hi rcases Nat.lt_succ_iff_lt_or_eq.mp hi with hi' | hi' · exact hprefix i hi' · have : i = ⟨k, hk⟩ := Fin.ext (by simpa using hi') rw [this]; exact hn have hmem : ω ∈ {ω | ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i} := hprefix rw [Set.indicator_of_mem hmem] rw [(S.dVar ⟨k, hk⟩).indicator_apply_eq_zero hnew] ring · have hnmem : ω ∉ {ω | ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i} := hprefix rw [Set.indicator_of_notMem hnmem] ring -
indD_factor_splitlemma — Path agreement in a longitudinal-path system, at a selected stage within the horizon, means the indicator that a unit's observed treatment path matches the regime through stage k+1 factors as the indicator through stage k times the indicator that the observed treatment at stage k equals the path's value there: indD dbar (k+1) = indD dbar k · 1_{D k = dbar k}.hypothesesconclusionS.indD dbar (k+1) = fun ω => S.indD dbar k ω * (S.dVar ⟨k, hk⟩).indicator (dbar ⟨k, hk⟩) ωProof (Lean source)
lemma indD_factor_split (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) (k : ℕ) (hk : k < n) : S.indD dbar (k+1) = fun ω => S.indD dbar k ω * (S.dVar ⟨k, hk⟩).indicator (dbar ⟨k, hk⟩) ω := by funext ω change (if h' : k < n then S.indD dbar k ω * (S.dVar ⟨k, h'⟩).indicator (dbar ⟨k, h'⟩) ω else S.indD dbar k ω) = _ simp [hk] -
measurable_factualS_sigma_historylemma — factualS k' is (historyBundle m).sigma-measurable for k'.val ≤ m.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γm :ℕhm :m < nk' :Fin nhk' :k'.val ≤ mconclusionMeasurable[(S.historyBundle m hm).sigma] (S.factualS k')Proof (Lean source)
lemma measurable_factualS_sigma_history (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m < n) (k' : Fin n) (hk' : k'.val ≤ m) : Measurable[(S.historyBundle m hm).sigma] (S.factualS k') := by induction m with | zero => have hkv : k'.val = 0 := Nat.le_zero.mp hk' have hkeq : k' = ⟨0, hm⟩ := Fin.ext (by simp [hkv]) subst hkeq intro s hs refine ⟨(fun f : ∀ i, (S.historyBundle 0 hm).type i => f ⟨0, zero_lt_succ 0⟩) ⁻¹' s, ?_, ?_⟩ · exact measurable_pi_apply _ hs · rfl | succ m ih => rcases Nat.lt_or_ge k'.val (m + 1) with hlt | hge · have hkm : k'.val ≤ m := Nat.lt_succ_iff.mp hlt have hmn : m < n := lt_of_succ_lt hm have hrec := ih hmn hkm -- Upgrade via σ-algebra monotonicity. intro s hs exact S.historyBundle_sigma_mono_step m hm _ (hrec hs) · have hkeq : k'.val = m + 1 := le_antisymm hk' hge have hkfin : k' = ⟨m + 1, hm⟩ := Fin.ext hkeq subst hkfin intro s hs refine ⟨(fun f : ∀ i, (S.historyBundle (m+1) hm).type i => f ⟨0, zero_lt_succ _⟩) ⁻¹' s, ?_, ?_⟩ · exact measurable_pi_apply _ hs · rfl -
measurable_factualD_sigma_historylemma — factualD k' is (historyBundle m).sigma-measurable for k'.val < m.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γm :ℕhm :m < nk' :Fin nhk' :k'.val < mconclusionMeasurable[(S.historyBundle m hm).sigma] (S.factualD k')Proof (Lean source)
lemma measurable_factualD_sigma_history (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m < n) (k' : Fin n) (hk' : k'.val < m) : Measurable[(S.historyBundle m hm).sigma] (S.factualD k') := by induction m with | zero => exact absurd hk' (Nat.not_lt_zero _) | succ m ih => rcases Nat.lt_or_ge k'.val m with hlt | hge · have hmn : m < n := Nat.lt_of_succ_lt hm intro s hs exact S.historyBundle_sigma_mono_step m hm _ ((ih hmn hlt) hs) · have hkeq : k'.val = m := by omega have hmlt : m < n := Nat.lt_of_succ_lt hm have hkfin : k' = ⟨m, hmlt⟩ := Fin.ext hkeq intro s hs -- index 1 in historyBundle (m+1) — use a Fin literal. let i1 : Fin ((S.historyBundle (m+1) hm).n) := ⟨1, by -- The length of historyBundle (m+1) is (historyBundle m).n + 1 + 1 ≥ 2. change 1 < (S.historyBundle m hmlt).n + 1 + 1 omega⟩ refine ⟨(fun f : ∀ i, (S.historyBundle (m+1) hm).type i => f i1) ⁻¹' s, ?_, ?_⟩ · exact measurable_pi_apply _ hs · rw [hkfin]; rfl -
stronglyMeasurable_indicator_dVar_sigma_historylemma — In a longitudinal-path system, a valid history cutoff makes the indicator that an earlier treatment equals a selected value strongly measurable with respect to the history σ-algebra.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γm :ℕhm :m < nk' :Fin nhk' :k'.val < mx :δconclusionProof (Lean source)
lemma stronglyMeasurable_indicator_dVar_sigma_history (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m < n) (k' : Fin n) (hk' : k'.val < m) (x : δ) : StronglyMeasurable[(S.historyBundle m hm).sigma] ((S.dVar k').indicator x) := by have hfmeas := S.measurable_factualD_sigma_history m hm k' hk' have hev : MeasurableSet[(S.historyBundle m hm).sigma] ((S.dVar k').event x) := hfmeas (MeasurableSet.singleton x) have hmeas : Measurable[(S.historyBundle m hm).sigma] ((S.dVar k').indicator x) := by unfold POVar.indicator exact measurable_const.indicator hev exact hmeas.stronglyMeasurable -
measurable_factualS_sigma_history_lastlemma — The state observed at the stage a history bundle ends on is measurable with respect to that history bundle's σ-algebra.hypothesesconclusionMeasurable[(S.historyBundle m hm).sigma] (S.factualS ⟨m, hm⟩)Proof (Lean source)
@[fun_prop] lemma measurable_factualS_sigma_history_last (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m < n) : Measurable[(S.historyBundle m hm).sigma] (S.factualS ⟨m, hm⟩) := S.measurable_factualS_sigma_history m hm ⟨m, hm⟩ (le_refl m) -
measurable_factualS_sigma_history_predlemma — The state observed one stage before the stage a history bundle ends on is measurable with respect to that history bundle's σ-algebra.hypothesesconclusionProof (Lean source)
@[fun_prop] lemma measurable_factualS_sigma_history_pred (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m + 1 < n) : Measurable[(S.historyBundle (m + 1) hm).sigma] (S.factualS ⟨m, lt_of_succ_lt hm⟩) := S.measurable_factualS_sigma_history (m + 1) hm ⟨m, lt_of_succ_lt hm⟩ (le_succ m) -
measurable_factualD_sigma_history_lastlemma — The last treatment recorded in a history bundle is measurable with respect to that history bundle's σ-algebra.hypothesesconclusionProof (Lean source)
@[fun_prop] lemma measurable_factualD_sigma_history_last (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m + 1 < n) : Measurable[(S.historyBundle (m + 1) hm).sigma] (S.factualD ⟨m, lt_of_succ_lt hm⟩) := S.measurable_factualD_sigma_history (m + 1) hm ⟨m, lt_of_succ_lt hm⟩ (lt_succ_self m) -
stronglyMeasurable_indicator_dVar_sigma_history_lastlemma — The indicator that the last treatment recorded in a history bundle equals a given value is strongly measurable with respect to that history bundle's σ-algebra.hypothesesconclusionProof (Lean source)
@[fun_prop] lemma stronglyMeasurable_indicator_dVar_sigma_history_last (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m + 1 < n) (x : δ) : StronglyMeasurable[(S.historyBundle (m + 1) hm).sigma] ((S.dVar ⟨m, lt_of_succ_lt hm⟩).indicator x) := S.stronglyMeasurable_indicator_dVar_sigma_history (m + 1) hm ⟨m, lt_of_succ_lt hm⟩ (lt_succ_self m) x -
stronglyMeasurable_indD_sigma_historylemma — The joint-agreement indicator indD dbar m' is (historyBundle m).sigma-strongly-measurable for m' ≤ m.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γm :ℕhm :m < ndbar :Fin n → δm' :ℕ_ :m' ≤ mconclusionStronglyMeasurable[(S.historyBundle m hm).sigma] (S.indD dbar m') | 0, _=> by unfold indD exact stronglyMeasurable_const | m' + 1, h => by have hm' : m' < nProof (Lean source)
lemma stronglyMeasurable_indD_sigma_history (S : POLongitudinalPathSystem P n δ γ) (m : ℕ) (hm : m < n) (dbar : Fin n → δ) : ∀ (m' : ℕ) (_ : m' ≤ m), StronglyMeasurable[(S.historyBundle m hm).sigma] (S.indD dbar m') | 0, _ => by unfold indD exact stronglyMeasurable_const | m' + 1, h => by have hm' : m' < n := lt_of_lt_of_le h (le_of_lt hm) have hrec := stronglyMeasurable_indD_sigma_history S m hm dbar m' (le_of_succ_le h) have hmlt : m' < m := h have hind := S.stronglyMeasurable_indicator_dVar_sigma_history m hm ⟨m', hm'⟩ hmlt (dbar ⟨m', hm'⟩) -- `indD (m'+1) = indD m' * indicator`. have heq : S.indD dbar (m' + 1) = fun ω => S.indD dbar m' ω * (S.dVar ⟨m', hm'⟩).indicator (dbar ⟨m', hm'⟩) ω := S.indD_factor_split dbar m' hm' rw [heq] -- `StronglyMeasurable` closed under mul. exact hrec.mul hind -
factualAgrees_regimeUpTolemma — Helper: for each k ≤ n, FactualAgrees for regimeUpTo dbar k holds on the event "factualD i = dbar i for all i.val < k".hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γdbar :Fin n → δk :ℕh :k ≤ nω :P.Ω(∀ i : Fin n, i.val < k → S.factualD i ω = dbar i)conclusionP.FactualAgrees (S.regimeUpTo dbar k h) ω | 0, _, ω, _=> by change P.FactualAgrees (S.regimeUpToAux dbar 0 (by exact zero_le n)).1 ω unfold regimeUpToAux exact POSystem.factualAgrees_empty ω | k+ 1, h, ω, hall => by have hk : k < nProof (Lean source)
lemma factualAgrees_regimeUpTo (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ (k : ℕ) (h : k ≤ n) (ω : P.Ω), (∀ i : Fin n, i.val < k → S.factualD i ω = dbar i) → P.FactualAgrees (S.regimeUpTo dbar k h) ω | 0, _, ω, _ => by change P.FactualAgrees (S.regimeUpToAux dbar 0 (by exact zero_le n)).1 ω unfold regimeUpToAux exact POSystem.factualAgrees_empty ω | k + 1, h, ω, hall => by have hk : k < n := h have hprefix : ∀ i : Fin n, i.val < k → S.factualD i ω = dbar i := fun i hi => hall i (Nat.lt_succ_of_lt hi) have hnew : S.factualD ⟨k, hk⟩ ω = dbar ⟨k, hk⟩ := hall ⟨k, hk⟩ (lt_succ_self _) have hrec := factualAgrees_regimeUpTo S dbar k (le_of_lt hk) ω hprefix -- Unfold regimeUpTo at k+1 to a sqcup. change P.FactualAgrees (S.regimeUpToAux dbar (k+1) h).1 ω unfold regimeUpToAux simp only apply POSystem.factualAgrees_sqcup · exact (S.dVar ⟨k, hk⟩).factualAgrees_single (dbar ⟨k, hk⟩) hnew · -- hrec is about S.regimeUpTo dbar k _ = (S.regimeUpToAux dbar k _).1. exact hrec -
factualAgrees_regimelemma — General multi-target consistency: every ω in the full agreement event factually agrees with S.regime dbar.hypothesesn :sharedℕδ :sharedTypeS :POLongitudinalPathSystem P n δ γdbar :Fin n → δω ∈ {ω | ∀ i : Fin n, S.factualD i ω = dbar i} :conclusionP.FactualAgrees (S.regime dbar) ωProof (Lean source)
lemma factualAgrees_regime (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ ω ∈ {ω | ∀ i : Fin n, S.factualD i ω = dbar i}, P.FactualAgrees (S.regime dbar) ω := by intro ω hω exact S.factualAgrees_regimeUpTo dbar n (le_refl n) ω (fun i _ => hω i) -
measurable_innerReglemma — The backward adjusted-regression process for a dynamic system and treatment path is measurable at every recursion depth, so each stage can serve as the response in the next conditional-expectation step.hypothesesconclusionMeasurable (S.innerReg dbar j) | 0=> by unfold innerReg by_cases hn : 0 < n · simp only [hn, ↓reduceDIte] set BProof (Lean source)
@[fun_prop] lemma measurable_innerReg (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : ∀ j : ℕ, Measurable (S.innerReg dbar j) | 0 => by unfold innerReg by_cases hn : 0 < n · simp only [hn, ↓reduceDIte] set B := S.historyBundle (n-1) (sub_lt hn one_pos) have hN := (B.stronglyMeasurable_condExpGiven (μ := P.μ) (fun ω' => S.factualY ω' * S.indD dbar n ω')).measurable have hD := (B.stronglyMeasurable_condExpGiven (μ := P.μ) (S.indD dbar n)).measurable exact hN.div hD · simp only [hn, ↓reduceDIte] exact measurable_const | j + 1 => by unfold innerReg by_cases hj : j + 1 < n · simp only [hj, ↓reduceDIte] have hkk : n - j - 2 < n := by omega set kFin : Fin n := ⟨n - j - 2, hkk⟩ set ind_k : P.Ω → ℝ := (S.dVar kFin).indicator (dbar kFin) set B := S.historyBundle (n - j - 2) hkk have hN := (B.stronglyMeasurable_condExpGiven (μ := P.μ) (fun ω' => S.innerReg dbar j ω' * ind_k ω')).measurable have hD := (B.stronglyMeasurable_condExpGiven (μ := P.μ) ind_k).measurable exact hN.div hD · simp only [hj, ↓reduceDIte] exact S.measurable_innerReg dbar j -
yVar_notMem_regimelemma — The outcome node Y is not a target of S.regime dbar.hypothesesconclusionS.yVar.v ∉ (S.regime dbar).targetProof (Lean source)
lemma yVar_notMem_regime (S : POLongitudinalPathSystem P n δ γ) (dbar : Fin n → δ) : S.yVar.v ∉ (S.regime dbar).target := by intro hmem have hmem' : S.yVar.v ∈ S.regimeTarget n := by rw [← S.regimeUpTo_target_eq dbar n (le_refl n)] exact hmem rcases (S.regimeTarget_mem_iff n (le_refl n) S.yVar.v).mp hmem' with ⟨i, _, heq⟩ exact (S.distinctDY i) heq.symm
Induction 1 core · 1 supporting This file proves the base case and inductive step for the backward-induction identity behind general finite-horizon treatment-path backdoor identification. ★ conditionalPath_base
Fixed Longitudinal Treatment Path Induction
This file proves the base case and inductive step for the backward-induction identity behind general finite-horizon treatment-path backdoor identification. The identity connects the observable iterated conditional-expectation ratios to the conditional mean of the regime counterfactual outcome.
The public theorems conditionalPath_base and conditionalPath_step are the
cancellation identities consumed by conditionalPath_iter,
conditionalPath_backdoor, and treatmentPath_backdoor in DTR/Main.lean.
Base case of the backward induction for a fixed longitudinal treatment path. For a longitudinal-path system and prescribed treatment path, under the fixed-treatment-path identification assumptions — consistency and stage-wise sequential exchangeability/overlap, provided the horizon n is positive, the depth-zero adjusted-regression functional, multiplied by the indicator that the observed treatment matches the target regime dbar through stage n-1, agrees almost everywhere with that same indicator multiplied by the conditional mean of the regime outcome given the treatment-and-covariate history through stage n-1.
Formal statement
Proof (Lean source)
1 supporting declaration (lemmas, instances)
-
conditionalPath_steptheorem — A longitudinal-path system and prescribed treatment path, under the identifying assumptions, a valid next recursion depth with its mirrored history index inside the horizon, integrability of the current regression, and the current cancellation identity, the same cancellation identity holds one stage farther outward.hypothesesn :sharedℕδ :sharedTypeIsFiniteMeasure P.μS :POLongitudinalPathSystem P n δ γhA :S.Assumptionsdbar :Fin n → δj :ℕhj :j + 1 < nhk :n - j - 2 < nhIH_int :Integrable (S.innerReg dbar j) P.μIH :(fun ω => S.innerReg dbar j ω * S.indD dbar (n - j - 1) ω)=ᵐ[P.μ] (fun ω => S.indD dbar (n - j - 1) ω * (S.historyBundle (n - j - 1) (by omega)).condExpGiven (S.Y_of dbar) P.μ ω)conclusion(fun ω => S.innerReg dbar (j + 1) ω * S.indD dbar (n - j - 2) ω)=ᵐ[P.μ] (fun ω => S.indD dbar (n - j - 2) ω * (S.historyBundle (n - j - 2) hk).condExpGiven (S.Y_of dbar) P.μ ω)Proof (Lean source)
theorem conditionalPath_step [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (S : POLongitudinalPathSystem P n δ γ) (hA : S.Assumptions) (dbar : Fin n → δ) (j : ℕ) (hj : j + 1 < n) (hk : n - j - 2 < n) (hIH_int : Integrable (S.innerReg dbar j) P.μ) (IH : (fun ω => S.innerReg dbar j ω * S.indD dbar (n - j - 1) ω) =ᵐ[P.μ] (fun ω => S.indD dbar (n - j - 1) ω * (S.historyBundle (n - j - 1) (by omega)).condExpGiven (S.Y_of dbar) P.μ ω)) : (fun ω => S.innerReg dbar (j + 1) ω * S.indD dbar (n - j - 2) ω) =ᵐ[P.μ] (fun ω => S.indD dbar (n - j - 2) ω * (S.historyBundle (n - j - 2) hk).condExpGiven (S.Y_of dbar) P.μ ω) := by -- Abbreviations. set k : ℕ := n - j - 2 with hk_def have hk1 : k + 1 < n := by omega set kFin : Fin n := ⟨k, hk⟩ with hkFin_def set ind_k : P.Ω → ℝ := (S.dVar kFin).indicator (dbar kFin) with hind_k_def -- σ-algebra inclusion σ_k ≤ σ_{k+1}. have hσk_le : (S.historyBundle k hk).sigma ≤ (inferInstance : MeasurableSpace P.Ω) := (S.historyBundle k hk).sigma_le have hσ_step : (S.historyBundle k hk).sigma ≤ (S.historyBundle (k+1) hk1).sigma := S.historyBundle_sigma_mono_step k hk1 -- Strong-measurability of `indD k` (σ_k) and `ind_k` (σ_{k+1}). have hindDk_sm : StronglyMeasurable[(S.historyBundle k hk).sigma] (S.indD dbar k) := S.stronglyMeasurable_indD_sigma_history k hk dbar k (le_refl k) have hindk_sm_k1 : StronglyMeasurable[(S.historyBundle (k+1) hk1).sigma] ind_k := S.stronglyMeasurable_indicator_dVar_sigma_history (k+1) hk1 kFin (lt_succ_self _) (dbar kFin) -- Integrability prerequisites. have hYof_int : Integrable (S.Y_of dbar) P.μ := hA.integrable_Y dbar have hindk_int : Integrable ind_k P.μ := (S.dVar kFin).integrable_indicator (dbar kFin) (measurableSet_singleton _) have hindDk1_int : Integrable (S.indD dbar (k+1)) P.μ := S.indD_integrable dbar (k+1) have hYof_indk_int : Integrable (fun ω => S.Y_of dbar ω * ind_k ω) P.μ := by dsimp [ind_k] exact (S.dVar kFin).integrable_mul_indicator (dbar kFin) (measurableSet_singleton _) hYof_int have hindk_Yof_int : Integrable (fun ω => ind_k ω * S.Y_of dbar ω) P.μ := hYof_indk_int.congr (Filter.Eventually.of_forall (fun ω => by ring)) -- `n - j - 1 = k + 1`. have hk1_idx : n - j - 1 = k + 1 := by omega -- Pointwise factor split: indD (k+1) = indD k · ind_k. have hFactor : S.indD dbar (k+1) = fun ω => S.indD dbar k ω * ind_k ω := S.indD_factor_split dbar k hk -- Integrability of `innerReg j · indD (k+1)`: derived from IH RHS being integrable. have hCondExpY_k1_int : Integrable ((S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ) P.μ := (S.historyBundle (k+1) hk1).integrable_condExpGiven _ have hRHS_IH_int : Integrable (fun ω => S.indD dbar (k+1) ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) P.μ := by refine hCondExpY_k1_int.mono ((S.measurable_indD dbar (k+1)).mul ((S.historyBundle (k+1) hk1).stronglyMeasurable_condExpGiven _).measurable ).aestronglyMeasurable ?_ refine Filter.Eventually.of_forall (fun ω => ?_) rcases S.indD_eq_zero_or_one dbar (k+1) ω with h | h <;> simp [h] -- Cast IH from `n - j - 1` to `k + 1`. have IH' : (fun ω => S.innerReg dbar j ω * S.indD dbar (k+1) ω) =ᵐ[P.μ] (fun ω => S.indD dbar (k+1) ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) := by -- The indices `n - j - 1` and `k + 1` are equal (`hk1_idx`); rewrite via -- a heterogeneous-eq cast on the historyBundle. have hHB_eq : HEq ((S.historyBundle (n - j - 1) (by omega : n - j - 1 < n)).condExpGiven (S.Y_of dbar) P.μ) ((S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ) := by congr 1 simp [hk1_idx] have hHB_eq' : (S.historyBundle (n - j - 1) (by omega : n - j - 1 < n)).condExpGiven (S.Y_of dbar) P.μ = (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ := eq_of_heq hHB_eq have hindDeq : S.indD dbar (n - j - 1) = S.indD dbar (k + 1) := by rw [hk1_idx] have := IH rw [hindDeq] at this refine this.trans ?_ refine Filter.Eventually.of_forall (fun ω => ?_) rw [hHB_eq'] have hinnerReg_indD_int : Integrable (fun ω => S.innerReg dbar j ω * S.indD dbar (k+1) ω) P.μ := hRHS_IH_int.congr IH'.symm -- ====== Master identity ===================================================== -- Prove: μ[innerReg j · indD (k+1) | σ_k] =ᵐ -- indD k · μ[ind_k | σ_k] · μ[Y_of | σ_k]. -- Path: -- (a) condExpGiven_congr_ae of IH'. -- (b) Rewrite RHS integrand: indD (k+1) · μ[Y|σ_{k+1}] = indD k · (ind_k · μ[Y|σ_{k+1}]). -- (c) Pull indD k (σ_k-meas, bounded) out. -- (d) Reverse pullout of ind_k on σ_{k+1}. -- (e) Tower σ_k ≤ σ_{k+1}. -- (f) Stage-k exch. -- ============================================================================ -- (a) Apply σ_k-CE to both sides of IH'. have hStepA : (S.historyBundle k hk).condExpGiven (fun ω => S.innerReg dbar j ω * S.indD dbar (k+1) ω) P.μ =ᵐ[P.μ] (S.historyBundle k hk).condExpGiven (fun ω => S.indD dbar (k+1) ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) P.μ := (S.historyBundle k hk).condExpGiven_congr_ae IH' -- (b) Rewrite: indD (k+1) · X = indD k · (ind_k · X). have hRewriteRHS : (fun ω => S.indD dbar (k+1) ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) = (fun ω => S.indD dbar k ω * (ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω)) := by funext ω rw [show S.indD dbar (k+1) ω = S.indD dbar k ω * ind_k ω from congr_fun hFactor ω] ring -- (c) Pull indD k (σ_k-meas) out of σ_k-CE. have hindk_CE_int : Integrable (fun ω => ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) P.μ := by dsimp [ind_k] have hmul := (S.dVar kFin).integrable_mul_indicator (dbar kFin) (measurableSet_singleton _) hCondExpY_k1_int exact hmul.congr (Filter.Eventually.of_forall (fun ω => by ring)) have hindDk_indk_CE_int : Integrable (S.indD dbar k * fun ω => ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) P.μ := by have hrw : (S.indD dbar k * fun ω => ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) = fun ω => S.indD dbar (k+1) ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω := by funext ω change S.indD dbar k ω * (ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) = _ rw [show S.indD dbar (k+1) ω = S.indD dbar k ω * ind_k ω from congr_fun hFactor ω] ring rw [hrw]; exact hRHS_IH_int have hPullIndDk : (S.historyBundle k hk).condExpGiven (fun ω => S.indD dbar k ω * (ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω)) P.μ =ᵐ[P.μ] (fun ω => S.indD dbar k ω * (S.historyBundle k hk).condExpGiven (fun ω' => ind_k ω' * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω') P.μ ω) := by have hpull := (S.historyBundle k hk).condExpGiven_mul_of_stronglyMeasurable_left (f := S.indD dbar k) (g := fun ω => ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) hindDk_sm hindDk_indk_CE_int hindk_CE_int filter_upwards [hpull] with ω hω exact hω -- (d) Reverse pullout of ind_k on σ_{k+1}. have hRevPull : (fun ω => ind_k ω * (S.historyBundle (k+1) hk1).condExpGiven (S.Y_of dbar) P.μ ω) =ᵐ[P.μ] (S.historyBundle (k+1) hk1).condExpGiven (fun ω => ind_k ω * S.Y_of dbar ω) P.μ := by have hfwd := (S.historyBundle (k+1) hk1).condExpGiven_mul_of_stronglyMeasurable_left (f := ind_k) (g := S.Y_of dbar) hindk_sm_k1 hindk_Yof_int hYof_int filter_upwards [hfwd] with ω hω exact hω.symm -- (e) Tower σ_k ≤ σ_{k+1}. haveI : IsFiniteMeasure (P.μ.trim (S.historyBundle (k+1) hk1).sigma_le) := isFiniteMeasure_trim _ have hTower : (S.historyBundle k hk).condExpGiven ((S.historyBundle (k+1) hk1).condExpGiven (fun ω => ind_k ω * S.Y_of dbar ω) P.μ) P.μ =ᵐ[P.μ] (S.historyBundle k hk).condExpGiven (fun ω => ind_k ω * S.Y_of dbar ω) P.μ := by have h := (S.historyBundle (k+1) hk1).condExpGiven_tower_of_le (g := fun ω => ind_k ω * S.Y_of dbar ω) (μ := P.μ) (m := (S.historyBundle k hk).sigma) hσ_step simpa [POCFBundle.condExpGiven] using h -- (f) Stage-k exchangeability. have hcfY_n : (S.cfYBundle dbar).n = 1 := rfl let i0 : Fin (S.cfYBundle dbar).n := ⟨0, by rw [hcfY_n]; exact Nat.one_pos⟩ let ψ : (∀ i : Fin (S.cfYBundle dbar).n, (S.cfYBundle dbar).type i) → ℝ := fun f => (f i0 : ℝ) have hψ_meas : Measurable ψ := by change Measurable (fun f : (∀ i, (S.cfYBundle dbar).type i) => (f i0 : ℝ)) exact measurable_pi_apply i0 have hYof_eq_proj : S.Y_of dbar = ψ ∘ (S.cfYBundle dbar).jointValue := by funext ω; rfl have hCI : CondIndepFun (S.historyBundle k hk).sigma hσk_le (S.factualD kFin) (S.Y_of dbar) P.μ := by have hproj := (hA.exch dbar kFin).project (ψ := ψ) hψ_meas rw [hYof_eq_proj]; exact hproj let u : δ → ℝ := ({dbar kFin} : Set δ).indicator (fun _ => (1 : ℝ)) have hu_meas : Measurable u := measurable_const.indicator (MeasurableSet.singleton _) have hu_eq : (fun ω => u (S.factualD kFin ω)) = ind_k := by funext ω show u (S.factualD kFin ω) = ind_k ω by_cases h : S.factualD kFin ω = dbar kFin · have h1 : S.factualD kFin ω ∈ ({dbar kFin} : Set δ) := h have h2 : ω ∈ (S.dVar kFin).event (dbar kFin) := h rw [show u (S.factualD kFin ω) = (1 : ℝ) from Set.indicator_of_mem h1 _, show ind_k ω = (1 : ℝ) from (S.dVar kFin).indicator_apply_eq_one h2] · have h1 : S.factualD kFin ω ∉ ({dbar kFin} : Set δ) := h have h2 : ω ∉ (S.dVar kFin).event (dbar kFin) := h rw [show u (S.factualD kFin ω) = (0 : ℝ) from Set.indicator_of_notMem h1 _, show ind_k ω = (0 : ℝ) from (S.dVar kFin).indicator_apply_eq_zero h2] have huv_int : Integrable (fun ω => u (S.factualD kFin ω) * S.Y_of dbar ω) P.μ := by have hEq : (fun ω => u (S.factualD kFin ω) * S.Y_of dbar ω) = (fun ω => ind_k ω * S.Y_of dbar ω) := by funext ω; rw [congr_fun hu_eq ω] rw [hEq]; exact hindk_Yof_int have hfact : P.μ[fun ω => u (S.factualD kFin ω) * S.Y_of dbar ω | (S.historyBundle k hk).sigma] =ᵐ[P.μ] P.μ[fun ω => u (S.factualD kFin ω) | (S.historyBundle k hk).sigma] * P.μ[fun ω => S.Y_of dbar ω | (S.historyBundle k hk).sigma] := condExp_mul_of_condIndep (μ := P.μ) (m := (S.historyBundle k hk).sigma) hσk_le (f := S.factualD kFin) (g := S.Y_of dbar) (S.measurable_factualD kFin) (S.measurable_Y_of dbar) hCI (u := u) (v := id) hu_meas measurable_id (by rw [hu_eq]; exact hindk_int) hYof_int huv_int have hExch : (S.historyBundle k hk).condExpGiven -- … truncated; follow the source link for the rest …
Main 2 core · 1 supporting This file proves the general finite-horizon fixed-treatment-path backdoor identification theorem. ★ conditionalPath_backdoor★ treatmentPath_backdoor
Fixed Longitudinal Treatment Path Backdoor Identification
This file proves the general finite-horizon fixed-treatment-path backdoor identification theorem. It combines the base and inductive cancellation steps into a backward induction argument and then integrates the resulting conditional mean identity.
The exported theorem conditionalPath_iter records the full induction invariant,
conditionalPath_backdoor gives the conditional mean identification, and
treatmentPath_backdoor identifies the mean potential outcome with the adjusted
longitudinal-path functional. Every intervention is a fixed Fin n → δ path;
history-dependent decision rules are not represented.
General-n conditional treatment-path backdoor identification. Under the fixed-treatment-path identification assumptions, for a positive horizon n, a longitudinal-path system and prescribed treatment path satisfy the conditional mean of Y(dbar) given the initial-history σ-algebra equals the outermost iterated-CE functional innerReg dbar (n - 1).
Formal statement
Proof (Lean source)
General-n integrated treatment-path backdoor identification. Under the fixed-treatment-path identification assumptions, for a positive horizon n, a longitudinal-path system and prescribed treatment path satisfy the mean potential outcome E[Y(dbar)] equals the integral of the outermost adjusted functional innerReg dbar (n - 1).
Formal statement
Proof (Lean source)
1 supporting declaration (lemmas, instances)
-
conditionalPath_itertheorem — Under the fixed-path assumptions, a positive horizon, and a longitudinal-path system with a prescribed treatment path, the backward-induction invariant equates each adjusted regression times its partial path indicator with the matching history-conditional outcome mean times that indicator.hypothesesn :sharedℕδ :sharedTypeIsFiniteMeasure P.μS :POLongitudinalPathSystem P n δ γhA :S.Assumptionsdbar :Fin n → δhn :0 < nj :ℕj < nconclusion(fun ω => S.innerReg dbar j ω * S.indD dbar (n - 1 - j) ω)=ᵐ[P.μ] (fun ω => S.indD dbar (n - 1 - j) ω * (S.historyBundle (n - 1 - j) (by omega)).condExpGiven (S.Y_of dbar) P.μ ω)Proof (Lean source)
theorem conditionalPath_iter [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (S : POLongitudinalPathSystem P n δ γ) (hA : S.Assumptions) (dbar : Fin n → δ) (hn : 0 < n) : ∀ j : ℕ, j < n → (fun ω => S.innerReg dbar j ω * S.indD dbar (n - 1 - j) ω) =ᵐ[P.μ] (fun ω => S.indD dbar (n - 1 - j) ω * (S.historyBundle (n - 1 - j) (by omega)).condExpGiven (S.Y_of dbar) P.μ ω) := by intro j hj induction j with | zero => have h := S.conditionalPath_base hA dbar hn -- `conditionalPath_base` produces the j = 0 case with `n - 1` on the indD side; -- `n - 1 - 0 = n - 1`, so the two statements coincide. have heq : n - 1 - 0 = n - 1 := by omega simp only [heq] convert h using 3 | succ j ih => have hj' : j < n := Nat.lt_of_succ_lt hj have ih' := ih hj' -- `conditionalPath_step` consumes IH at depth j (with index `n - j - 1` on indD) -- and produces depth j+1 (with index `n - j - 2`). Bridge `n - 1 - j` -- ↔ `n - j - 1` and `n - 1 - (j + 1)` ↔ `n - j - 2`. have heq1 : n - 1 - j = n - j - 1 := by omega have heq2 : n - 1 - (j + 1) = n - j - 2 := by omega have hk : n - j - 2 < n := by omega -- Reshape ih' to match conditionalPath_step's IH-shape. have ihStep : (fun ω => S.innerReg dbar j ω * S.indD dbar (n - j - 1) ω) =ᵐ[P.μ] (fun ω => S.indD dbar (n - j - 1) ω * (S.historyBundle (n - j - 1) (by omega)).condExpGiven (S.Y_of dbar) P.μ ω) := by have := ih' simp only [heq1] at this convert this using 2 have hjlt : j < n := Nat.lt_of_succ_lt hj have hIH_int : Integrable (S.innerReg dbar j) P.μ := (S.conditionalPath_strong hA dbar hn j hjlt).2 have hStep := S.conditionalPath_step hA dbar j hj hk hIH_int ihStep -- Reshape `hStep`'s conclusion to the goal indices. simp only [heq2] convert hStep using 2
StrongCancellation 1 core · 1 supporting This file proves the strengthened cancellation identity needed for finite-horizon fixed-treatment-path identification under pointwise overlap. ★ conditionalPath_strong
Fixed Longitudinal Treatment Path Strong Cancellation
This file proves the strengthened cancellation identity needed for
finite-horizon fixed-treatment-path identification under pointwise overlap.
The main theorem POLongitudinalPathSystem.conditionalPath_strong carries two
facts through the same backward induction: innerReg dbar j is almost surely the product of the
partial treatment-regime indicator indD dbar (n - 1 - j) and the conditional
expectation of Y_of dbar given the corresponding history bundle, and
innerReg dbar j is integrable.
The derived lemma POLongitudinalPathSystem.innerReg_integrable recovers the public
integrability statement from this stronger a.e. identity. This avoids any
uniform-overlap bound: after cancellation, integrability follows from a bounded
indicator multiplying an integrable conditional expectation.
Joint inductive invariant for the strengthened cancellation. A fixed-treatment-path system following a fixed treatment path, when the identifying assumption bundle holds and the horizon is positive, satisfies at every stage index j below the horizon the partial regression term innerReg dbar j agrees almost surely with the product of the treatment-regime indicator at the mirrored stage n - 1 - j and the conditional expectation of the outcome given the history up to that stage, and this term is integrable.
Formal statement
Proof (Lean source)
1 supporting declaration (lemmas, instances)
-
innerReg_integrablelemma — innerReg dbar j is integrable for every j < n.hypothesesn :sharedℕδ :sharedTypeIsFiniteMeasure P.μS :POLongitudinalPathSystem P n δ γhA :S.Assumptionsdbar :Fin n → δj :ℕhj :j < nconclusionIntegrable (S.innerReg dbar j) P.μProof (Lean source)
lemma innerReg_integrable [StandardBorelSpace P.Ω] [IsFiniteMeasure P.μ] (S : POLongitudinalPathSystem P n δ γ) (hA : S.Assumptions) (dbar : Fin n → δ) (j : ℕ) (hj : j < n) : Integrable (S.innerReg dbar j) P.μ := by have hn : 0 < n := lt_of_le_of_lt (zero_le _) hj exact (S.conditionalPath_strong hA dbar hn j hj).2