# Optim DomainError

**URL:** https://discourse.julialang.org/t/optim-domainerror/10101
**Category:** New to Julia
**Tags:** question
**Created:** [April 1, 2018, 3:53pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101 "2018-04-01T15:53:50Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Yifan\_Liu](https://avatars.discourse-cdn.com/v4/letter/y/4da419/32.png) [@Yifan\_Liu](https://discourse.julialang.org/u/Yifan_Liu)
#### Post date: [April 1, 2018, 3:53pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/1 "2018-04-01T15:53:50Z")

</div>

I am fitting U.S. Kerosene daily price percentage change with Heston Nandi GARCH model. I use the Optim.optimize function for my MLE but got a domain error.

My code

```julia

using RData, Optim

function LoadData()
    return load("Sample.RData")["Sample"]
end

function HNGARCH(param, sample = Sample)
    
        
    lambda = param[1]
    omega = param[2]
    beta = param[3]
    alpha = param[4]
    gamma = param[5]
    delta = param[6]
    
    

    y = sample[:log_return]
    r = sample[:rf_rate]

    h1 = var(y)

    T = length(y)

    z = zeros(T)
    h = zeros(T)
    h[1] = h1

    z[1] = (y[1] - r[1] - lambda*h[1])/sqrt(h[1])

    for i = 2:T
        h[i] = omega + beta*h[i-1] + alpha*(z[i-1] - gamma*sqrt(h[i-1]))^2
        z[i] = (y[i] - r[i] - lambda*h[i])/sqrt(h[i])
    end
    
    delta = minimum(h)
    
    logL = -0.5*T*log(2*pi) - 0.5*sum(log.(h) + z.^2)

    logL_neg = -logL

    return logL_neg
end
    

function main()
    
    global Sample = LoadData()

   
   
    lower = [-Inf, 0, 0, 0, -Inf, 0]
    upper = [Inf, Inf, Inf, Inf, Inf, Inf]
    initial_param = [0.05, 0.2, 0.66, 0.3, 0.5, 0.01]
    
    res1 = optimize(HNGARCH, initial_param, lower, upper) 

   
    return res1

end 

main()

```

My data Sample looks like this:

```julia

2049×3 DataFrames.DataFrame
│ Row │ date │ log_return │ rf_rate │
├──────┼──────────────┼─────────────┼─────────┤
│ 1 │ "2010-01-05" │ 0.0 │ 0.0041 │
│ 2 │ "2010-01-06" │ 0.00368834 │ 0.004 │
│ 3 │ "2010-01-07" │ -0.00785405 │ 0.004 │
│ 4 │ "2010-01-08" │ 0.0156469 │ 0.0037 │
│ 5 │ "2010-01-11" │ -0.0156469 │ 0.0035 │
│ 6 │ "2010-01-12" │ -0.0187271 │ 0.0034 │
⋮
│ 2043 │ "2018-03-09" │ 0.0106117 │ 0.0203 │
│ 2044 │ "2018-03-12" │ -0.0111733 │ 0.0205 │
│ 2045 │ "2018-03-13" │ 0.00560226 │ 0.0203 │
│ 2046 │ "2018-03-14" │ 0.00390299 │ 0.0205 │
│ 2047 │ "2018-03-15" │ 0.00444198 │ 0.0207 │
│ 2048 │ "2018-03-16" │ 0.00882521 │ 0.0208 │
│ 2049 │ "2018-03-19" │ -0.00330033 │ 0.0208 │

```

My error message:

```julia
ERROR: DomainError:
Stacktrace:
 [1] HNGARCH(::Array{Float64,1}) at ./none:22
 [2] value(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}) at /home/Yifan/.julia/v0.6/NLSolversBase/src/interface.jl:19
 [3] update_state!(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Optim.NelderMeadState{Array{Float64,1},Float64,Array{Float64,1}}, ::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/solvers/zeroth_order/nelder_mead.jl:187
 [4] optimize(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}, ::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Void}, ::Optim.NelderMeadState{Array{Float64,1},Float64,Array{Float64,1}}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/optimize/optimize.jl:51
 [5] optimize(::NLSolversBase.NonDifferentiable{Float64,Array{Float64,1},Val{false}}, ::Array{Float64,1}, ::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Optim.Options{Float64,Void}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/optimize/optimize.jl:25
 [6] #optimize#151(::Array{Any,1}, ::Function, ::Tuple{#HNGARCH}, ::Array{Float64,1}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:62
 [7] #optimize#148(::Array{Any,1}, ::Function, ::Function, ::Array{Float64,1}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:52
 [8] optimize(::Function, ::Array{Float64,1}) at /home/Yifan/.julia/v0.6/Optim/src/multivariate/optimize/interface.jl:52
 [9] macro expansion at ./REPL.jl:97 [inlined]
 [10] (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:73

```

edit: the updated code works now

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [April 1, 2018, 4:02pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/2 "2018-04-01T16:02:36Z")

</div>

One of `h` probably becomes negative. You need to handle that somehow, either by constraints such that the function is never evaluated there or detect the situation and return something else (Inf?).

---

<div class="post-metadata">

### Author: ![Yifan\_Liu](https://avatars.discourse-cdn.com/v4/letter/y/4da419/32.png) [@Yifan\_Liu](https://discourse.julialang.org/u/Yifan_Liu)
#### Post date: [April 1, 2018, 4:07pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/3 "2018-04-01T16:07:23Z")

</div>

Thanks. I think this is the issue. How can I impose such constraints?

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [April 1, 2018, 4:25pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/4 "2018-04-01T16:25:43Z")

</div>

> [@Yifan\_Liu](#):
>
> How can I impose such constraints?

Use `Fminbox`. [Minimizing a function - Optim.jl](http://julianlsolvers.github.io/Optim.jl/latest/user/minimization/)

Edit: Oh, it’s something else that becomes negative? Well box constraints can still help if you know the general area. Also, it’s the only constraints Optim.jl has.

---

<div class="post-metadata">

### Author: ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)
#### Post date: [April 1, 2018, 4:39pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/5 "2018-04-01T16:39:29Z")

</div>

Also, loading the sample for every calculation is probably suboptiomal. Load it once, use a closure, eg

```julia
data = load(...)

function likelihood(params, data)
   ...
end

optimize(params -> likelihood(params, data), initial_params)

```

---

<div class="post-metadata">

### Author: ![Yifan\_Liu](https://avatars.discourse-cdn.com/v4/letter/y/4da419/32.png) [@Yifan\_Liu](https://discourse.julialang.org/u/Yifan_Liu)
#### Post date: [April 1, 2018, 4:52pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/6 "2018-04-01T16:52:29Z")

</div>

Yeah, I do know the constraints, but I do not know how to add this one

beta + alpha\*gamma^2 \<1

---

<div class="post-metadata">

### Author: ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)
#### Post date: [April 1, 2018, 5:04pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/7 "2018-04-01T17:04:38Z")

</div>

> [@Yifan\_Liu](#):
>
> beta + alpha\*gamma^2 \<1

Change your variables. Define `delta = beta + alpha*gamma^2`. Then `beta = delta - alpha*gamma^2`. Use `Fminbox` with the constraint that `delta<1`.

---

<div class="post-metadata">

### Author: ![Yifan\_Liu](https://avatars.discourse-cdn.com/v4/letter/y/4da419/32.png) [@Yifan\_Liu](https://discourse.julialang.org/u/Yifan_Liu)
#### Post date: [April 1, 2018, 5:35pm UTC](https://discourse.julialang.org/t/optim-domainerror/10101/8 "2018-04-01T17:35:58Z")

</div>

I tried this, but still got an domain error. So I make delta the minimum of my vector h, and constrain it to be positive, the issue is solved.
