Joonas - as_trix85
2010-Dec-07 01:56 UTC
[R] Using nlminb for maximum likelihood estimation
I'm trying to estimate the parameters for GARCH(1,1) process. Here's my code: loglikelihood <-function(theta) { h=((r[1]-theta[1])^2) p=0 for (t in 2:length(r)) { h=c(h,theta[2]+theta[3]*((r[t-1]-theta[1])^2)+theta[4]*h[t-1]) p=c(p,dnorm(r[t],theta[1],sqrt(h[t]),log=TRUE)) } -sum(p) } Then I use nlminb to minimize the function loglikelihood: nlminb( c(0.001,0.001,0.001,0.001), loglikelihood, lower=c(0.000001,0,0,0)) This does not produce a good result: the iteration limit is reached and increasing it won't help. I have used "garchFit" from fGarch-package to estimate the parameters. I set garchFit to use nlminb as well, and it produces a result within just a few seconds. However, for modification purposes, I need to get my own code working. [[alternative HTML version deleted]]
Joonas - as_trix85 <ast_rix85 <at> hotmail.com> writes:> > > I'm trying to estimate the parameters for GARCH(1,1) process. > Here's my code: > > loglikelihood <-function(theta) { > > h=((r[1]-theta[1])^2) > p=0 > > for (t in 2:length(r)) { > h=c(h,theta[2]+theta[3]*((r[t-1]-theta[1])^2)+theta[4]*h[t-1]) > }It will be more efficient to set aside space for the full h and p vectors (h <- p <- numeric(length(r))) rather than building them up one step at a time. Also, I think you can compute p outside the loop: -sum(dnorm(r,theta[1],sqrt(h),log=TRUE))> } > > > Then I use nlminb to minimize the function loglikelihood: > > nlminb( c(0.001,0.001,0.001,0.001), loglikelihood, lower=c(0.000001,0,0,0)) > > This does not produce a good result: the iteration limit > is reached and increasing it won't help. I have used > "garchFit" from fGarch-package to estimate the parameters. > I set garchFit to use nlminb as well, and it > produces a result within just a few seconds. > However, for modification purposes, I need to get my own code working.I don't see a question here, nor a reproducible example ... can you look to see in more detail what garchFit does? Does it have a way to generate better starting parameter estimates? Have you tried turning on tracing to see where your approach is getting stuck?