我正在尝试使用Jim LeSage的MATLAB代码来估计Julia中的空间自回归(SAR)模型。我首先必须最大化关于rho参数的集中对数似然函数。
我在Julia中编写了以下似然函数:
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)和支持函数,例如对数行列式计算,可信区间,权重矩阵创建等。
发布于 2018-06-04 07:11:23
如果我正确理解了您的情况,您需要做单变量优化,在这种情况下,最好使用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
最小化了函数。
https://stackoverflow.com/questions/50671482
复制相似问题