# Using truncation in MixtureModel

**URL:** https://discourse.julialang.org/t/using-truncation-in-mixturemodel/103893
**Category:** New to Julia
**Tags:** question, distributions
**Created:** [September 15, 2023, 12:58pm UTC](https://discourse.julialang.org/t/using-truncation-in-mixturemodel/103893 "2023-09-15T12:58:01Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![Sahil\_Khan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/sahil_khan/32/47573_2.png) [@Sahil\_Khan](https://discourse.julialang.org/u/Sahil_Khan)
#### Post date: [September 15, 2023, 12:58pm UTC](https://discourse.julialang.org/t/using-truncation-in-mixturemodel/103893/1 "2023-09-15T12:58:01Z")

</div>

Can we also use truncation here?

```julia
MixtureModel(Normal[
   Normal(-2.0, 1.2),
   Normal(0.0, 1.0),
   Normal(3.0, 2.5)])

```

I was trying with some truncated distributions and it gives error. These distributions are obtained from fitting Normal distribution to a vector and then truncate them.

Error:

```julia
ERROR: MethodError: Cannot `convert` an object of type 
  Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64} to an object of type 
  Normal

Closest candidates are:
  convert(::Type{Normal}, ::NormalCanon)
   @ Distributions ~/.julia/packages/Distributions/Ufrz2/src/univariate/continuous/normalcanon.jl:34
  convert(::Type{T}, ::T) where T
   @ Base Base.jl:64

Stacktrace:
 [1] setindex!(A::Vector{Normal}, x::Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}, i1::Int64)
   @ Base ./array.jl:969
 [2] getindex(::Type{Normal}, ::Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}, ::Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}, ::Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}, ::Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}, ::Vararg{Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}})
   @ Base ./array.jl:403
 [3] top-level scope
   @ ~/PhD/Program_Julia/code/fitting_dist.jl:25

```

---

<div class="post-metadata">

### Author: ![vettert](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vettert/32/30599_2.png) [@vettert](https://discourse.julialang.org/u/vettert)
#### Post date: [September 15, 2023, 1:54pm UTC](https://discourse.julialang.org/t/using-truncation-in-mixturemodel/103893/2 "2023-09-15T13:54:17Z")

</div>

Haven’t tried it, but maybe truncating each component distribution and then creating the mixture model from the truncated distributions is possible? (So, reverse order of the steps you are doing)

---

<div class="post-metadata">

### Author: ![skleinbo](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/skleinbo/32/36080_2.png) [@skleinbo](https://discourse.julialang.org/u/skleinbo)
#### Post date: [September 15, 2023, 1:59pm UTC](https://discourse.julialang.org/t/using-truncation-in-mixturemodel/103893/3 "2023-09-15T13:59:56Z")

</div>

Works just fine without coercing the vector of components to have element type `Normal` 🙂

```julia
julia> comps = truncated.([
          Normal(-2.0, 1.2),
             Normal(0.0, 1.0),
                Normal(3.0, 2.5)], upper=2.0, lower=-2.0)
3-element Vector{Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}}:
 Truncated(Normal{Float64}(μ=-2.0, σ=1.2); lower=-2.0, upper=2.0)
 Truncated(Normal{Float64}(μ=0.0, σ=1.0); lower=-2.0, upper=2.0)
 Truncated(Normal{Float64}(μ=3.0, σ=2.5); lower=-2.0, upper=2.0)

julia> MixtureModel(comps)
MixtureModel{Truncated{Normal{Float64}, Continuous, Float64, Float64, Float64}}(K = 3)
components[1] (prior = 0.3333): Truncated(Normal{Float64}(μ=-2.0, σ=1.2); lower=-2.0, upper=2.0)
components[2] (prior = 0.3333): Truncated(Normal{Float64}(μ=0.0, σ=1.0); lower=-2.0, upper=2.0)
components[3] (prior = 0.3333): Truncated(Normal{Float64}(μ=3.0, σ=2.5); lower=-2.0, upper=2.0)

```
