I’d like to have some more reasonable uncertainty bounds on the GP means, e.g. something at least wider than 1e-7, which seems like too strong a statement about the lack of structure in the data – I’m reluctant to say “the mean is definitely near-exactly zero over the whole period”.
I tried to use DynamicHMC to see if that might help widen the confidence bounds on the mean. I’m not actually sure if it’s likely to produce better uncertainty, or even if it’s likely to have acceptable performance.
Either way, I must be misunderstanding how to use something. I tried doing it with ParameterHandling and got an error. If you happen to have a moment to see what I’m doing wrong, the codes and errors are below.
using CSV, DataFrames, TemporalGPs, AbstractGPs, KernelFunctions, ParameterHandling, Optim, Zygote, ProgressMeter, ThreadsX, Random, DynamicHMC, LogDensityProblems, Distributions
df = CSV.read("$datadir/interim/diagnostic_timeseries.csv", DataFrame) .|> identity
kernel(params, basekernel) = params.s_kernel^2 * (params.λ * basekernel + ConstantKernel())
build_model(params, basekernel) = to_sde(GP(kernel(params, basekernel)), SArrayStorage(Float64))
function makeloglik(df, θ₀, basekernel)
θ_flat_init, unflatten = ParameterHandling.flatten(θ₀)
unpack(θ_flat) = ParameterHandling.value(unflatten(θ_flat))
ll(θ_flat) = let
θ = unpack(θ_flat)
f = build_model(θ, basekernel)
logpdf(f(df.days_after, θ.s_noise), df.y)
end
end
basekernel = Matern32Kernel()
θ₀ = (;s_kernel=positive(.05), λ=positive(1/10), s_noise=positive(3.))
loglik = makeloglik(df, θ₀, basekernel)
logprior(params) = sum(loglikelihood.(Exponential(1.0), params))
function LogDensityProblems.logdensity(ℓ::typeof(loglik), params)
ℓ(params) + logprior(params)
end
LogDensityProblems.dimension(::typeof(loglik)) = 3
function LogDensityProblems.capabilities(::Type{<:typeof(loglik)})
return LogDensityProblems.LogDensityOrder{0}()
end
n_samples = 2_000
samples =
mcmc_with_warmup(
Random.GLOBAL_RNG,
ADgradient(:ForwardDiff, loglik),
n_samples;
reporter=NoProgressReport(),
)
LoadError: MethodError: no method matching (::ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}})(::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#14"{DataFrame, Matern32Kernel{Distances.Euclidean}, var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}}, Float64}, Float64, 3}})
Closest candidates are:
(::ParameterHandling.var"#unflatten_to_NamedTuple#16"{T})(::Vector{T}) where T at ~/.julia/packages/ParameterHandling/nG33f/src/flatten.jl:87
Stacktrace:
[1] (::var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}})(θ_flat::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#14"{DataFrame, Matern32Kernel{Distances.Euclidean}, var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}}, Float64}, Float64, 3}})
@ Main ~/gpdemo-bayes.jl:14
[2] (::var"#ll#14"{DataFrame, Matern32Kernel{Distances.Euclidean}, var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}})(θ_flat::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#14"{DataFrame, Matern32Kernel{Distances.Euclidean}, var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}}, Float64}, Float64, 3}})
@ Main ~/gpdemo-bayes.jl:16
[3] logdensity(ℓ::var"#ll#14"{DataFrame, Matern32Kernel{Distances.Euclidean}, var"#unpack#13"{ParameterHandling.var"#unflatten_to_NamedTuple#16"{Float64, NamedTuple{(:s_kernel, :λ, :s_noise), Tuple{ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.Positive{Float64, typeof(exp), Float64}}}, ParameterHandling.var"#unflatten_to_Tuple#14"{Float64, Tuple{Int64, Int64, Int64}, Tuple{Int64, Int64, Int64}, Tuple{ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}, ...DualAveraging{Float64}}}, algorithm::DynamicHMC.NUTS{Val{:generalized}}, .Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}, ParameterHandling.var"#unflatten_Positive#24"{Float64, ParameterHandling.Positive{Float64, typeof(exp), Float64}, ParameterHandling.var"#unflatten_to_Real#2"{Float64, Float64}}}}}}}}, Float64}, Float64, 3}}})
@ Forreporter::NoProgressReport)
@ DynamicHMC ~/.julia/packages/DynamicHMC/x07K9/src/mcmc.jl:547
[16] top-level scope
and I also tried without ParameterHandling
using CSV, DataFrames, TemporalGPs, AbstractGPs, KernelFunctions, ParameterHandling, Optim, Zygote, ProgressMeter, ThreadsX, Random, DynamicHMC, LogDensityProblems, Distributions
df = CSV.read("$datadir/interim/diagnostic_timeseries.csv", DataFrame) .|> identity
kernel(params, basekernel) = params[1]^2 * (params[2] * basekernel + ConstantKernel())
build_model(params, basekernel) = to_sde(GP(kernel(params, basekernel)), SArrayStorage(Float64))
function makeloglik(df, basekernel)
ll(θ) = let
f = build_model(θ, basekernel)
logpdf(f(df.x, θ[3]), df.y)
end
end
basekernel = Matern32Kernel()
θ₀ = (;s_kernel=positive(.05), λ=positive(1/10), s_noise=positive(3.))
loglik = makeloglik(df, basekernel)
logprior(params) = sum(loglikelihood.(Exponential(1.0), params))
function LogDensityProblems.logdensity(ℓ::typeof(loglik), params)
ℓ(params) + logprior(params)
end
LogDensityProblems.dimension(::typeof(loglik)) = 3
function LogDensityProblems.capabilities(::Type{<:typeof(loglik)})
return LogDensityProblems.LogDensityOrder{0}()
end
n_samples = 2_000
samples =
mcmc_with_warmup(
Random.GLOBAL_RNG,
ADgradient(:ForwardDiff, loglik),
n_samples;
reporter=NoProgressReport(),
)
ArgumentError: ScaledKernel: σ² = Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}}(-1.5325166874186795,0.0,1.0,0.0) does not satisfy the constraint σ² > 0.
Stacktrace:
[1] macro expansion
@ ~/.julia/packages/KernelFunctions/hnfwW/src/utils.jl:5 [inlined]
[2] ScaledKernel
@ ~/.julia/packages/KernelFunctions/hnfwW/src/kernels/scaledkernel.jl:20 [inlined]
[3] *
@ ~/.julia/packages/KernelFunctions/hnfwW/src/kernels/scaledkernel.jl:64 [inlined]
[4] kernel(params::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}, basekernel::Matern32Kernel{Distances.Euclidean})
@ Main ~/gpdemo-bayes-raw.jl:7
[5] build_model
@ ~/gpdemo-bayes-raw.jl:9 [inlined]
[6] (::var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}})(θ::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}})
@ Main ~/gpdemo-bayes-raw.jl:14
[7] logdensity(ℓ::var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}, params::Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}})
@ Main ~/gpdemo-bayes-raw.jl:27
[8] #46
@ ~/.julia/packages/LogDensityProblems/tWBzE/src/AD_ForwardDiff.jl:20 [inlined]
[9] vector_mode_dual_eval!
@ ~/.julia/packages/ForwardDiff/pDtsf/src/apiutils.jl:37 [inlined]
[10] vector_mode_gradient!(result::DiffResults.MutableDiffResult{1, Float64, Tuple{Vector{Float64}}}, f::LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, x::Vector{Float64}, cfg::ForwardDiff.GradientConfig{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}})
@ ForwardDiff ~/.julia/packages/ForwardDiff/pDtsf/src/gradient.jl:113
[11] gradient!
@ ~/.julia/packages/ForwardDiff/pDtsf/src/gradient.jl:37 [inlined]
[12] gradient!
@ ~/.julia/packages/ForwardDiff/pDtsf/src/gradient.jl:35 [inlined]
[13] logdensity_and_gradient
@ ~/.julia/packages/LogDensityProblems/tWBzE/src/AD_ForwardDiff.jl:50 [inlined]
[14] evaluate_ℓ(ℓ::LogDensityProblems.ForwardDiffLogDensity{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}, ForwardDiff.GradientConfig{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}}}, q::Vector{Float64})
@ DynamicHMC ~/.julia/packages/DynamicHMC/x07K9/src/hamiltonian.jl:195
[15] #initialize_warmup_state#25
@ ~/.julia/packages/DynamicHMC/x07K9/src/mcmc.jl:125 [inlined]
[16] initialize_warmup_state(rng::Random._GLOBAL_RNG, ℓ::LogDensityProblems.ForwardDiffLogDensity{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}, ForwardDiff.GradientConfig{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}}})
@ DynamicHMC ~/.julia/packages/DynamicHMC/x07K9/src/mcmc.jl:123
[17] mcmc_keep_warmup(rng::Random._GLOBAL_RNG, ℓ::LogDensityProblems.ForwardDiffLogDensity{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}, ForwardDiff.GradientConfig{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}}}, N::Int64; initialization::Tuple{}, warmup_stages::Tuple{InitialStepsizeSearch, TuningNUTS{Nothing, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{Nothing, DualAveraging{Float64}}}, algorithm::DynamicHMC.NUTS{Val{:generalized}}, reporter::NoProgressReport)
@ DynamicHMC ~/.julia/packages/DynamicHMC/x07K9/src/mcmc.jl:496
[18] macro expansion
@ ~/.julia/packages/UnPack/EkESO/src/UnPack.jl:100 [inlined]
[19] mcmc_with_warmup(rng::Random._GLOBAL_RNG, ℓ::LogDensityProblems.ForwardDiffLogDensity{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}, ForwardDiff.GradientConfig{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3, Vector{ForwardDiff.Dual{ForwardDiff.Tag{LogDensityProblems.var"#46#47"{var"#ll#5"{DataFrame, Matern32Kernel{Distances.Euclidean}}}, Float64}, Float64, 3}}}}, N::Int64; initialization::Tuple{}, warmup_stages::Tuple{InitialStepsizeSearch, TuningNUTS{Nothing, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{LinearAlgebra.Diagonal, DualAveraging{Float64}}, TuningNUTS{Nothing, DualAveraging{Float64}}}, algorithm::DynamicHMC.NUTS{Val{:generalized}}, reporter::NoProgressReport)
@ DynamicHMC ~/.julia/packages/DynamicHMC/x07K9/src/mcmc.jl:547
[20] top-level scope