@@ -14,7 +14,7 @@ function estimators(
1414 throw (ArgumentError (" Δ is $Δ but must be non negative" ))
1515 end
1616 if Δ == 0
17- Δ = floor (Int, log (length (data)))
17+ Δ = max ( 1 , floor (Int, log (length (data) )))
1818 end
1919
2020 N, T = size (data)
@@ -25,11 +25,11 @@ function estimators(
2525 Z̄_T = mean (Z_T)
2626 m̂ = Z̄_T / T
2727 v̂ = (N) * (T + 1 ) * T^ (- 3 ) * (mean (Z_T .^ 2 ) - T / (T + 1 ) * (Z̄_T + Z̄_T^ 2 ))
28- WΔ = 0.
28+ WΔ = 0.0
2929 for iter in 1 : div (T, Δ)
3030 WΔ += (N) / T * (sum (∑X[(1 + (iter - 1 ) * Δ): (iter * Δ)]) / (N) - Δ * m̂)^ 2
3131 end
32- W2Δ = 0.
32+ W2Δ = 0.0
3333 for iter in 1 : div (T, 2 * Δ)
3434 W2Δ +=
3535 (N) / T *
@@ -58,13 +58,13 @@ function estimators(
5858 ŵ = Float64[]
5959 for Δ in Δvec
6060 if Δ == 0
61- Δ = floor (Int, log (length (data)))
61+ Δ = max ( 1 , floor (Int, log (length (data) )))
6262 end
63- WΔ = 0.
63+ WΔ = 0.0
6464 for iter in 1 : div (T, Δ)
6565 WΔ += (N) / T * (sum (∑X[(1 + (iter - 1 ) * Δ): (iter * Δ)]) / (N) - Δ * m̂)^ 2
6666 end
67- W2Δ = 0.
67+ W2Δ = 0.0
6868 for iter in 1 : div (T, 2 * Δ)
6969 W2Δ +=
7070 (N) / T *
@@ -103,10 +103,13 @@ function Distributions.fit(
103103end
104104
105105# # Auxiliary functions
106+ _safe_bernoulli_variance (m:: Float64 ) = max (eps (Float64), m * (1 - m))
107+
106108function ϕ (m:: Float64 , v:: Float64 , w_or_d:: Float64 , r₊:: Float64 ):: Tuple{Float64,Float64}
107109 r₋ = 1 - r₊
110+ mvar = _safe_bernoulli_variance (m)
108111 if abs (r₊ - r₋) < 1e-3
109- ϕ₁ = w_or_d / (m * ( 1 - m)) - 1
112+ ϕ₁ = w_or_d / mvar - 1
110113 else
111114 ϕ₁ = (1 - w_or_d)^ 2 / (r₊ - r₋)^ 2
112115 end
@@ -118,7 +121,9 @@ function ϕ(m::Float64, v::Float64, w_or_d::Float64, r₊::Float64)::Tuple{Float
118121 return ϕ₁, ϕ₂
119122end
120123
121- function Φ_aux (m:: Float64 , v:: Float64 , w_or_d:: Float64 , r₊:: Float64 ):: Tuple{Float64,Float64,Float64}
124+ function Φ_aux (
125+ m:: Float64 , v:: Float64 , w_or_d:: Float64 , r₊:: Float64
126+ ):: Tuple{Float64,Float64,Float64}
122127 r₋ = 1 - r₊
123128 ϕ₁, ϕ₂ = ϕ (m, v, w_or_d, r₊)
124129 Φ₁ = m * (1 - (r₊ - r₋) * sqrt (ϕ₁)) - r₋ * sqrt (ϕ₁)
@@ -135,11 +140,12 @@ end
135140
136141function Φ (m:: Float64 , v:: Float64 , w:: Float64 , r₊:: Float64 ):: Tuple{Float64,Float64,Float64}
137142 r₋ = 1 - r₊
143+ mvar = _safe_bernoulli_variance (m)
138144 if abs (r₊ - r₋) < 1e-3
139145 return Φ_aux (m, v, w, r₊)
140146 end
141147
142- κ = (r₊ - r₋)^ 2 * w / (m * ( 1 - m))
148+ κ = (r₊ - r₋)^ 2 * w / mvar
143149
144150 if abs (κ - 4 * r₊ * r₋) < 1e-3
145151 d = (8 * r₊ * r₋)^ (- 1 )
@@ -197,7 +203,9 @@ function distance2admissibleset(μ::Float64, λ::Float64, p::Float64)::Float64
197203 return d1 + d2 + d3
198204end
199205
200- function projection2admissibleset (μ:: Float64 , λ:: Float64 , p:: Float64 ):: Tuple{Float64,Float64,Float64}
206+ function projection2admissibleset (
207+ μ:: Float64 , λ:: Float64 , p:: Float64
208+ ):: Tuple{Float64,Float64,Float64}
201209 λ = min (1 , max (0 , λ))
202210 p = min (1 , max (0 , p))
203211 μ = min (λ, max (0 , μ))
0 commit comments