|
https://stat.ethz.ch/pipermail/r-help/2008-April/158763.html
garch.gjr <- function(par,y,iterate=TRUE)
{
T<-length(y)
mu0<-par[1]
a0<-par[2]
a1<-par[3]
a2 <-par[4]
b1 <- par[5]
e <- s2 <- numeric(T)
s2[1] <- var(y)
e[1] <- y[1]-mu0
l<-0
for(t in 2:T)
{
e[t] <- y[t]-mu0
s2[t] <- a0+a1*e[t-1]^2+b1*s2[t-1] + ifelse(e[t-1]<0, a2*e[t-1]^2, 0)
l <- l -0.5*log(2*pi*s2[t])-0.5*e[t]^2/s2[t]
if(s2[t]>10000) return(10000)
}
if(iterate) return(-l)
else return(list(loglik=l,sig2=s2,res=e/sqrt(s2)))
}
y<-data
par0<-c(0,0.038,0.051,0.058,0.991)
# you need to put good initial parameter values
a<-nlm(garch.gjr,par0,y=y,hessian=TRUE)
se <- sqrt(diag(solve(a$hessian)))
|