Rev 5606 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
"heidel.diag" <- function (x, eps = 0.1, pvalue=0.05){if (is.mcmc.list(x))return(lapply(x, heidel.diag, eps))x <- as.mcmc(as.matrix(x))HW.mat0 <- matrix(0, ncol = 6, nrow = nvar(x))dimnames(HW.mat0) <- list(varnames(x),c("stest", "start", "pvalue", "htest","mean", "halfwidth"))HW.mat <- HW.mat0for (j in 1:nvar(x)) {start.vec <- seq(from=start(x), to = end(x)/2, by=niter(x)/10)Y <- x[, j, drop = TRUE]n1 <- length(Y)## Schruben's test for convergence, applied sequentially##S0 <- spectrum0.ar(window(Y, start=end(Y)/2))$specconverged <- FALSEfor (i in seq(along = start.vec)) {Y <- window(Y, start = start.vec[i])n <- niter(Y)ybar <- mean(Y)B <- cumsum(Y) - ybar * (1:n)Bsq <- (B * B)/(n * S0)I <- sum(Bsq)/nif(converged <- !is.na(I) && pcramer(I) < 1 - pvalue)break}## Recalculate S0 using section of chain that passed convergence testS0ci <- spectrum0.ar(Y)$spechalfwidth <- 1.96 * sqrt(S0ci/n)passed.hw <- !is.na(halfwidth) & (abs(halfwidth/ybar) <= eps)if (!converged || is.na(I) || is.na(halfwidth)) {nstart <- NApassed.hw <- NAhalfwidth <- NAybar <- NA}else {nstart <- start(Y)}HW.mat[j, ] <- c(converged, nstart, 1 - pcramer(I),passed.hw, ybar, halfwidth)}class(HW.mat) <- "heidel.diag"return(HW.mat)}"print.heidel.diag" <-function (x, digits = 3, ...){HW.title <- matrix(c("Stationarity", "test", "start", "iteration","p-value", "","Halfwidth", "test", "Mean", "", "Halfwidth", ""),nrow = 2)y <- matrix("", nrow = nrow(x), ncol = 6)for (j in 1:ncol(y)) {y[, j] <- format(x[, j], digits = digits)}y[, c(1, 4)] <- ifelse(x[, c(1, 4)], "passed", "failed")y <- rbind(HW.title, y)vnames <- if (is.null(rownames(x)))paste("[,", 1:nrow(x), "]", sep = "")else rownames(x)dimnames(y) <- list(c("", "", vnames), rep("", 6))print.default(y[, 1:3], quote = FALSE, ...)print.default(y[, 4:6], quote = FALSE, ...)invisible(x)}"spectrum0.ar" <- function(x){x <- as.matrix(x)v0 <- order <- numeric(ncol(x))names(v0) <- names(order) <- colnames(x)z <- 1:nrow(x)for (i in 1:ncol(x)){lm.out <- lm(x[,i] ~ z)if (identical(all.equal(sd(residuals(lm.out)), 0), TRUE)) {v0[i] <- 0order[i] <- 0}else {ar.out <- ar(x[,i], aic=TRUE)v0[i] <- ar.out$var.pred/(1 - sum(ar.out$ar))^2order[i] <- ar.out$order}}return(list(spec=v0, order=order))}effectiveSize <- function(x){if (is.mcmc.list(x)){##RGA changed to sum across all chainsess <- do.call("rbind",lapply(x,effectiveSize))ans <- apply(ess,2,sum)}else{x <- as.mcmc(x)x <- as.matrix(x)spec <- spectrum0.ar(x)$specans <- ifelse(spec==0, 0, nrow(x) * apply(x, 2, var)/spec)}return(ans)}"spectrum0" <- function(x, max.freq=0.5, order=1, max.length=200){x <- as.matrix(x)if (!is.null(max.length) && nrow(x) > max.length) {batch.size <- ceiling(nrow(x)/max.length)if (is.R()) {x <- aggregate(ts(x, frequency=batch.size), nfreq = 1, FUN=mean)}else {x <- aggregate(ts(x, frequency=batch.size), nf = 1, fun=mean)}}else {batch.size <- 1}out <- do.spectrum0(x, max.freq=max.freq, order=order)out$spec <- out$spec * batch.sizereturn(out)}"do.spectrum0" <- function(x, max.freq=0.5, order=1){## Estimate spectral density of time series x at frequency 0.## spectrum0(x)/length(x) estimates the variance of mean(x)#### NB We do NOT use the same definition of spectral density## as in spec.pgram.##fmla <- switch(order+1,spec ~ one,spec ~ f1,spec ~ f1 + f2)if(is.null(fmla))stop("invalid order")N <- nrow(x)Nfreq <- floor(N/2)freq <- seq(from = 1/N, by = 1/N, length = Nfreq)f1 <- sqrt(3) * (4 * freq - 1)f2 <- sqrt(5) * (24 * freq^2 - 12 * freq + 1)v0 <- numeric(ncol(x))for(i in 1:ncol(x)) {y <- x[,i]if (var(y) == 0) {v0[i] <- 0}else {yfft <- fft(y)spec <- Re(yfft * Conj(yfft))/ Nspec.data <- data.frame(one = rep(1, Nfreq), f1=f1, f2=f2,spec = spec[1 + (1:Nfreq)],inset = I(freq<=max.freq))glm.out <- glm(fmla, family=Gamma(link="log"), data=spec.data)v0[i] <- predict(glm.out, type="response",newdata=data.frame(spec=0,one=1,f1=-sqrt(3),f2=sqrt(5)))}}return(list(spec=v0))}"pcramer" <- function (q, eps=1.0e-5){## Distribution function of the Cramer-von Mises statistic##log.eps <- log(eps)y <- matrix(0, nrow=4, ncol=length(q))for(k in 0:3) {z <- gamma(k + 0.5) * sqrt(4*k + 1)/(gamma(k+1) * pi^(3/2) * sqrt(q))u <- (4*k + 1)^2/(16*q)y[k+1,] <- ifelse(u > -log.eps, 0, z * exp(-u) * besselK(x = u, nu=1/4))}return(apply(y,2,sum))}