PO.ID.Exact.RDD

Regression discontinuity: identification of the cutoff effect from continuity of conditional regressions.

Fuzzy­RDD 19 core · 17 supporting This file formalizes fuzzy regression-discontinuity identification using regression-function representatives at the cutoff. ★ POFuzzyRDDSystem★ frd_identification★ tau_late_identification

Fuzzy Regression Discontinuity

This file formalizes fuzzy regression-discontinuity identification using regression-function representatives at the cutoff. POFuzzyRDDSystem defines the running variable, cutoff indicator, binary treatment, outcome, potential treatment DofZ, potential outcome YofD, induced outcome YofDofZ, and the complier-weighted outcome difference YdiffComplier.

The Assumptions bundle records consistency, deterministic cutoff eligibility, local treatment monotonicity near the cutoff, latent and observable regression representatives, one-sided support, observable one-sided limits, a complier outcome-difference representative, and a nonzero first-stage jump. The main definitions are tau_FRD and tau_LATE. Theorems nuD_right_limit_eq, nuD_left_limit_eq, nuY_right_limit_eq, and nuY_left_limit_eq identify the observable one-sided limits with latent regression values, and frd_identification identifies the observable cutoff Wald ratio. The theorem tau_late_identification gives the separate global-monotonicity bridge from the fuzzy RDD ratio to the cutoff representative complier-effect ratio.

structure POFuzzyRDDSystem reviewed
Causalean.PO

Fuzzy regression-discontinuity model in the potential-outcome framework. A unit has a continuous running variable X, an above-cutoff indicator Z recording whether X exceeds the cutoff c, a binary treatment D whose take-up probability jumps — but does not jump all the way from 0 to 1 — at the cutoff, and a real outcome Y, with the outcome, cutoff indicator, and treatment nodes pairwise distinct. The cutoff effect on the outcome divided by the cutoff jump in treatment identifies the cutoff-local LATE (def:po-fuzzy-rdd-system).

Definition (Lean source)
P :
Running (forcing) variable `X`.
Xvar :
POVar P ℝ
Above-cutoff indicator `Z = 1{X ≥ c}`.
Zvar :
Binary treatment `D`.
Dvar :
Real outcome `Y`.
Yvar :
POVar P ℝ
Cutoff value of the running variable.
c :
hYD :
Yvar.v ≠ Dvar.v
hZD :
Zvar.v ≠ Dvar.v
hDY :
Dvar.v ≠ Yvar.v
Causalean.PO.POFuzzyRDDSystem · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:69 · uses POSystem
def factualX reviewed
Causalean.PO.POFuzzyRDDSystem

Factual running variable X.

Definition (Lean source)
noncomputable def factualX : P.Ω → ℝ := S.Xvar.factual
Causalean.PO.POFuzzyRDDSystem.factualX · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:95 · uses POFuzzyRDDSystem , POSystem
def factualZ reviewed
Causalean.PO.POFuzzyRDDSystem

Factual cutoff-eligibility instrument Z.

Definition (Lean source)
noncomputable def factualZ : P.Ω → Bool := S.Zvar.factual
Causalean.PO.POFuzzyRDDSystem.factualZ · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:98 · uses POFuzzyRDDSystem , POSystem
def factualD reviewed
Causalean.PO.POFuzzyRDDSystem

Factual treatment D.

Definition (Lean source)
noncomputable def factualD : P.Ω → Bool := S.Dvar.factual
Causalean.PO.POFuzzyRDDSystem.factualD · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:101 · uses POFuzzyRDDSystem , POSystem
def factualY reviewed
Causalean.PO.POFuzzyRDDSystem

Factual outcome Y.

Definition (Lean source)
noncomputable def factualY : P.Ω → ℝ := S.Yvar.factual
Causalean.PO.POFuzzyRDDSystem.factualY · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:104 · uses POFuzzyRDDSystem , POSystem
def DofZ reviewed
Causalean.PO.POFuzzyRDDSystem

Instrument-specific potential treatment D(z).

Definition (Lean source)
noncomputable def DofZ (z : Bool) : P.Ω → Bool := S.Dvar.cfUnder S.Zvar z
def YofD reviewed
Causalean.PO.POFuzzyRDDSystem

Treatment-specific potential outcome Y(d).

Definition (Lean source)
noncomputable def YofD (d : Bool) : P.Ω → ℝ := S.Yvar.cfUnder S.Dvar d
def YofDofZ reviewed
Causalean.PO.POFuzzyRDDSystem

Outcome under the treatment induced by instrument value z, Y(D(z)).

Definition (Lean source)
noncomputable def YofDofZ (z : Bool) : P.Ω → ℝ := fun ω => if S.DofZ z ω then S.YofD true ω else S.YofD false ω
Causalean.PO.POFuzzyRDDSystem.YofDofZ · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:115 · uses POFuzzyRDDSystem , POSystem
def YdiffComplier reviewed
Causalean.PO.POFuzzyRDDSystem

Y-difference weighted by the complier indicator 1_{D(1)=1, D(0)=0}. Equals Y(D(1)) − Y(D(0)) a.e. under monotonicity; used in the LATE bridge.

Definition (Lean source)
noncomputable def YdiffComplier : P.Ω → ℝ := fun ω => (S.YofD true ω - S.YofD false ω) * if S.DofZ true ω = true ∧ S.DofZ false ω = false then 1 else 0
Causalean.PO.POFuzzyRDDSystem.YdiffComplier · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:119 · uses POFuzzyRDDSystem , POSystem
def zEvent reviewed
Causalean.PO.POFuzzyRDDSystem

Factual eligibility event {Z = z}.

Definition (Lean source)
def zEvent (z : Bool) : Set P.Ω := S.Zvar.event z
structure Assumptions reviewed
Causalean.PO.POFuzzyRDDSystem

Fuzzy RDD assumption bundle. For a fuzzy regression-discontinuity system, this packages consistency (SUTVA), deterministic cutoff eligibility: the above-cutoff indicator agrees almost surely with whether the running variable has crossed the cutoff, and cutoff-neighborhood monotonicity: near the cutoff, a unit who would take treatment under the untreated instrument value would also take it under the treated instrument value. It supplies latent treatment and outcome regression representatives muD/muY and observable regression representatives nuD/nuY, each certified as a genuine regression function of the corresponding response on the running variable, with the latent representatives continuous at the cutoff; it also assumes the running variable has positive local probability mass on both sides of the cutoff, and that the observable treatment regression and outcome regression have well-defined one-sided limits at the cutoff. Finally, a complier outcome-difference representative mu_Ydiff_complier is likewise a regression function that is continuous at the cutoff, and the first-stage treatment-take-up jump at the cutoff is nonzero.

Definition (Lean source)
consistency :
P.Consistency
cutoffEligibility :
∀ᵐ ω ∂P.μ, S.factualZ ω ↔ S.c ≤ S.factualX ω
In a neighborhood of the cutoff, units who would take treatment below the cutoff would also take treatment above the cutoff, up to a null set.
monotonicity :
∃ ε > (0 : ℝ),
∀ᵐ ω ∂P.μ, |S.factualX ω - S.c| < ε → S.DofZ false ω = true → S.DofZ true ω = true
muD :
Bool → ℝ → ℝ
muY :
Bool → ℝ → ℝ
nuD :
ℝ → ℝ
nuY :
ℝ → ℝ
muD_isReg :
∀ z, IsRegressionFunction P.μ S.factualX (fun ω => ((S.DofZ z ω).toNat : ℝ)) (muD z)
muY_isReg :
∀ z, IsRegressionFunction P.μ S.factualX (S.YofDofZ z) (muY z)
nuD_isReg :
IsRegressionFunction P.μ S.factualX (fun ω => ((S.factualD ω).toNat : ℝ)) nuD
nuY_isReg :
IsRegressionFunction P.μ S.factualX S.factualY nuY
muD_continuousAt :
∀ z, ContinuousAt (muD z) S.c
muY_continuousAt :
∀ z, ContinuousAt (muY z) S.c
support_right :
∀ ε > (0 : ℝ), (P.μ.map S.factualX) (Ioo S.c (S.c + ε)) ≠ 0
support_left :
∀ ε > (0 : ℝ), (P.μ.map S.factualX) (Ioo (S.c - ε) S.c) ≠ 0
nuD_right_limit_exists :
∃ L : ℝ, Tendsto nuD (𝓝[>] S.c) (𝓝 L)
nuD_left_limit_exists :
∃ L : ℝ, Tendsto nuD (𝓝[<] S.c) (𝓝 L)
nuY_right_limit_exists :
∃ L : ℝ, Tendsto nuY (𝓝[>] S.c) (𝓝 L)
nuY_left_limit_exists :
∃ L : ℝ, Tendsto nuY (𝓝[<] S.c) (𝓝 L)
mu_Ydiff_complier :
ℝ → ℝ
mu_Ydiff_complier_isReg :
IsRegressionFunction P.μ S.factualX S.YdiffComplier mu_Ydiff_complier
mu_Ydiff_complier_continuousAt :
ContinuousAt mu_Ydiff_complier S.c
firstStageJump :
muD true S.c - muD false S.c ≠ 0
Causalean.PO.POFuzzyRDDSystem.Assumptions · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:165 · uses POFuzzyRDDSystem , POSystem
def tau_FRD reviewed
Causalean.PO.POFuzzyRDDSystem

Cutoff-local fuzzy RDD Wald estimand in regression-representative form.

Definition (Lean source)
noncomputable def tau_FRD (hA : S.Assumptions) : ℝ := (hA.muY true S.c - hA.muY false S.c) / (hA.muD true S.c - hA.muD false S.c)
def tau_LATE reviewed
Causalean.PO.POFuzzyRDDSystem

Cutoff-local complier-effect ratio in regression-representative form. It divides the complier outcome-difference representative at the cutoff by the first-stage jump; tau_late_identification connects this ratio to tau_FRD under the fuzzy-RDD assumptions.

Definition (Lean source)
noncomputable def tau_LATE (hA : S.Assumptions) : ℝ := hA.mu_Ydiff_complier S.c / (hA.muD true S.c - hA.muD false S.c)
def nuD_right_limit reviewed
Causalean.PO.POFuzzyRDDSystem

The right-hand treatment limit is the selected limit at the cutoff of the observable treatment regression as the running variable approaches from above.

Definition (Lean source)
noncomputable def nuD_right_limit (hA : S.Assumptions) : ℝ := choose hA.nuD_right_limit_exists
Causalean.PO.POFuzzyRDDSystem.nuD_right_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:237 · uses POFuzzyRDDSystem , Assumptions , POSystem
def nuD_left_limit reviewed
Causalean.PO.POFuzzyRDDSystem

The left-hand treatment limit is the selected limit at the cutoff of the observable treatment regression as the running variable approaches from below.

Definition (Lean source)
noncomputable def nuD_left_limit (hA : S.Assumptions) : ℝ := choose hA.nuD_left_limit_exists
def nuY_right_limit reviewed
Causalean.PO.POFuzzyRDDSystem

The right-hand outcome limit is the selected limit at the cutoff of the observable outcome regression as the running variable approaches from above.

Definition (Lean source)
noncomputable def nuY_right_limit (hA : S.Assumptions) : ℝ := choose hA.nuY_right_limit_exists
Causalean.PO.POFuzzyRDDSystem.nuY_right_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:247 · uses POFuzzyRDDSystem , Assumptions , POSystem
def nuY_left_limit reviewed
Causalean.PO.POFuzzyRDDSystem

The left-hand outcome limit is the selected limit at the cutoff of the observable outcome regression as the running variable approaches from below.

Definition (Lean source)
noncomputable def nuY_left_limit (hA : S.Assumptions) : ℝ := choose hA.nuY_left_limit_exists
theorem frd_identification reviewed
Causalean.PO.POFuzzyRDDSystem

Fuzzy RDD identification at the cutoff, in regression-representative form. Under the fuzzy-RDD identifying assumption bundle, the Wald ratio of the latent right- and left-hand representative jumps at the cutoff equals the Wald ratio of the one-sided observable outcome- and treatment-regression limits at the cutoff:

Formal statement
hA :
S.Assumptions
S.tau_FRD hA
= (S.nuY_right_limit hA - S.nuY_left_limit hA) / (S.nuD_right_limit hA - S.nuD_left_limit hA)
Proof (Lean source)
theorem frd_identification (hA : S.Assumptions) : S.tau_FRD hA = (S.nuY_right_limit hA - S.nuY_left_limit hA) / (S.nuD_right_limit hA - S.nuD_left_limit hA) := by rw [show S.nuY_right_limit hA = hA.muY true S.c from S.nuY_right_limit_eq hA (S.tendsto_nuY_right_limit hA), show S.nuY_left_limit hA = hA.muY false S.c from S.nuY_left_limit_eq hA (S.tendsto_nuY_left_limit hA), show S.nuD_right_limit hA = hA.muD true S.c from S.nuD_right_limit_eq hA (S.tendsto_nuD_right_limit hA), show S.nuD_left_limit hA = hA.muD false S.c from S.nuD_left_limit_eq hA (S.tendsto_nuD_left_limit hA)] rfl
theorem tau_late_identification reviewed
Causalean.PO.POFuzzyRDDSystem

Fuzzy RDD identifies a cutoff representative complier ratio under an extra global monotonicity bridge. Under the local fuzzy-RDD identifying assumption bundle — consistency, deterministic cutoff eligibility, and local exclusion through potential outcomes, and additionally assuming treatment is almost-surely monotone in the instrument, i.e. whenever the potential treatment under the untreated instrument value is realized as true, the potential treatment under the treated instrument value is true as well (no defiers), the complier-weighted local average treatment effect at the cutoff tau_LATE equals the fuzzy-RDD Wald-ratio functional tau_FRD, i.e. the observable Wald ratio at the cutoff equals the complier-weighted outcome-difference representative divided by the first-stage jump.

Formal statement
hA :
S.Assumptions
hmono :
∀ᵐ ω ∂P.μ
if
S.DofZ false ω = true
then
S.DofZ true ω = true
S.tau_LATE hA = S.tau_FRD hA
Proof (Lean source)
theorem tau_late_identification (hA : S.Assumptions) (hmono : ∀ᵐ ω ∂P.μ, S.DofZ false ω = true → S.DofZ true ω = true) : S.tau_LATE hA = S.tau_FRD hA := by simp only [tau_LATE, tau_FRD] congr 1 exact (S.muY_diff_eq_mu_Ydiff_complier_at_cutoff hA hmono).symm
17 supporting declarations (lemmas, instances)
  • measurable_factualX lemma — The factual running variable is measurable.
    Measurable S.factualX
    Proof (Lean source)
    lemma measurable_factualX : Measurable S.factualX := S.Xvar.measurable_factual
    Causalean.PO.POFuzzyRDDSystem.measurable_factualX · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:125
  • measurable_factualZ lemma — The factual cutoff-eligibility instrument is measurable.
    Measurable S.factualZ
    Proof (Lean source)
    lemma measurable_factualZ : Measurable S.factualZ := S.Zvar.measurable_factual
    Causalean.PO.POFuzzyRDDSystem.measurable_factualZ · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:127
  • measurable_factualD lemma — The factual treatment is measurable.
    Measurable S.factualD
    Proof (Lean source)
    lemma measurable_factualD : Measurable S.factualD := S.Dvar.measurable_factual
    Causalean.PO.POFuzzyRDDSystem.measurable_factualD · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:129
  • measurable_factualY lemma — The factual outcome is measurable.
    Measurable S.factualY
    Proof (Lean source)
    lemma measurable_factualY : Measurable S.factualY := S.Yvar.measurable_factual
    Causalean.PO.POFuzzyRDDSystem.measurable_factualY · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:131
  • measurable_DofZ lemma — The instrument-specific potential treatment is measurable.
    z :
    Measurable (S.DofZ z)
    Proof (Lean source)
    lemma measurable_DofZ (z : Bool) : Measurable (S.DofZ z) := S.Dvar.measurable_cfUnder S.Zvar z
    Causalean.PO.POFuzzyRDDSystem.measurable_DofZ · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:134
  • measurable_YofD lemma — The treatment-specific potential outcome is measurable.
    d :
    Measurable (S.YofD d)
    Proof (Lean source)
    lemma measurable_YofD (d : Bool) : Measurable (S.YofD d) := S.Yvar.measurable_cfUnder S.Dvar d
    Causalean.PO.POFuzzyRDDSystem.measurable_YofD · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:138
  • measurable_YofDofZ lemma — The outcome under the instrument-induced treatment is measurable.
    z :
    Measurable (S.YofDofZ z)
    Proof (Lean source)
    lemma measurable_YofDofZ (z : Bool) : Measurable (S.YofDofZ z) := by unfold YofDofZ exact Measurable.ite (S.measurable_DofZ z (MeasurableSet.singleton true)) (S.measurable_YofD true) (S.measurable_YofD false)
    Causalean.PO.POFuzzyRDDSystem.measurable_YofDofZ · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:142
  • measurable_YdiffComplier lemma — The complier-weighted outcome difference is measurable.
    Measurable S.YdiffComplier
    Proof (Lean source)
    lemma measurable_YdiffComplier : Measurable S.YdiffComplier := by unfold YdiffComplier apply mul · exact (S.measurable_YofD true).sub (S.measurable_YofD false) · exact Measurable.ite ((S.measurable_DofZ true (MeasurableSet.singleton true)).inter (S.measurable_DofZ false (MeasurableSet.singleton false))) measurable_const measurable_const
    Causalean.PO.POFuzzyRDDSystem.measurable_YdiffComplier · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:148
  • measurableSet_zEvent lemma — The factual eligibility event is measurable.
    z :
    MeasurableSet (S.zEvent z)
    Proof (Lean source)
    lemma measurableSet_zEvent (z : Bool) : MeasurableSet (S.zEvent z) := by simpa [zEvent] using S.Zvar.measurableSet_event z
    Causalean.PO.POFuzzyRDDSystem.measurableSet_zEvent · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:161
  • tendsto_nuD_right_limit lemma — The chosen right-hand treatment-regression limit is a genuine right-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nuD (𝓝[>] S.c) (𝓝 (S.nuD_right_limit hA))
    Proof (Lean source)
    lemma tendsto_nuD_right_limit (hA : S.Assumptions) : Tendsto hA.nuD (𝓝[>] S.c) (𝓝 (S.nuD_right_limit hA)) := Classical.choose_spec hA.nuD_right_limit_exists
    Causalean.PO.POFuzzyRDDSystem.tendsto_nuD_right_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:257
  • tendsto_nuD_left_limit lemma — The chosen left-hand treatment-regression limit is a genuine left-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nuD (𝓝[<] S.c) (𝓝 (S.nuD_left_limit hA))
    Proof (Lean source)
    lemma tendsto_nuD_left_limit (hA : S.Assumptions) : Tendsto hA.nuD (𝓝[<] S.c) (𝓝 (S.nuD_left_limit hA)) := Classical.choose_spec hA.nuD_left_limit_exists
    Causalean.PO.POFuzzyRDDSystem.tendsto_nuD_left_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:263
  • tendsto_nuY_right_limit lemma — The chosen right-hand outcome-regression limit is a genuine right-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nuY (𝓝[>] S.c) (𝓝 (S.nuY_right_limit hA))
    Proof (Lean source)
    lemma tendsto_nuY_right_limit (hA : S.Assumptions) : Tendsto hA.nuY (𝓝[>] S.c) (𝓝 (S.nuY_right_limit hA)) := Classical.choose_spec hA.nuY_right_limit_exists
    Causalean.PO.POFuzzyRDDSystem.tendsto_nuY_right_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:269
  • tendsto_nuY_left_limit lemma — The chosen left-hand outcome-regression limit is a genuine left-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nuY (𝓝[<] S.c) (𝓝 (S.nuY_left_limit hA))
    Proof (Lean source)
    lemma tendsto_nuY_left_limit (hA : S.Assumptions) : Tendsto hA.nuY (𝓝[<] S.c) (𝓝 (S.nuY_left_limit hA)) := Classical.choose_spec hA.nuY_left_limit_exists
    Causalean.PO.POFuzzyRDDSystem.tendsto_nuY_left_limit · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:275
  • nuD_right_limit_eq theorem — Any right-hand observable treatment-regression limit at the cutoff equals the treated latent treatment regression there.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nuD (𝓝[>] S.c) (𝓝 L)
    L = hA.muD true S.c
    Proof (Lean source)
    theorem nuD_right_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nuD (𝓝[>] S.c) (𝓝 L)) : L = hA.muD true S.c := RDDLimits.oneSidedLimit_eq_right (S.nuD_eq_muD_true_ae_restrict_Ici hA) (hA.muD_continuousAt true) hA.support_right h
    Causalean.PO.POFuzzyRDDSystem.nuD_right_limit_eq · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:544
  • nuD_left_limit_eq theorem — Any left-hand observable treatment-regression limit at the cutoff equals the untreated latent treatment regression there.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nuD (𝓝[<] S.c) (𝓝 L)
    L = hA.muD false S.c
    Proof (Lean source)
    theorem nuD_left_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nuD (𝓝[<] S.c) (𝓝 L)) : L = hA.muD false S.c := RDDLimits.oneSidedLimit_eq_left (S.nuD_eq_muD_false_ae_restrict_Iio hA) (hA.muD_continuousAt false) hA.support_left h
    Causalean.PO.POFuzzyRDDSystem.nuD_left_limit_eq · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:555
  • nuY_right_limit_eq theorem — Any right-hand observable outcome-regression limit at the cutoff equals the treated latent outcome regression there.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nuY (𝓝[>] S.c) (𝓝 L)
    L = hA.muY true S.c
    Proof (Lean source)
    theorem nuY_right_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nuY (𝓝[>] S.c) (𝓝 L)) : L = hA.muY true S.c := RDDLimits.oneSidedLimit_eq_right (S.nuY_eq_muY_true_ae_restrict_Ici hA) (hA.muY_continuousAt true) hA.support_right h
    Causalean.PO.POFuzzyRDDSystem.nuY_right_limit_eq · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:566
  • nuY_left_limit_eq theorem — Any left-hand observable outcome-regression limit at the cutoff equals the untreated latent outcome regression there.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nuY (𝓝[<] S.c) (𝓝 L)
    L = hA.muY false S.c
    Proof (Lean source)
    theorem nuY_left_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nuY (𝓝[<] S.c) (𝓝 L)) : L = hA.muY false S.c := RDDLimits.oneSidedLimit_eq_left (S.nuY_eq_muY_false_ae_restrict_Iio hA) (hA.muY_continuousAt false) hA.support_left h
    Causalean.PO.POFuzzyRDDSystem.nuY_left_limit_eq · Causalean/PO/ID/Exact/RDD/FuzzyRDD.lean:577
RDDLimits 1 core · 3 supporting This file provides the one-sided limit engine used by sharp and fuzzy regression-discontinuity identification. ★ oneSidedLimit_eq_left

RDD One-Sided Limits

This file provides the one-sided limit engine used by sharp and fuzzy regression-discontinuity identification. If two real-valued functions agree almost everywhere on the relevant side of a cutoff and the reference function is continuous at the cutoff, then any corresponding one-sided limit of the other function equals the reference value at the cutoff, provided the running variable law has positive mass arbitrarily close to that side.

Theorems oneSidedLimit_eq_right and oneSidedLimit_eq_left identify right- and left-hand limits from one-sided a.e. agreement. The pointwise versions value_eq_of_aeEq_right and value_eq_of_aeEq_left identify the cutoff values of two continuous representatives. These results isolate the topological and measure-theoretic argument from the causal RDD files.

theorem oneSidedLimit_eq_left reviewed
Causalean.PO.RDDLimits

Left-side limit identification. Symmetric form of oneSidedLimit_eq_right. If a real-valued function f agrees with a reference function g almost everywhere, with respect to a measure π, on the half-line to the left of the cutoff c, g is continuous at c, and every open interval immediately to the left of c has positive π-measure, then any left-hand limit L of f at c must equal g evaluated at c.

Formal statement
h_aeEq :
f =ᵐ[π.restrict (Iio c)] g
hg_cont :
h_support :
∀ ε > (0 : ℝ), π (Ioo (c - ε) c) ≠ 0
L :
hL :
Tendsto f (𝓝[<] c) (𝓝 L)
L = g c
Proof (Lean source)
theorem oneSidedLimit_eq_left (h_aeEq : f =ᵐ[π.restrict (Iio c)] g) (hg_cont : ContinuousAt g c) (h_support : ∀ ε > (0 : ℝ), π (Ioo (c - ε) c) ≠ 0) {L : ℝ} (hL : Tendsto f (𝓝[<] c) (𝓝 L)) : L = g c := by haveI : (𝓝[<] c ⊓ Filter.principal {x | f x = g x}).NeBot := neBot_left h_aeEq h_support have h_f : Tendsto f (𝓝[<] c ⊓ Filter.principal {x | f x = g x}) (𝓝 L) := hL.mono_left inf_le_left have h_g_full : Tendsto g (𝓝[<] c) (𝓝 (g c)) := hg_cont.tendsto.mono_left inf_le_left have h_g : Tendsto g (𝓝[<] c ⊓ Filter.principal {x | f x = g x}) (𝓝 (g c)) := h_g_full.mono_left inf_le_left have h_eq : f =ᶠ[𝓝[<] c ⊓ Filter.principal {x | f x = g x}] g := by refine Filter.eventually_iff_exists_mem.mpr ?_ refine ⟨{x | f x = g x}, ?_, fun x hx => hx⟩ exact mem_inf_of_right (mem_principal_self _) have h_f' : Tendsto g (𝓝[<] c ⊓ Filter.principal {x | f x = g x}) (𝓝 L) := h_f.congr' h_eq exact tendsto_nhds_unique h_f' h_g
Causalean.PO.RDDLimits.oneSidedLimit_eq_left · Causalean/PO/ID/Exact/RDD/RDDLimits.lean:122
3 supporting declarations (lemmas, instances)
  • oneSidedLimit_eq_right theorem — Right-side limit identification. If f =ᵐ[π.restrict (Ici c)] g, g is continuous at c, every right-open neighborhood of c has positive π-mass, and f has any right-side limit L at c, then L = g c.
    h_aeEq :
    f =ᵐ[π.restrict (Ici c)] g
    hg_cont :
    h_support :
    ∀ ε > (0 : ℝ), π (Ioo c (c + ε)) ≠ 0
    L :
    hL :
    Tendsto f (𝓝[>] c) (𝓝 L)
    L = g c
    Proof (Lean source)
    theorem oneSidedLimit_eq_right (h_aeEq : f =ᵐ[π.restrict (Ici c)] g) (hg_cont : ContinuousAt g c) (h_support : ∀ ε > (0 : ℝ), π (Ioo c (c + ε)) ≠ 0) {L : ℝ} (hL : Tendsto f (𝓝[>] c) (𝓝 L)) : L = g c := by haveI : (𝓝[>] c ⊓ Filter.principal {x | f x = g x}).NeBot := neBot_right h_aeEq h_support have h_f : Tendsto f (𝓝[>] c ⊓ Filter.principal {x | f x = g x}) (𝓝 L) := hL.mono_left inf_le_left have h_g_full : Tendsto g (𝓝[>] c) (𝓝 (g c)) := hg_cont.tendsto.mono_left inf_le_left have h_g : Tendsto g (𝓝[>] c ⊓ Filter.principal {x | f x = g x}) (𝓝 (g c)) := h_g_full.mono_left inf_le_left have h_eq : f =ᶠ[𝓝[>] c ⊓ Filter.principal {x | f x = g x}] g := by refine Filter.eventually_iff_exists_mem.mpr ?_ refine ⟨{x | f x = g x}, ?_, fun x hx => hx⟩ exact mem_inf_of_right (mem_principal_self _) have h_f' : Tendsto g (𝓝[>] c ⊓ Filter.principal {x | f x = g x}) (𝓝 L) := h_f.congr' h_eq exact tendsto_nhds_unique h_f' h_g
    Causalean.PO.RDDLimits.oneSidedLimit_eq_right · Causalean/PO/ID/Exact/RDD/RDDLimits.lean:89
  • value_eq_of_aeEq_right theorem — Pointwise equality from a.e. agreement plus continuity. If f and g agree π.restrict (Ici c)-a.e., both are continuous at c, and every right-open neighborhood of c has positive π-mass, then f c = g c.
    h_aeEq :
    f =ᵐ[π.restrict (Ici c)] g
    hf_cont :
    hg_cont :
    h_support :
    ∀ ε > (0 : ℝ), π (Ioo c (c + ε)) ≠ 0
    f c = g c
    Proof (Lean source)
    theorem value_eq_of_aeEq_right (h_aeEq : f =ᵐ[π.restrict (Ici c)] g) (hf_cont : ContinuousAt f c) (hg_cont : ContinuousAt g c) (h_support : ∀ ε > (0 : ℝ), π (Ioo c (c + ε)) ≠ 0) : f c = g c := by have hL : Tendsto f (𝓝[>] c) (𝓝 (f c)) := hf_cont.tendsto.mono_left nhdsWithin_le_nhds exact oneSidedLimit_eq_right h_aeEq hg_cont h_support hL
    Causalean.PO.RDDLimits.value_eq_of_aeEq_right · Causalean/PO/ID/Exact/RDD/RDDLimits.lean:158
  • value_eq_of_aeEq_left theorem — Symmetric pointwise version of value_eq_of_aeEq_right.
    h_aeEq :
    f =ᵐ[π.restrict (Iio c)] g
    hf_cont :
    hg_cont :
    h_support :
    ∀ ε > (0 : ℝ), π (Ioo (c - ε) c) ≠ 0
    f c = g c
    Proof (Lean source)
    theorem value_eq_of_aeEq_left (h_aeEq : f =ᵐ[π.restrict (Iio c)] g) (hf_cont : ContinuousAt f c) (hg_cont : ContinuousAt g c) (h_support : ∀ ε > (0 : ℝ), π (Ioo (c - ε) c) ≠ 0) : f c = g c := by have hL : Tendsto f (𝓝[<] c) (𝓝 (f c)) := hf_cont.tendsto.mono_left nhdsWithin_le_nhds exact oneSidedLimit_eq_left h_aeEq hg_cont h_support hL
    Causalean.PO.RDDLimits.value_eq_of_aeEq_left · Causalean/PO/ID/Exact/RDD/RDDLimits.lean:170
Sharp­RDD 11 core · 9 supporting This file formalizes sharp regression-discontinuity identification in the potential-outcome framework. ★ POSharpRDDSystem★ rdd_identification

Sharp Regression Discontinuity

This file formalizes sharp regression-discontinuity identification in the potential-outcome framework. Under consistency, the deterministic cutoff rule, local support of the running variable on both sides of the cutoff, and continuity of the treatment-specific regressions, the cutoff effect equals the difference between the right and left limits of the observed outcome regression.

The proof reduces the sharp cutoff to half-line agreement between observable and potential-outcome regressions, then invokes the shared one-sided limit engine for regression-discontinuity designs.

structure POSharpRDDSystem reviewed
Causalean.PO

Sharp regression-discontinuity model in the potential-outcome framework. A unit has a continuous running variable X, a deterministic treatment D that switches on exactly when X crosses the cutoff c, jumping from 0 to 1 at the cutoff, and a real outcome Y, with the outcome and treatment nodes distinct. The jump in the outcome regression at the cutoff identifies the cutoff-local average treatment effect (def:po-sharp-rdd-system).

Definition (Lean source)
P :
Running (forcing) variable `X`.
Xvar :
POVar P ℝ
Binary treatment `D` (deterministic given `X` at the cutoff).
Dvar :
Real outcome `Y`.
Yvar :
POVar P ℝ
Cutoff value of the running variable.
c :
hYD :
Yvar.v ≠ Dvar.v
Causalean.PO.POSharpRDDSystem · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:29 · uses POSystem
def factualX reviewed
Causalean.PO.POSharpRDDSystem

Factual running variable X.

Definition (Lean source)
noncomputable def factualX : P.Ω → ℝ := S.Xvar.factual
Causalean.PO.POSharpRDDSystem.factualX · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:50 · uses POSharpRDDSystem , POSystem
def factualD reviewed
Causalean.PO.POSharpRDDSystem

Factual treatment D.

Definition (Lean source)
noncomputable def factualD : P.Ω → Bool := S.Dvar.factual
Causalean.PO.POSharpRDDSystem.factualD · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:53 · uses POSharpRDDSystem , POSystem
def factualY reviewed
Causalean.PO.POSharpRDDSystem

Factual outcome Y.

Definition (Lean source)
noncomputable def factualY : P.Ω → ℝ := S.Yvar.factual
Causalean.PO.POSharpRDDSystem.factualY · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:56 · uses POSharpRDDSystem , POSystem
def YofD reviewed
Causalean.PO.POSharpRDDSystem

Treatment-specific potential outcome Y(d).

Definition (Lean source)
noncomputable def YofD (d : Bool) : P.Ω → ℝ := S.Yvar.cfUnder S.Dvar d
def dEvent reviewed
Causalean.PO.POSharpRDDSystem

Factual treatment event {D = d}.

Definition (Lean source)
def dEvent (d : Bool) : Set P.Ω := S.Dvar.event d
Causalean.PO.POSharpRDDSystem.dEvent · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:72 · uses POSharpRDDSystem , POSystem
structure Assumptions reviewed
Causalean.PO.POSharpRDDSystem

Sharp RDD assumption bundle (def:po-sharp-rdd-assumptions). For a sharp regression-discontinuity system, this packages consistency (SUTVA) and the deterministic cutoff rule: the treatment indicator agrees almost surely with whether the running variable has reached the cutoff. It supplies treatment-specific latent regression representatives mu and an observable outcome regression representative nu, each certified as a genuine regression function of the corresponding response on the running variable, with the latent representatives continuous at the cutoff; it also assumes the running variable has positive local probability mass on both sides of the cutoff and the observable outcome regression has well-defined one-sided limits at the cutoff.

Definition (Lean source)
consistency :
P.Consistency
sharpCutoff :
∀ᵐ ω ∂P.μ, S.factualD ω ↔ S.c ≤ S.factualX ω
mu :
Bool → ℝ → ℝ
nu :
ℝ → ℝ
mu_isReg :
∀ d, IsRegressionFunction P.μ S.factualX (S.YofD d) (mu d)
nu_isReg :
IsRegressionFunction P.μ S.factualX S.factualY nu
mu_continuousAt :
∀ d, ContinuousAt (mu d) S.c
support_right :
∀ ε > (0 : ℝ), (P.μ.map S.factualX) (Ioo S.c (S.c + ε)) ≠ 0
support_left :
∀ ε > (0 : ℝ), (P.μ.map S.factualX) (Ioo (S.c - ε) S.c) ≠ 0
nu_right_limit_exists :
∃ L : ℝ, Tendsto nu (𝓝[>] S.c) (𝓝 L)
nu_left_limit_exists :
∃ L : ℝ, Tendsto nu (𝓝[<] S.c) (𝓝 L)
Causalean.PO.POSharpRDDSystem.Assumptions · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:79 · uses POSharpRDDSystem , POSystem
def tau_RDD reviewed
Causalean.PO.POSharpRDDSystem

Cutoff-local RDD estimand — by definition the difference of the treatment-specific regression representatives at the cutoff. In the standard reading of μ_d c = E[Y(d) | X = c], this is E[Y(1) - Y(0) | X = c].

Definition (Lean source)
noncomputable def tau_RDD (hA : S.Assumptions) : ℝ := hA.mu true S.c - hA.mu false S.c
def nu_right_limit reviewed
Causalean.PO.POSharpRDDSystem

The right-hand limit lim_{x ↓ c} ν(x) chosen from the existence witness of Assumptions.

Definition (Lean source)
noncomputable def nu_right_limit (hA : S.Assumptions) : ℝ := choose hA.nu_right_limit_exists
def nu_left_limit reviewed
Causalean.PO.POSharpRDDSystem

The left-hand limit lim_{x ↑ c} ν(x) chosen from the existence witness of Assumptions.

Definition (Lean source)
noncomputable def nu_left_limit (hA : S.Assumptions) : ℝ := choose hA.nu_left_limit_exists
theorem rdd_identification reviewed
Causalean.PO.POSharpRDDSystem

Sharp RDD identification at the cutoff (textbook form). Under the sharp-RDD assumption bundle — SUTVA consistency, deterministic treatment assignment D = 1{X ≥ c} almost surely, regression-function representatives for the potential and observed outcomes, continuity of the potential-outcome regression functions at the cutoff, positive local mass of the running variable on each side of c, and existence of both one-sided limits of the observed-outcome regression function at c, the cutoff-local treatment effect equals the difference of the right- and left-hand limits of the observed-outcome regression function at the cutoff:

Formal statement
hA :
S.Assumptions
S.tau_RDD hA = S.nu_right_limit hA - S.nu_left_limit hA
Proof (Lean source)
theorem rdd_identification (hA : S.Assumptions) : S.tau_RDD hA = S.nu_right_limit hA - S.nu_left_limit hA := by rw [show S.nu_right_limit hA = hA.mu true S.c from S.nu_right_limit_eq hA (S.tendsto_nu_right_limit hA), show S.nu_left_limit hA = hA.mu false S.c from S.nu_left_limit_eq hA (S.tendsto_nu_left_limit hA)] rfl
9 supporting declarations (lemmas, instances)
  • measurable_factualX lemma — The factual running variable is measurable.
    Measurable S.factualX
    Proof (Lean source)
    lemma measurable_factualX : Measurable S.factualX := S.Xvar.measurable_factual
    Causalean.PO.POSharpRDDSystem.measurable_factualX · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:62
  • measurable_factualD lemma — The factual treatment is measurable.
    Measurable S.factualD
    Proof (Lean source)
    lemma measurable_factualD : Measurable S.factualD := S.Dvar.measurable_factual
    Causalean.PO.POSharpRDDSystem.measurable_factualD · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:64
  • measurable_factualY lemma — The factual outcome is measurable.
    Measurable S.factualY
    Proof (Lean source)
    lemma measurable_factualY : Measurable S.factualY := S.Yvar.measurable_factual
    Causalean.PO.POSharpRDDSystem.measurable_factualY · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:66
  • measurable_YofD lemma — The treatment-specific potential outcome is measurable.
    d :
    Measurable (S.YofD d)
    Proof (Lean source)
    lemma measurable_YofD (d : Bool) : Measurable (S.YofD d) := S.Yvar.measurable_cfUnder S.Dvar d
    Causalean.PO.POSharpRDDSystem.measurable_YofD · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:68
  • measurableSet_dEvent lemma — The factual treatment event is measurable.
    d :
    MeasurableSet (S.dEvent d)
    Proof (Lean source)
    lemma measurableSet_dEvent (d : Bool) : MeasurableSet (S.dEvent d) := by simpa [dEvent] using S.Dvar.measurableSet_event d
    Causalean.PO.POSharpRDDSystem.measurableSet_dEvent · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:75
  • tendsto_nu_right_limit lemma — The chosen right-hand observable regression limit is a genuine right-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nu (𝓝[>] S.c) (𝓝 (S.nu_right_limit hA))
    Proof (Lean source)
    lemma tendsto_nu_right_limit (hA : S.Assumptions) : Tendsto hA.nu (𝓝[>] S.c) (𝓝 (S.nu_right_limit hA)) := Classical.choose_spec hA.nu_right_limit_exists
    Causalean.PO.POSharpRDDSystem.tendsto_nu_right_limit · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:127
  • tendsto_nu_left_limit lemma — The chosen left-hand observable regression limit is a genuine left-hand limit at the cutoff.
    hA :
    S.Assumptions
    Tendsto hA.nu (𝓝[<] S.c) (𝓝 (S.nu_left_limit hA))
    Proof (Lean source)
    lemma tendsto_nu_left_limit (hA : S.Assumptions) : Tendsto hA.nu (𝓝[<] S.c) (𝓝 (S.nu_left_limit hA)) := Classical.choose_spec hA.nu_left_limit_exists
    Causalean.PO.POSharpRDDSystem.tendsto_nu_left_limit · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:133
  • nu_right_limit_eq theorem — Any right-limit of ν at c coincides with μ_1 c.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nu (𝓝[>] S.c) (𝓝 L)
    L = hA.mu true S.c
    Proof (Lean source)
    theorem nu_right_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nu (𝓝[>] S.c) (𝓝 L)) : L = hA.mu true S.c := RDDLimits.oneSidedLimit_eq_right (S.nu_eq_mu_true_ae_restrict_Ici hA) (hA.mu_continuousAt true) hA.support_right h
    Causalean.PO.POSharpRDDSystem.nu_right_limit_eq · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:283
  • nu_left_limit_eq theorem — Any left-limit of ν at c coincides with μ_0 c.
    hA :
    S.Assumptions
    L :
    h :
    Tendsto hA.nu (𝓝[<] S.c) (𝓝 L)
    L = hA.mu false S.c
    Proof (Lean source)
    theorem nu_left_limit_eq (hA : S.Assumptions) {L : ℝ} (h : Tendsto hA.nu (𝓝[<] S.c) (𝓝 L)) : L = hA.mu false S.c := RDDLimits.oneSidedLimit_eq_left (S.nu_eq_mu_false_ae_restrict_Iio hA) (hA.mu_continuousAt false) hA.support_left h
    Causalean.PO.POSharpRDDSystem.nu_left_limit_eq · Causalean/PO/ID/Exact/RDD/SharpRDD.lean:293