# Compute integral of a beta distribution

**URL:** <https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607>\
**Category:** Statistics\
**Created:** [December 30, 2020, 10:15am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607 "2020-12-30T10:15:04Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![TBu](https://avatars.discourse-cdn.com/v4/letter/t/839c29/32.png) [@TBu](https://discourse.julialang.org/u/TBu)\
**Post date:** [December 30, 2020, 10:15am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/1 "2020-12-30T10:15:04Z")

</div>

Hi everyone,

I used the `Distributions` package in order to generate a beta distribution, which works quite nicely:

```julia
using Distributions
d = Beta(10,15)

```

However - is it possible to integrate over an interval of the distribution? I’m looking for a Julia equivalent to R’s `integrate` function which allows something like:

```julia
integrate(function(p) dbeta(p, 10, 15), 0, 0.5)

```

Any hints on where to look are appreciated!

Regards,

Thomas

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [December 30, 2020, 10:24am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/2 "2020-12-30T10:24:15Z")

</div>

I don’t know any R so I’m not sure what algorithm the `integrate` function uses, but have you tried [QuadGK.jl](https://github.com/JuliaMath/QuadGK.jl)?

```julia
using QuadGK
integral, err = quadgk(x->pdf(d,x),0,0.5)

```

gives

```julia
julia> integral, err = quadgk(x->pdf(d,x),0,0.5)
(0.8462718725204469, 2.8282575934013288e-9)

```

Here, `x->pdf(d,x)` is an anonymous function that represents the probability density function ([pdf](https://juliastats.org/Distributions.jl/latest/matrix/#Distributions.pdf-Union%7BTuple%7BT%7D,%20Tuple%7BDistribution%7BMatrixvariate,S%7D%20where%20S%3C:ValueSupport,AbstractArray%7BT,2%7D%7D%7D%20where%20T%3C:Real) in Distributions.jl).

This is what I get in Mathematica:

 ![Screenshot 2020-12-30 at 11.28.56](https://global.discourse-cdn.com/julialang/original/3X/5/4/542d9a08b4dae9d8442868d169fce06c00a1e04c.png)

---

<div class="post-metadata">

**Author:** ![TBu](https://avatars.discourse-cdn.com/v4/letter/t/839c29/32.png) [@TBu](https://discourse.julialang.org/u/TBu)\
**Post date:** [December 30, 2020, 10:31am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/3 "2020-12-30T10:31:00Z")

</div>

Thanks crstnbr,

that works like a charm!

Regards,

Thomas

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [December 30, 2020, 10:45am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/4 "2020-12-30T10:45:25Z")

</div>

This seems like a job for the `cdf` function:

```julia
julia> p = Beta(10, 15)
Beta{Float64}(α=10.0, β=15.0)

julia> cdf(p, 0.5) - cdf(p, 0)
0.8462718725204467

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [December 30, 2020, 10:49am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/5 "2020-12-30T10:49:42Z")

</div>

It’s way faster too:

```julia
julia> using BenchmarkTools

julia> @btime integral, err = quadgk(x->pdf($p,x),0,0.5);
  8.000 μs (34 allocations: 912 bytes)

julia> @btime cdf($p, 0.5) - cdf($p, 0);
  321.267 ns (0 allocations: 0 bytes)

```

---

<div class="post-metadata">

**Author:** ![TBu](https://avatars.discourse-cdn.com/v4/letter/t/839c29/32.png) [@TBu](https://discourse.julialang.org/u/TBu)\
**Post date:** [December 30, 2020, 11:07am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/6 "2020-12-30T11:07:09Z")

</div>

Thanks, DNF,

the difference in speed in this case will definitely something I’ll have to consider.

Regards,

Thomas

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [December 30, 2020, 11:10am UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/7 "2020-12-30T11:10:35Z")

</div>

To clarify, it’s not just faster, it should also be more accurate and more ‘correct’.

The cumulative distribution function is _defined_ to be the integral of the probability density function. The `QuadGK` code is using numerical quadrature to _approximate_ the CDF. It’s of course better to directly use the known analytical expression for the CDF, which is what the `cdf` function does.

As a bonus, you don’t need to import an extra package.

BTW, I’m not familiar with R, but I’m pretty sure this is how you should do it in R too.

---

<div class="post-metadata">

**Author:** ![stla](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stla/32/20382_2.png) [@stla](https://discourse.julialang.org/u/stla)\
**Post date:** [December 30, 2020, 12:40pm UTC](https://discourse.julialang.org/t/compute-integral-of-a-beta-distribution/52607/8 "2020-12-30T12:40:54Z")

</div>

Indeed, in R you would use `pbeta(0.5, 10, 15)`, not a numerical integration.
