Skip to content

Commit b9fcdf5

Browse files
committed
First take on cleaning up EmpiricalUnivariateDistribution
1 parent 8b3bac1 commit b9fcdf5

File tree

6 files changed

+61
-78
lines changed

6 files changed

+61
-78
lines changed

src/Distributions.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,6 @@ include("genericfit.jl")
268268

269269
# specific samplers and distributions
270270
include("univariates.jl")
271-
include("empirical.jl")
272271
include("edgeworth.jl")
273272
include("multivariates.jl")
274273
include("matrixvariates.jl")

src/empirical.jl

Lines changed: 0 additions & 76 deletions
This file was deleted.

src/univariate/discrete/empirical.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
struct EmpiricalUnivariateDistribution <: DiscreteUnivariateDistribution
2+
values::Vector{Float64}
3+
cdf::Function
4+
end
5+
6+
@distr_support EmpiricalUnivariateDistribution d.values[1] d.values[end]
7+
8+
EmpiricalUnivariateDistribution(x::Vector) = EmpiricalUnivariateDistribution(sort(x), ecdf(x))
9+
10+
for f in (:entropy, :mean, :var, :skewness, :kurtosis)
11+
@eval ($f)(d::EmpiricalUnivariateDistribution) = ($f)(d.values)
12+
end
13+
14+
function median(d::DiscreteUnivariateDistribution)
15+
v = d.values
16+
n = length(v)
17+
return (v[(n + 1) >> 1] + v[(n + 2) >> 1]) / 2
18+
end
19+
20+
### Evaluation
21+
22+
cdf(d::EmpiricalUnivariateDistribution, x::Real) = d.cdf(x)
23+
24+
pdf(d::EmpiricalUnivariateDistribution, x::Real) = mean(t -> t == x, d.values)
25+
26+
quantile(d::EmpiricalUnivariateDistribution, p::Real) = quantile(d.values, p)
27+
28+
function rand(d::EmpiricalUnivariateDistribution)
29+
d.values[rand(1:length(d.values))]
30+
end

src/univariates.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,6 +610,7 @@ const discrete_distributions = [
610610
"binomial",
611611
"categorical",
612612
"discreteuniform",
613+
"empirical",
613614
"geometric",
614615
"hypergeometric",
615616
"negativebinomial",

test/empirical.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using Distributions, Base.Test
2+
3+
@testset "EmpiricalUnivariateDistribution" begin
4+
n = 100
5+
r = MersenneTwister(123)
6+
@testset "$d data" for (d, x) in (("discrete" , rand( r, 1:10, n)),
7+
("continuous", randn(r, n)))
8+
X = EmpiricalUnivariateDistribution(x)
9+
10+
@testset "test function: $f" for f in (mean, var, std, skewness, kurtosis, median, entropy)
11+
@test f(X) f(x)
12+
end
13+
14+
ecdfx = StatsBase.ecdf(x)
15+
@testset "cdf" for t in linspace(-10, 10, 100)
16+
@test cdf(X, t) == ecdfx(t)
17+
@test cdf(X, t) == mean(x -> x <= t, x)
18+
end
19+
20+
@testset "quantile" for q in linspace(0, 1, 100)
21+
@test quantile(X, q) == quantile(x, q)
22+
end
23+
24+
@testset "pdf" begin
25+
@test sum(t -> pdf(X, t), unique(x)) 1
26+
end
27+
end
28+
end

test/runtests.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ tests = [
2727
"gradlogpdf",
2828
"truncate",
2929
"noncentralt",
30-
"locationscale"]
30+
"locationscale",
31+
"empirical"]
3132

3233
print_with_color(:blue, "Running tests:\n")
3334

0 commit comments

Comments
 (0)