我试图使用mle()
来最小化-log似然函数,但它总是会弹出如下错误消息:
Error in minuslogl() (from kf.r@7524iUV#2) : argument "psi" is missing, with
no default
我的职能是:
KFlogL2 <- function(psi){
.........
return (res)
}
> psi.test
[1] 2.00 0.20 0.20 0.02 0.20 0.20 0.50
> mle(KFlogL2,start = list(psi = psi.test),method = 'L-BFGS-B',lower =
> lb,upper = ub)
> mle(KFlogL2,start = list(psi = c(2,.2,.2,.02,.2,.2,.5)),method =
> 'L-BFGS-B',lower = lb,upper = ub)
我上面尝试了两种方法,但都不起作用......
任何人都知道为什么?
对于那些想要介绍optim()
的人,我实际上已经尝试过,
然而我的Hessian矩阵,在逆向和提取对角线之后 -
转为负面!收敛很好。我不知道那是什么
手段。所以我想尝试用mle()
来看看事情是否会发生变化。
我的优化功能:
KFopt <- optim(par = psi.test, fn = KFlogL, method = 'L-BFGS-B',
lower = lb, upper = ub, hessian = TRUE)
我的KF功能:
KFlogL2 <- function(psi){
k <- psi[1]
sigmax <- psi[2]
lambdax <- psi[3]
mu <- psi[4]
sigmae <- psi[5]
rnmu <- psi[6]
pxe <- psi[7]
m <- length(init.state)
N <- ncol(y.use)
nobs <- nrow(y.use)
s <- rep(.01,N)
dt <- 7/360
cc <- c(0,mu * dt)
T <- diag(m)
T[1,1] <- exp(-k * dt)
xx <- (1-exp(-2 * k * dt)) * sigmax * sigmax / 2 / k
xy <- (1-exp(-k * dt)) * pxe * sigmax * sigmae / k
yx <- (1-exp(-k * dt)) * pxe * sigmax * sigmae / k
yy <- sigmae * sigmae * dt
Q <- matrix(c(xx,xy,yx,yy),m,m)
R <- diag(m)
# measurement equation
d <- rep(0,N)
Z <- matrix(0,N,m)
for (i in 1:N){
matur.i <- matur.use[i]
p1 <- (1-exp(-2 * k * matur.i)) * sigmax * sigmax / 2 / k
p2 <- sigmae * sigmae * matur.i
p3 <- 2 * (1-exp(k * matur.i)) * pxe * sigmax * sigmae / k
d[i] <- rnmu * matur.i - (1-exp(-k * matur.i)) * lambdax / k + 1/2 * (p1 + p2 + p3)
Z[i,] <- exp(-k * matur.i)
}
H <- diag(s)
# Kalman Filter
save.ytt1 <- save.vtt <- save.vt <- matrix(0,nobs,N)
save.att1 <- save.att <- matrix(0,nobs,m)
save.Ptt1 <- save.Ptt <- matrix(0,nobs,m*m)
save.Ftt1 <- matrix(0,nobs,N*N)
save.detF <- save.vFv <- rep(0,nobs)
Ptt <- init.dist
att <- init.state
for (iter in 1:nobs){
Ptt1 <- T %*% Ptt %*% t(T) + R %*% Q %*% t(R)
Ftt1 <- Z %*% Ptt1 %*% t(Z) + H
att1 <- T %*% att + cc
yt <- y.use[iter,]
ytt1 <- Z %*% att1 + d
vt <- yt - ytt1
temp <- Ptt1 %*% crossprod(Z,solve(Ftt1))
att <- att1 + temp %*% vt
Ptt <- Ptt1 - temp %*% Z %*% Ptt1
ytt <- Z %*% att + d
vtt <- yt - ytt
save.vtt[iter,] <- vtt
save.vt[iter,] <- vt
save.att[iter,] <- att
save.Ptt1[iter,] <- as.numeric(Ptt1)
save.Ptt[iter,] <- as.numeric(Ptt)
save.detF[iter] <- det(Ftt1)
save.vFv[iter] <- crossprod(vt,solve(Ftt1,vt))
}
logL <- - (N + 1) * nobs/2 * log(2 * pi) - 1/2 * sum(log(save.detF)) - 1/2 * sum(save.vFv)
res <- -logL
return (res)
}
我不知道如何在这里附加文件,所以这里只是一瞥:
3.130263167 3.130700134 3.058707073 3.012589391 2.999724295 2.991724252
3.102342009 3.09421922 2.999724295 2.952824773 2.940747965 2.932259851
3.118392286 3.125882958 3.006177531 2.949164638 2.926917958 2.913979772
3.106378794 3.072693315 2.991724252 2.950211758 2.937573359 2.926917958
3.104138147 3.111735949 3.031099417 2.991724252 2.979602892 2.969388298
3.107273648 3.113959655 3.033509638 2.992226134 2.979602892 2.969388298
3.085572978 3.086486637 3.059176446 3.033509638 3.026746327 3.020912572
3.100092289 3.099641737 3.064325065 3.033028058 3.025776395 3.019936962
3.073618812 3.07176696 3.061520014 3.054001182 3.052112607 3.050220459
3.058707073 2.961658293 3.054001182 3.039270576 3.03543364 3.032546247
3.003204288 3.006672214 3.016024977 3.007660844 3.003700443 3.001217204
2.96217549 2.959068289 3.013080912 3.017493765 3.017493765 3.017493765
3.013572192 3.0194488 3.022860941 3.014554028 3.006672214 3.004692015
3.007166651 3.010620886 3.042138646 3.038791763 3.033028058 3.0301337
2.865623588 2.872434057 2.972463647 2.994731773 2.998727783 3.002707887
2.85474458 2.858766418 2.983659692 2.989714201 2.987700102 2.985681938
2.882003508 2.944438979 2.999226163 2.999226163 2.99723115 2.995232149
2.931726944 2.938103161 3.012097628 3.006672214 3.009635179 3.00914196
2.904712875 2.905807566 2.983659692 2.984165637 2.983659692 2.983659692
2.971439581 2.975019232 3.007660844 3.001217204 2.996731774 2.993730271
2.862772146 2.872434057 2.993229143 2.998727783 2.994731773 2.991724252
2.890371758 2.889260029 2.992727765 3.005187432 3.003700443 3.003700443
2.797890905 2.814210397 2.930126516 2.959586827 2.97603964 2.986691529
2.855895328 2.862772146 2.947591898 2.965788397 2.973997781 2.980110893
2.744060639 2.750470917 2.913437031 2.949164638 2.964241606 2.975019232
2.840247371 2.841414913 2.936512914 2.962692419 2.97603964 2.986186861
2.817203515 2.821378886 2.915606229 2.935982269 2.947067102 2.957511061
2.836150204 2.829677689 2.938103161 2.961140829 2.973997781 2.986186861
2.903068589 2.925846146 3.032546247 3.039749159 3.043569603 3.045474365
2.987700102 3.023347441 3.060583246 3.060114532 3.060114532 3.060114532
3.023833704 3.029650492 3.085572978 3.079153882 3.078693794 3.078693794
3.387774361 3.343215099 3.273742726 3.23317313 3.201119103 3.168003494
3.284663565 3.274121299 3.221272949 3.185939325 3.16463081 3.147594623
3.348499593 3.346741196 3.298426104 3.244153632 3.212455257 3.195811885
3.32251486 3.327909586 3.24998682 3.191710157 3.162940193 3.144152279
3.377587516 3.371425223 3.291010423 3.224857897 3.191710157 3.173459961
3.410817625 3.426215145 3.308716529 3.229222117 3.193763124 3.176803048
3.510948246 3.508855256 3.390473418 3.300640127 3.259249719 3.240245851
3.646232879 3.625140613 3.476614021 3.354455119 3.292126287 3.258865473
3.538928277 3.524888854 3.454738149 3.328626689 3.249211025 3.206803244
3.706964922 3.698829785 3.541828511 3.400863993 3.316365446 3.272606147
3.672241813 3.660737148 3.507357577 3.375537635 3.296207168 3.25617161
3.399529325 3.379973745 3.237501289 3.141994781 3.101442728 3.075928816
3.553346059 3.542118073 3.380994674 3.270329106 3.213662258 3.176803048
3.478467017 3.485232111 3.325395668 3.223266173 3.165475048 3.127199036
3.505557397 3.50013733 3.348850901 3.247268899 3.195402469 3.162093811
3.384390263 3.364187556 3.256556892 3.185112195 3.143289838 3.118834471
3.498021566 3.492256113 3.348148161 3.259633817 3.210843653 3.181796817
3.369018483 3.422958873 3.295466427 3.211246798 3.171364842 3.148024084
3.277144733 3.273742726 3.169265324 3.113515309 3.097837496 3.08876714