Ce serveur Gitlab sera éteint le 30 juin 2020, pensez à migrer vos projets vers les serveurs gitlab-research.centralesupelec.fr et gitlab-student.centralesupelec.fr !

Commit 102053bd by John Myles White

### Add skewness and kurtosis for FDist. Fix pventropy calls.

parent 9fe5faa4
REQUIRE 0 → 100644
 NumericExtensions Stats
 module Distributions using NumericExtensions using Stats export # types ... ... @@ -124,7 +125,7 @@ export # types import Base.mean, Base.median, Base.quantile import Base.rand, Base.std, Base.var, Base.cor, Base.cov import Base.show, Base.sprand import Stats.kurtosis, Stats.skewness import Stats.kurtosis, Stats.skewness, Stats.modes include("drawtable.jl") include("huffman.jl") ... ...
 ... ... @@ -32,7 +32,7 @@ end Multinomial(d::Integer) = Multinomial(1, d) entropy(d::Multinomial) = pventropy(d.prob) entropy(d::Multinomial) = NumericExtensions.entropy(d.prob) function insupport{T <: Real}(d::Multinomial, x::Vector{T}) n = length(x) ... ...
 ... ... @@ -25,7 +25,7 @@ function cdf(d::Categorical, x::Integer) end end entropy(d::Categorical) = pventropy(d.prob) entropy(d::Categorical) = NumericExtensions.entropy(d.prob) function insupport(d::Categorical, x::Real) return isinteger(x) && 1 <= x <= length(d.prob) && d.prob[x] != 0.0 ... ...
 ... ... @@ -16,6 +16,15 @@ insupport(d::FDist, x::Number) = isreal(x) && isfinite(x) && 0.0 <= x mean(d::FDist) = 2.0 < d.ddf ? d.ddf / (d.ddf - 2.0) : NaN median(d::FDist) = quantile(d, 0.5) function modes(d::FDist) if d.ndf <= 2 error("The F distribution has no modes when ndf <= 2") end return [(d.ndf - 2) / d.ndf * d.ddf / (d.ddf + 2)] end function var(d::FDist) if 4.0 < d.ddf return 2.0 * d.ddf^2 * ... ... @@ -26,6 +35,23 @@ function var(d::FDist) end end function skewness(d::FDist) if d.ddf <= 6 error("Skewness not defined when ddf <= 6") end return (2 * d.ndf + d.ddf - 2) * sqrt(8 * (d.ddf - 4)) / ((d.ddf - 6) * sqrt(d.ndf * (d.ndf + d.ddf - 2))) end function kurtosis(d::FDist) if d.ddf <= 8 error("Kurtosis not defined when ddf <= 8") end a = d.ndf * (5 * d.ddf - 22) * (d.ndf + d.ddf - 2) + (d.ddf - 4) * (d.ddf - 2)^2 b = d.ndf * (d.ddf - 6) * (d.ddf - 8) * (d.ndf + d.ddf - 2) return 12 * a / b end entropy(d::FDist) = (log(d.ddf) -log(d.ndf) +lgamma(0.5*d.ndf) +lgamma(0.5*d.ddf) -lgamma(0.5*(d.ndf+d.ddf)) ... ...
 ... ... @@ -45,7 +45,9 @@ for d in [Arcsine(), Erlang(17.0), Exponential(1.0), Exponential(5.1), # FDist(2, 21), # Entropy wrong FDist(9, 9), FDist(9, 21), FDist(21, 9), Gamma(3.0, 2.0), Gamma(2.0, 3.0), Gamma(3.0, 3.0), ... ... @@ -137,7 +139,7 @@ for d in [Arcsine(), # Because of the Weak Law of Large Numbers, # empirical mean should be close to theoretical value if isfinite(mu) if sigma > 0.0 if isfinite(sigma) && sigma > 0.0 @assert abs(mu - mu_hat) / sigma < 1e-0 else @assert abs(mu - mu_hat) < 1e-1 ... ... @@ -180,6 +182,8 @@ for d in [Arcsine(), if insupport(d, m_hat) && isa(d, ContinuousDistribution) if isa(d, Cauchy) || isa(d, Laplace) @assert abs(m - m_hat) / d.scale < 1e-0 elseif isa(d, FDist) println("Skipping median test for FDist") else # @assert norm(m - m_hat, Inf) < 1e-1 @assert abs(m - m_hat) / sigma < 1e-0 ... ... @@ -210,7 +214,7 @@ for d in [Arcsine(), # Because of the Weak Law of Large Numbers, # empirical covariance matrix should be close to theoretical value if isfinite(mu) if isfinite(mu) && isfinite(sigma) if sigma > 0.0 @assert abs(sigma - sigma_hat) / sigma < 1e-0 else ... ... @@ -223,7 +227,7 @@ for d in [Arcsine(), # Because of the Weak Law of Large Numbers, # empirical skewness should be close to theoretical value if isfinite(mu) if isfinite(mu) && isfinite(sk) if sk > 0.0 @assert abs(sk - sk_hat) / sigma < 1e-0 else ... ... @@ -231,7 +235,12 @@ for d in [Arcsine(), end end if isfinite(mu) # Empirical kurtosis is very unstable for FDist if isa(d, FDist) continue end if isfinite(mu) && isfinite(k) if k > 0.0 @assert abs(k - k_hat) / abs(k) < 1e-0 else ... ...
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment