Я занимаюсь разработкой специальной многочленной логистической модели с использованием Юлии.
Он отлично работает (хотя я уверен, что это можно улучшить!)
Я написал функцию правдоподобия и использую Optim для оценки параметров и стандартных ошибок.
Я хотел бы сейчас разработать некоторые надежные оценки. Исходя из R, я бы использовал пакет сэндвич. Я не нашел никакого эквивалента в Юлии. Так что я мог бы разработать что-то конкретное, я думаю.
Для этого мне понадобится значение градиента для каждого наблюдения (строки). Я не нахожу способ сделать это с помощью Optim. (Когда я использую gradient!(func, x)
, я получаю сумму градиентов по строкам, а это не то, что я ищу)
Есть ли способ сделать это, используя OnceDifferentiable или TwiceDifferentiable?
В качестве альтернативы, есть ли пакет, эквивалентный R Sandwich, который бы ускользнул от моих исследований в Google?
Код, который я разработал до сих пор:
LLIK_MNL = function(init::Array{Float64})
b = init
u1 = X1*b
u2 = X2*b
u3 = X3*b
umax = max.(u1, u2, u3)
umin = min.(u1, u2, u3)
ucensor = (umax + umin)/2
exu1 = exp.(u1 - ucensor)
exu2 = exp.(u2 - ucensor)
exu3 = exp.(u3 - ucensor)
sexu = exu1 .+ exu2 .+ exu3
Pr=(choice1 .* exu1 + choice2 .* exu2 + choice3 .* exu3) ./ sexu
LL = sum(log.(Pr))
return -LL
end
func = TwiceDifferentiable(var -> LLIK_MNL(var), beta_ini)
opt = optimize(func, beta_ini)
est_MNL = Optim.minimizer(opt)
numerical_hessian = hessian!(func, est_MNL)
var_cov_matrix = inv(numerical_hessian)
temp = diag(var_cov_matrix)
t_stats = est_MNL ./ sqrt.(temp)
pp = 2 * cdf.(Normal(), -abs.(t_stats))
hcat(est_MNL, sqrt.(temp), t_stats, round.(pp, 4))