| # | |||||||
| # SPLUS VERSION | |||||||
| # | |||||||
| arfima.mle<-function(series, m = 30) | |||||||
| { | |||||||
| # | |||||||
| # Computes MLE for an ARFIMA(0,d,0) model, missing values allowed, | |||||||
| # (the "m" first values must be observed) | |||||||
| # | |||||||
| # output: | |||||||
| # d : estimate of "d" | |||||||
| # | std : standard deviation of the estimate of d | ||||||
| # | student : t-test value for d | ||||||
| # | missing : number of missing values in the series | ||||||
| # | noise.std : white noise standard deviation | ||||||
| # | |||||||
| aux1 <- nlminb(start = 0.25, arfima.loglik, lo = 0., up = 0.5, series = series, m = m)$parameters | |||||||
| aux2 <- hess(arfima.loglik, aux1, series = series) | |||||||
| aux2 <- sqrt(2./aux2) | |||||||
| aux3 <- aux1/aux2 | |||||||
| aux4 <- length(series[series == "NA"]) | |||||||
| order <- c(m, 0., 0.) | |||||||
| ar <- - psi1( - aux1, m) | |||||||
| model <- list(order, ar, 0.) | |||||||
| names(model) <- c("order", "ar", "ndiff") | |||||||
| aux5 <- arima.filt(series - mean(series, na.rm = T), model = model)$sigma2 | |||||||
| aux5 <- sqrt(aux5) | |||||||
| aux <- list(aux1, aux2, aux3, aux4, aux5) | |||||||
| names(aux) <- c("d", "std", "student", "missing", "noise.std") | |||||||
| return(aux) | |||||||
| } | |||||||
| # | |||||||
| # AUXILIARY FUNCTIONS | |||||||
| # | |||||||
| arfima.loglik<-function(x, series, m = 30) | |||||||
| { | |||||||
| order <- c(m, 0., 0.) | |||||||
| ar <- - psi1( - x, m) | |||||||
| model <- list(order, ar, 0.) | |||||||
| names(model) <- c("order", "ar", "ndiff") | |||||||
| y <- arima.filt(series - mean(series, na.rm = T), model = model)$loglik | |||||||
| return(y) | |||||||
| } | |||||||
| psi1<-function(d, n) | |||||||
| { | |||||||
| psi <- c(1:n) | |||||||
| psi[1] <- d | |||||||
| if(n > 1) { | |||||||
| for(i in 2:n) | |||||||
| psi[i] <- ((i - 1 + d) * psi[i - 1])/i | |||||||
| } | |||||||
| return(psi) | |||||||
| } | |||||||
| # | |||||||
| #Available from the website: http://www.public.iastate.edu/~pdixon/stat534/Splus/hess.do | |||||||
| # | |||||||
| hess<-function(f, x0, ...) | |||||||
| { | |||||||
| # compute numerical approx. to Hessian of f, evaluated at x0 | |||||||
| # usually need to pass additional parameters (e.g. data) | |||||||
| # N.B. this uses no numerical sophistication, | |||||||
| # so expect 3-4 figure accuracy, at best | |||||||
| # input: f: name of function that defines log likelihood (or negative of it) | |||||||
| # x0: scalar or vector of parameters that give the point at which | |||||||
| # you want the hessian estimated (usually will be the mle ) | |||||||
| # output: matrix of 2nd derivatives. Size is n x n, where n = length of x0 | |||||||
| n <- length(x0) | |||||||
| grad <- rep(0., n) | |||||||
| mdelta <- hess <- matrix(0., nrow = n, ncol = n) | |||||||
| delta <- 0.0001 * (sign(x0) + (x0 == 0.)) * pmax(abs(x0), 0.01) | |||||||
| diag(mdelta) <- delta | |||||||
| f0 <- f(x0, ...) | |||||||
| for(i in 1.:n) { | |||||||
| grad[i] <- f(x0 + mdelta[, i], ...) | |||||||
| } | |||||||
| for(i in 1.:n) { | |||||||
| for(j in i:n) { | |||||||
| hess[i, j] <- f(x0 + mdelta[, i] + mdelta[, j], ...) - grad[i] - grad[j] | |||||||
| hess[j, i] <- hess[i, j] | |||||||
| } | |||||||
| } | |||||||
| (hess + f0)/outer(delta, delta, "*") | |||||||
| } | |||||||