Curtis Burkhalter
2013-Oct-16 18:30 UTC
[R] problem with MLE estimation using Kalman filter
Hello,
I've recently run into a problem when trying to do some MLE parameter
estimation in R using a non-linear Kalman filter. I've written some of the
functions myself and everything seems to be working fine until the end when
I try to use the mle2 function written for R. The error message states
that the argument "minuslog1" is missing with no default, but I've
specified this argument using my written function. Any help with this would
much appreciated.
##script that codes for a non-linear Kalman filter
#simulate starting conditions and data
N.obs=seq(from=5,to=200,by=5)
y.procobs2=Nobs
#write the function called "nlkfpred" to predict the mean and variance
of
#each observed value; Nobs is the data set
nlkfpred=function(r,K,procvar,obsvar,M.n.start,Var.n.start,Nobs){
nt = length(Nobs)
M.nobs = numeric(nt)
Var.nobs = numeric(nt)
M.n = M.n.start
Var.n = Var.n.start
M.nobs[1] = M.n.start
Var.nobs[1] = Var.n.start+obsvar
for (t in 2:nt) {
M.ni = M.n+r*M.n(1-M.n/K)
b = 1+r-2*r*M.n/K
Var.ni = b^2*Var.n+procvar
M.nobs[t] = M.ni
Var.nobs[t] = Var.ni+obsvar
M.n = M.ni+(Var.ni/Var.nobs[t])*(Nobs[t]-M.nobs[t])
Var.n = Var.ni*(1-(Var.ni/Var.nobs[t]))
}
list(mean = M.nobs,var = Var.nobs)
}
##write the function called "nlkflik" to make a normal likelihood
comparison
##using log values of the parameters so that we don't have to worry about
##negative parameter values; "obs.data" is an observed data set
nlkflik function(logr,logK,logprocvar,logobsvar,logM.n.start,logVar.n.start,
obs.data){
pred = nlkfpred(r = exp(logr),K = exp(logK),procvar = exp(logprocvar),
obsvar = exp(logobsvar),M.n.start = exp(logM.n.start),Var.n.start
exp(logVar.n.start),
N.obs=y.procobs2)
-sum(dnorm(obs.data,mean = pred$mean,sd = sqrt(pred$var),log = TRUE))
}
#designate starting parameter values
startvec=list(logr=log(0.25),logK=log(10),logprocvar=log(0.5),
logobsvar=log(0.5),logM.n.start=log(3),logVar.n.start=-2)
#load two required packages
require(bbmle)
require(optimx)
#obtain MLE estimates of paramter values
m4 = mle2(minuslog1 = nlkflik,start = startvec,data = list(obs.data=Nobs),
method = "Nelder-Mead", control = list(maxit=2000))
Thanks
--
Curtis
[[alternative HTML version deleted]]
On Wed, Oct 16, 2013 at 8:30 PM, Curtis Burkhalter <curtisburkhalter at gmail.com> wrote:> I try to use the mle2 function written for R. The error message states > that the argument "minuslog1" is missing with no default, but I'veThe argument is minuslogl Note: l instead of 1 hth, Ingmar