I fit three extreme value models to annual mamima of precipitation using the Julia library Extremes.
- Model 1: stationary
- Model 2: non-stationary with years as covariate
- Model 3: non-stationary with temperature as covariate
If you use random data, you will experience the error sometimes, but sometimes not. Below is an example, which raises the error.
What causes the error? Does the error express a failed fit? The data looks not like a GEV distribution (see images below). I appreciate any help. Thank you.
Code
using Extremes
using DataFrames
df = DataFrame(
Year = 1950:2023,
Precipitation = [0.495651, 0.946367, 0.546022, 0.540578, 0.534175, 0.378817, 0.757754, 0.703223, 0.476006, 0.0851862, 0.171368, 0.425137, 0.495324, 0.378817, 0.873069, 0.50048, 0.946367, 0.500415, 0.00506373, 0.341552, 0.348604, 0.546022, 0.792541, 0.341552, 0.757754, 0.419575, 0.905448, 0.00506373, 0.500415, 0.0823318, 0.143318, 0.792541, 0.104758, 0.853249, 0.789504, 0.129651, 0.50048, 0.789504, 0.946367, 0.792541, 0.546022, 0.878545, 0.792541, 0.905448, 0.513799, 0.0851862, 0.905448, 0.799792, 0.190296, 0.878545, 0.785602, 0.495324, 0.873969, 0.703223, 0.436209, 0.873069, 0.873069, 0.446525, 0.0115384, 0.341552, 0.295142, 0.617508, 0.419575, 0.905448, 0.18504, 0.842249, 0.0510619, 0.785602, 0.799792, 0.789504, 0.418074, 0.540578, 0.789504, 0.171368],
Temperature = [0.447799, 0.613658, 0.236047, 0.518351, 0.688965, 0.0913033, 0.452838, 0.320158, 0.510309, 0.00790657, 0.00951156, 0.0939902, 0.585119, 0.0913033, 0.829481, 0.797781, 0.613658, 0.930519, 0.441482, 0.579743, 0.41028, 0.236047, 0.557033, 0.579743, 0.452838, 0.261712, 0.359162, 0.441482, 0.930519, 0.467775, 0.751947, 0.557033, 0.839668, 0.755448, 0.0485986, 0.706621, 0.797781, 0.0485986, 0.613658, 0.557033, 0.236047, 0.602792, 0.557033, 0.359162, 0.333738, 0.00790657, 0.359162, 0.870783, 0.932227, 0.602792, 0.309506, 0.585119, 0.915118, 0.320158, 0.994738, 0.829481, 0.829481, 0.301432, 0.0734843, 0.579743, 0.177626, 0.719562, 0.261712, 0.359162, 0.989634, 0.0568152, 0.599304, 0.309506, 0.870783, 0.0485986, 0.421732, 0.518351, 0.0485986, 0.00951156]
)
fm0 = gevfit(df, :Precipitation)
fm1 = gevfit(df, :Precipitation, locationcovid = [:Year])
fm2 = gevfit(df, :Precipitation, locationcovid = [:Temperature])
Output for model 1: fm0
MaximumLikelihoodAbstractExtremeValueModel
model :
BlockMaxima{GeneralizedExtremeValue}
data : Vector{Float64}[74]
location : μ ~ 1
logscale : ϕ ~ 1
shape : ξ ~ 1
θ̂ : [0.515300172038444, -1.102433064656073, -0.7512065774413803]
Output for model 2: fm1
MaximumLikelihoodAbstractExtremeValueModel
model :
BlockMaxima{GeneralizedExtremeValue}
data : Vector{Float64}[74]
location : μ ~ 1 + Year
logscale : ϕ ~ 1
shape : ξ ~ 1
θ̂ : [1.3753214813880437, -0.00043138876235357984, -1.0913167734612388, -0.7743641862377258]
Error
ERROR: DomainError with -2.220446049250313e-16:
Exponentiation yielding a complex result requires a complex argument.
Replace x^y with (x+0im)^y, Complex(x)^y, or similar.
Stacktrace:
[1] logpdf(d::Distributions.GeneralizedExtremeValue{Float64}, x::Float64)
@ Distributions ~/.julia/packages/Distributions/ji8PW/src/univariate/continuous/generalizedextremevalue.jl:195
[2] _broadcast_getindex_evalf
@ ./broadcast.jl:709 [inlined]
[3] _broadcast_getindex
@ ./broadcast.jl:682 [inlined]
[4] getindex
@ ./broadcast.jl:636 [inlined]
[5] macro expansion
@ ./broadcast.jl:1004 [inlined]
[6] macro expansion
@ ./simdloop.jl:77 [inlined]
[7] copyto!
@ ./broadcast.jl:1003 [inlined]
[8] copyto!
@ ./broadcast.jl:956 [inlined]
[9] copy
@ ./broadcast.jl:928 [inlined]
[10] materialize(bc::Base.Broadcast.Broadcasted{…})
@ Base.Broadcast ./broadcast.jl:903
[11] loglike(model::BlockMaxima{Distributions.GeneralizedExtremeValue}, θ::Vector{Float64})
@ Extremes ~/.julia/packages/Extremes/4Tbee/src/structures/AbstractExtremeValueModel.jl:107
[12] (::Extremes.var"#fobj#39"{BlockMaxima{Distributions.GeneralizedExtremeValue}})(θ::Vector{Float64})
@ Extremes ~/.julia/packages/Extremes/4Tbee/src/parameterestimation/maximumlikelihood.jl:13
[13] value(obj::NLSolversBase.NonDifferentiable{Float64, Vector{Float64}}, x::Vector{Float64})
@ NLSolversBase ~/.julia/packages/NLSolversBase/kavn7/src/interface.jl:19
[14] update_state!(f::NLSolversBase.NonDifferentiable{…}, state::Optim.NelderMeadState{…}, method::Optim.NelderMead{…})
@ Optim ~/.julia/packages/Optim/ZhuZN/src/multivariate/solvers/zeroth_order/nelder_mead.jl:263
[15] optimize(d::NLSolversBase.NonDifferentiable{…}, initial_x::Vector{…}, method::Optim.NelderMead{…}, options::Optim.Options{…}, state::Optim.NelderMeadState{…})
@ Optim ~/.julia/packages/Optim/ZhuZN/src/multivariate/optimize/optimize.jl:54
[16] optimize(d::NLSolversBase.NonDifferentiable{…}, initial_x::Vector{…}, method::Optim.NelderMead{…}, options::Optim.Options{…})
@ Optim ~/.julia/packages/Optim/ZhuZN/src/multivariate/optimize/optimize.jl:36
[17] optimize(f::Function, initial_x::Vector{Float64}; inplace::Bool, autodiff::Symbol, kwargs::@Kwargs{})
@ Optim ~/.julia/packages/Optim/ZhuZN/src/multivariate/optimize/interface.jl:91
[18] optimize
@ ~/.julia/packages/Optim/ZhuZN/src/multivariate/optimize/interface.jl:83 [inlined]
[19] fit(model::BlockMaxima{Distributions.GeneralizedExtremeValue}, initialvalues::Vector{Float64})
@ Extremes ~/.julia/packages/Extremes/4Tbee/src/parameterestimation/maximumlikelihood.jl:15
[20] fit
@ ~/.julia/packages/Extremes/4Tbee/src/parameterestimation/maximumlikelihood.jl:40 [inlined]
[21] gevfit(df::DataFrame, datacol::Symbol; locationcovid::Vector{…}, logscalecovid::Vector{…}, shapecovid::Vector{…})
@ Extremes ~/.julia/packages/Extremes/4Tbee/src/parameterestimation/maximumlikelihood/maximumlikelihood_gev.jl:121
[22] top-level scope
@ ~/Documents/Studium/Master_Hydrologie/Masterarbeit/sub-daily-precipitation-extremes/code/ModelFitting/x.jl:13
Some type information was truncated. Use `show(err)` to see complete types.
Data distribution
Distribution of precipitation:
Distribution of temperature: