Skip to content

Commit b8caa95

Browse files
committed
feat: binomial random variables (leanprover-community#28248)
Define the binomial distribution and compute the expectation, variance, conditional variance of a binomial random variable. From MiscYD
1 parent 3611c4e commit b8caa95

7 files changed

Lines changed: 196 additions & 1 deletion

File tree

Mathlib.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5964,6 +5964,7 @@ public import Mathlib.Probability.Decision.Risk.Basic
59645964
public import Mathlib.Probability.Decision.Risk.Defs
59655965
public import Mathlib.Probability.Density
59665966
public import Mathlib.Probability.Distributions.Beta
5967+
public import Mathlib.Probability.Distributions.Binomial
59675968
public import Mathlib.Probability.Distributions.Cauchy
59685969
public import Mathlib.Probability.Distributions.Exponential
59695970
public import Mathlib.Probability.Distributions.Fernique
@@ -5984,6 +5985,7 @@ public import Mathlib.Probability.Distributions.Pareto
59845985
public import Mathlib.Probability.Distributions.Poisson.Basic
59855986
public import Mathlib.Probability.Distributions.Poisson.PoissonLimitThm
59865987
public import Mathlib.Probability.Distributions.SetBernoulli
5988+
public import Mathlib.Probability.Distributions.TwoValued
59875989
public import Mathlib.Probability.Distributions.Uniform
59885990
public import Mathlib.Probability.HasLaw
59895991
public import Mathlib.Probability.HasLawExists

Mathlib/MeasureTheory/Function/ConditionalExpectation/Basic.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ theorem condExp_bot_ae_eq (f : α → E) :
276276
· rw [ae_zero]; exact eventually_bot
277277
· exact Eventually.of_forall <| congr_fun (condExp_bot' f)
278278

279+
@[simp]
279280
theorem condExp_bot [IsProbabilityMeasure μ] (f : α → E) : μ[f | ⊥] = fun _ => ∫ x, f x ∂μ := by
280281
refine (condExp_bot' f).trans ?_
281282
rw [probReal_univ, inv_one, one_smul]

Mathlib/MeasureTheory/Integral/Bochner/Set.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ theorem setIntegral_empty : ∫ x in ∅, f x ∂μ = 0 := by
144144

145145
theorem setIntegral_univ : ∫ x in univ, f x ∂μ = ∫ x, f x ∂μ := by rw [Measure.restrict_univ]
146146

147+
lemma integral_eq_setIntegral (hs : ∀ᵐ x ∂μ, x ∈ s) (f : X → E) :
148+
∫ x, f x ∂μ = ∫ x in s, f x ∂μ := by
149+
rw [← setIntegral_univ, ← setIntegral_congr_set]; rwa [ae_eq_univ]
150+
147151
theorem integral_add_compl₀ (hs : NullMeasurableSet s μ) (hfi : Integrable f μ) :
148152
∫ x in s, f x ∂μ + ∫ x in sᶜ, f x ∂μ = ∫ x, f x ∂μ := by
149153
have := setIntegral_union₀ disjoint_compl_right.aedisjoint

Mathlib/Order/Filter/Germ/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ variable {α β γ δ : Type*} {l : Filter α} {f g h : α → β}
6666
theorem const_eventuallyEq' [NeBot l] {a b : β} : (∀ᶠ _ in l, a = b) ↔ a = b :=
6767
eventually_const
6868

69-
theorem const_eventuallyEq [NeBot l] {a b : β} : ((fun _ => a) =ᶠ[l] fun _ => b) ↔ a = b :=
69+
@[simp] theorem const_eventuallyEq [NeBot l] {a b : β} : ((fun _ => a) =ᶠ[l] fun _ => b) ↔ a = b :=
7070
@const_eventuallyEq' _ _ _ _ a b
7171

7272
/-- Setoid used to define the space of germs. -/

Mathlib/Probability/CondVar.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ lemma condVar_bot_ae_eq (X : Ω → ℝ) :
155155
exact eventually_bot
156156
· exact .of_forall <| congr_fun (condVar_bot' X)
157157

158+
@[simp]
158159
lemma condVar_bot [IsProbabilityMeasure μ] (hX : AEMeasurable X μ) :
159160
Var[X; μ | ⊥] = fun _ω ↦ Var[X; μ] := by
160161
simp [condVar_bot', average_eq_integral, variance_eq_integral hX]
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/-
2+
Copyright (c) 2025 Yaël Dillies. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yaël Dillies
5+
-/
6+
module
7+
8+
public import Mathlib.Probability.CondVar
9+
public import Mathlib.Probability.Distributions.SetBernoulli
10+
public import Mathlib.Probability.Moments.Variance
11+
public import Mathlib.Probability.HasLaw
12+
13+
import Mathlib.MeasureTheory.MeasurableSpace.NCard
14+
import Mathlib.Order.Interval.Set.Nat
15+
import Mathlib.Probability.Distributions.TwoValued
16+
import Mathlib.Probability.Notation
17+
18+
/-!
19+
# Binomial random variables
20+
21+
This file defines the binomial distribution and binomial random variables,
22+
and computes their expectation and variance.
23+
24+
## Main definitions
25+
26+
* `ProbabilityTheory.binomial`:
27+
Binomial distribution on an arbitrary semiring with parameters `n` and `p`.
28+
29+
## Notation
30+
31+
`Bin(n, p)` is the binomial distribution with parameters `n` and `p` in `ℕ`.
32+
`Bin(R, n, p)` is the binomial distribution with parameters `n` and `p` in `R`.
33+
-/
34+
35+
public section
36+
37+
open MeasureTheory
38+
open scoped NNReal ProbabilityTheory unitInterval
39+
40+
namespace ProbabilityTheory
41+
variable {R Ω : Type*} [MeasurableSpace R] [AddMonoidWithOne R] {m : MeasurableSpace Ω}
42+
{P : Measure Ω} {X : Ω → R} {n : ℕ} {p : I}
43+
44+
/-- The binomial probability distribution with parameter `p`. -/
45+
@[expose]
46+
noncomputable def binomial (n : ℕ) (p : I) : Measure ℕ := setBer(Set.Iio n, p).map Set.ncard
47+
48+
/-- The binomial probability distribution with parameter `p`. -/
49+
scoped notation3 "Bin(" n ", " p ")" => binomial n p
50+
51+
/-- The binomial probability distribution with parameter `p` valued in the semiring `R`. -/
52+
scoped notation3 "Bin(" R ", " n ", " p ")" => (binomial n p).map (Nat.cast : ℕ → R)
53+
54+
instance isProbabilityMeasure_binomial : IsProbabilityMeasure Bin(n, p) :=
55+
Measure.isProbabilityMeasure_map <| by fun_prop
56+
57+
lemma ae_le_of_hasLaw_binomial {X : Ω → ℕ} (hX : HasLaw X Bin(n, p) P) : ∀ᵐ ω ∂P, X ω ≤ n := by
58+
rw [hX.ae_iff (p := (· ≤ n)) <| by fun_prop, binomial,
59+
ae_map_iff (by fun_prop) (Set.finite_Iic _).measurableSet]
60+
filter_upwards [setBernoulli_ae_subset] with s hs
61+
simpa using Set.ncard_le_ncard hs
62+
63+
/-! ### Binomial random variables -/
64+
65+
variable {X : Ω → ℝ}
66+
67+
/-- **Expectation of a binomial random variable**.
68+
69+
The expectation of a binomial random variable with parameters `n` and `p` is `pn`. -/
70+
proof_wanted integral_of_hasLaw_binomial (hX : HasLaw X Bin(ℝ, n, p) P) : P[X] = p.val * n
71+
72+
/-- **Variance of a binomial random variable**.
73+
74+
The variance of a binomial random variable with parameters `n` and `p` is `p(1 - p)n`. -/
75+
proof_wanted variance_of_hasLaw_binomial (hX : HasLaw X Bin(ℝ, n, p) P) :
76+
Var[X; P] = p * (1 - p) * n
77+
78+
/-- **Conditional variance of a binomial random variable**.
79+
80+
The conditional variance of a binomial random variable is the product of the conditional
81+
probabilities that it's equal to `0` and that it's equal to `1`. -/
82+
proof_wanted condVar_of_hasLaw_binomial {m₀ : MeasurableSpace Ω} (hm : m ≤ m₀) {P : Measure[m₀] Ω}
83+
(hX : HasLaw X Bin(ℝ, n, p) P) :
84+
Var[X; P | m] =ᵐ[P] P[X | m] * P[1 - X | m]
85+
86+
end ProbabilityTheory
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/-
2+
Copyright (c) 2024 Yaël Dillies. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Yaël Dillies
5+
-/
6+
module
7+
8+
public import Mathlib.MeasureTheory.Integral.Bochner.Basic
9+
public import Mathlib.Probability.CondVar
10+
11+
import Mathlib.Probability.Notation
12+
13+
/-!
14+
# Distributions on two values
15+
16+
This file proves a few lemmas about random variables that take at most two values.
17+
-/
18+
19+
public section
20+
21+
open MeasureTheory
22+
open scoped ProbabilityTheory
23+
24+
namespace MeasureTheory
25+
variable {Ω : Type*} {m : MeasurableSpace Ω} {X : Ω → ℝ} {μ : Measure Ω}
26+
27+
/-- If an `AEMeasurable` function is ae equal to `0` or `1`, then its integral is equal to the
28+
measure of the set where it equals `1`. -/
29+
lemma integral_of_ae_eq_zero_or_one (hXmeas : AEMeasurable X μ) (hX : ∀ᵐ ω ∂μ, X ω = 0 ∨ X ω = 1) :
30+
μ[X] = μ.real {ω | X ω = 1} := by
31+
refine (integral_map (f := id) hXmeas <| by fun_prop).symm.trans ?_
32+
rw [(Measure.ae_eq_or_eq_iff_map_eq_dirac_add_dirac hXmeas zero_ne_one).1 hX]
33+
by_cases h : μ {ω | X ω = 1} = ⊤
34+
· simp [h, Measure.real, Set.preimage, integral_undef, Integrable, HasFiniteIntegral]
35+
rw [integral_add_measure ⟨by fun_prop, by simp [HasFiniteIntegral]⟩ <|
36+
.smul_measure (by simp [integrable_dirac]) h]
37+
simp [Measure.real, Set.preimage]
38+
39+
/-- If a random variable is ae equal to `0` or `1`, then one minus its expectation is equal to the
40+
probability that it equals `0`. -/
41+
lemma integral_one_sub_of_ae_eq_zero_or_one (hXmeas : AEMeasurable X μ)
42+
(hX : ∀ᵐ ω ∂μ, X ω = 0 ∨ X ω = 1) : ∫ ω, 1 - X ω ∂μ = μ.real {ω | X ω = 0} := by
43+
calc
44+
_ = μ.real {ω | 1 - X ω = 1} :=
45+
integral_of_ae_eq_zero_or_one (aemeasurable_const (b := 1).sub hXmeas)
46+
(by simpa [sub_eq_zero, or_comm, eq_comm (a := (1 : ℝ))] using hX)
47+
_ = μ.real {ω | X ω = 0} := by simp
48+
49+
end MeasureTheory
50+
51+
52+
namespace ProbabilityTheory
53+
variable {Ω : Type*} {m : MeasurableSpace Ω} {X Y : Ω → ℝ} {μ : Measure ℝ} {P : Measure Ω}
54+
55+
/-- If a random variable is ae equal to `0` or `1`, then its conditional variance is the product of
56+
the conditional probabilities that it's equal to `0` and that it's equal to `1`. -/
57+
lemma condVar_of_ae_eq_zero_or_one {m₀ : MeasurableSpace Ω} (hm : m ≤ m₀) {μ : Measure[m₀] Ω}
58+
[IsFiniteMeasure μ] (hXmeas : AEMeasurable[m₀] X μ) (hX : ∀ᵐ ω ∂μ, X ω = 0 ∨ X ω = 1) :
59+
Var[X; μ | m] =ᵐ[μ] μ[X | m] * μ[1 - X | m] := by
60+
wlog hXmeas : Measurable[m₀] X
61+
· obtain ⟨Y, hYmeas, hXY⟩ := ‹AEMeasurable[m₀] X μ›
62+
calc
63+
Var[X; μ | m]
64+
_ =ᵐ[μ] Var[Y; μ | m] := condVar_congr_ae hXY
65+
_ =ᵐ[μ] μ[Y | m] * μ[1 - Y | m] := by
66+
refine this hm hYmeas.aemeasurable ?_ hYmeas
67+
filter_upwards [hX, hXY] with ω hXω hXYω
68+
simp [hXω, ← hXYω]
69+
_ =ᵐ[μ] μ[X | m] * μ[1 - X | m] := by
70+
refine .mul ?_ ?_ <;>
71+
exact condExp_congr_ae <| by filter_upwards [hXY] with ω hω; simp [hω]
72+
calc
73+
_ =ᵐ[μ] μ[X ^ 2 | m] - μ[X | m] ^ 2 :=
74+
condVar_ae_eq_condExp_sq_sub_sq_condExp hm <| .of_bound hXmeas.aestronglyMeasurable 1 <| by
75+
filter_upwards [hX]; rintro ω (hω | hω) <;> simp [hω]
76+
_ =ᵐ[μ] μ[X | m] - μ[X | m] ^ 2 := by
77+
refine .sub ?_ ae_eq_rfl
78+
exact condExp_congr_ae <| by filter_upwards [hX]; rintro ω (hω | hω) <;> simp [hω]
79+
_ =ᵐ[μ] μ[X | m] * μ[1 - X | m] := by
80+
rw [sq, ← one_sub_mul, mul_comm]
81+
refine .mul ae_eq_rfl ?_
82+
calc
83+
1 - μ[X | m]
84+
_ = μ[1 | m] - μ[X | m] := by simp [Pi.one_def, hm]
85+
_ =ᵐ[μ] μ[1 - X | m] := by
86+
refine (condExp_sub (integrable_const _)
87+
(.of_bound (C := 1) hXmeas.aestronglyMeasurable ?_) _).symm
88+
filter_upwards [hX]
89+
rintro ω (hω | hω) <;> simp [hω]
90+
91+
/-- If a random variable is ae equal to `0` or `1`, then its variance is the product of
92+
the probabilities that it's equal to `0` and that it's equal to `1`. -/
93+
lemma variance_of_ae_eq_zero_or_one {μ : Measure Ω} [IsZeroOrProbabilityMeasure μ]
94+
(hXmeas : AEMeasurable X μ) (hX : ∀ᵐ ω ∂μ, X ω = 0 ∨ X ω = 1) :
95+
Var[X; μ] = μ.real {ω | X ω = 0} * μ.real {ω | X ω = 1} := by
96+
obtain rfl | hμ := eq_zero_or_isProbabilityMeasure μ
97+
· simp
98+
simpa [Pi.mul_def, integral_of_ae_eq_zero_or_one, integral_one_sub_of_ae_eq_zero_or_one, mul_comm,
99+
*] using condVar_of_ae_eq_zero_or_one bot_le hXmeas hX
100+
101+
end ProbabilityTheory

0 commit comments

Comments
 (0)