The Hessian after optimization is not even close to symmetric; for example the 1, 2 element is 16.7 while the 2, 1 element is 1.4. The 12, 13 element is -3945 and 13, 12 is -16 (I’m rounding the numbers).
I’m using autodifferentiation, and so exactly where things are going wrong is unclear. These gross asymmetries appear only when Newton()
is the optimization method; BFGS()
does not (by eye) have them. Both methods produce essentially the same solution, though BFGS
reports convergence failure. BFGS
produces generally larger standard error estimates, and no negative variances.
Or maybe num_hess
in the code below is just a reference to f
, the latter gets garbage-collected, and a reference to random memory is left?
I’m using development code for StatsModels 0.6, though I haven’t updated it in a couple of weeks.
This may be related to my older, though still open, report of asymmetry (https://github.com/JuliaMath/Calculus.jl/issues/91), but that was in a much different context. And in my old report the asymmetry was small. See also https://github.com/JuliaDiff/ForwardDiff.jl/issues/253#issue-252103867.
This is not a nice, self-contained example, but the key code is
using DataFrames, StatsModels
using NamedArrays
using Optim, NLSolversBase
using LinearAlgebra # for dot
function mysolve(formula, df, weight=nothing)::AbstractResult
nsamp = size(df, 1)
if isnothing(weight)
w = ones(nsamp)
else
w = nsamp/sum(weight)*weight
end
xp = prep(formula, df, w)
myll(β) = -myllike(β, xp)
f = TwiceDifferentiable(myll, zeros(size(xp.mm, 2)); autodiff=:forward)
r = optimize(f, zeros(size(xp.mm, 2)), Newton(), Optim.Options(store_trace=true))
p = Optim.minimizer(r)
num_hess = hessian!(f, p) # this is the Hessian I reported
vcv = inv(num_hess)
v = diag(vcv)
sd = v
sd[sd .< 0.0] .= 0.0 # hack for something that should not happen
sd = sqrt.(sd)
withname(x) = NamedArray(x, (xp.nms,))
with2name(x) = NamedArray(x, [xp.nms, xp.nms])
return SimpleResult(withname(p), withname(sd), with2name(vcv),
with2name(num_hess), r, xp)
end
More package versions:
[324d7699] CategoricalArrays v0.5.4
[a93c6f00] DataFrames v0.18.3
[f6369f11] ForwardDiff v0.10.3
[38e38edf] GLM v1.1.2 [`dev\GLM`]
[54eb57ff] InteractiveCodeSearch v0.3.1
[d41bc354] NLSolversBase v7.3.1
[86f7a689] NamedArrays v0.9.3
[429524aa] Optim v0.18.1
[df47a6cb] RData v0.6.0
[3eaba693] StatsModels v0.6.0 [`dev\StatsModels`]
[bd369af6] Tables v0.2.6
P.S. When I copy and paste out of the Junu REPL many line breaks vanish. Is there a way to fix that? I’m on Windows.