Пространственная авторегрессия Оценка максимального правдоподобия в Юлии - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь оценить пространственную авторегрессионную (SAR) модель в Юлии, используя код MATLAB Джима ЛеСажа.Сначала я должен максимизировать концентрированную логарифмическую функцию правдоподобия по отношению к параметру rho.

Я написал следующую правдоподобную функцию в Юлии:

function like_sar(rho,epe0,eped,epe0d,n,W)

# PURPOSE: evaluates concentrated log-likelihood for the
#  spatial autoregressive model using sparse matrix algorithms
# ---------------------------------------------------
#  USAGE:llike = f_sar(rho,epe0,eped,epe0d,n)
#  where: rho  = spatial autoregressive parameter      
#         epe0   = see below
#         eped   = see below
#         eoe0d  = see below
#         n      = # of obs
#          b0 = AI*xs'*ys;
#          bd = AI*xs'*Wys;
#          e0 = ys - xs*b0;
#          ed = Wys - xs*bd;
#          epe0 = e0'*e0;
#          eped = ed'*ed;
#          epe0d = ed'*e0;

z = epe0 - 2*rho*epe0d + rho*rho*eped

A = speye(n) - rho*W

sar_like = (n/2)*log(z) - log(det(A))

return sar_like, rho

end

Я генерирую данные и перехожу к функциивсе аргументы, и это дает мне значение функции правдоподобия и значение параметра rho.

Однако, когда я пытаюсь использовать пакет Optim для максимизации этой вероятности, я получаю следующую ошибку:

optimize(like_sar,[rho,epe0,eped,epe0d,n,W])
ERROR: MethodError: no method matching zero(::Type{Any})
Closest candidates are:
  zero(::Type{Base.LibGit2.GitHash}) at libgit2\oid.jl:106
  zero(::Type{Base.Pkg.Resolve.VersionWeights.VWPreBuildItem}) at pkg\resolve\versionweight.jl:82
  zero(::Type{Base.Pkg.Resolve.VersionWeights.VWPreBuild}) at pkg\resolve\versionweight.jl:124
  ...
Stacktrace:
 [1] promote_objtype(::Optim.NelderMead{Optim.AffineSimplexer,Optim.AdaptiveParameters}, ::Array{Any,1}, ::Function) at C:\Users\dolacomb\.julia\v0.6\Optim\src\multivariate/optimize\interface.jl:39
 [2] #optimize#151(::Array{Any,1}, ::Function, ::Tuple{#like_sar}, ::Array{Any,1}) at C:\Users\dolacomb\.julia\v0.6\Optim\src\multivariate/optimize\interface.jl:57
 [3] #optimize#148(::Array{Any,1}, ::Function, ::Function, ::Array{Any,1}) at C:\Users\dolacomb\.julia\v0.6\Optim\src\multivariate/optimize\interface.jl:52
 [4] optimize(::Function, ::Array{Any,1}) at C:\Users\dolacomb\.julia\v0.6\Optim\src\multivariate/optimize\interface.jl:52
 [5] eval(::Module, ::Any) at .\boot.jl:235

Я не уверен, что я делаю здесь неправильно, так как это выглядит как довольно простая одномерная оптимизация по rho, но я довольно новичок в кодировании в Julia.

Любая помощь будет очень полезнаоценили.Я планирую преобразовать весь код LeSage в Julia и уже выполнил большинство байесовских подпрограмм (которые намного проще, IMHO) и вспомогательных функций, например, вычислений лог-детерминанта, достоверных интервалов, создания матрицы весов и т. Д.

1 Ответ

0 голосов
/ 04 июня 2018

Если я правильно понимаю ваш случай, вам нужно выполнить одномерную оптимизацию, и в этом случае лучше всего использовать https://github.com/JuliaNLSolvers/Optim.jl/blob/master/docs/src/user/minimization.md#minimizing-a-univariate-function-on-a-bounded-interval (если вы знаете начальный интервал - но я думаю, что в вашей задаче это должно быть [-1,1]).

Затем вы должны передать солверу функцию, которая принимает один аргумент и возвращает одно значение.В вашем случае простая анонимная функция, которая делает это, что приводит к следующему вызову:

optimize(rho -> -like_sar(rho,epe0,eped,epe0d,n,W)[1], -1, 1)

конечно, вы должны иметь epe0, eped, epe0d, n,W определено во включающей области вызова для того, чтобы это работало.

В определении я добавил минус - перед like_sar, поскольку optimize минимизирует функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...