Nothing
context("Testing ARIMA models")
test_that("artransform works properly",{
x <- seq(-5, 5, by = 0.01)
expect_equal(Vectorize(artransform)(x), tanh(x))
expect_equal(artransform(c(100, -100)), c(2, -1))
expect_equal(artransform(c(0, 0)), c(0, 0))
expect_equal(artransform(c(1, 1, 1)), c(-0.3984572, 0.6233126, 0.7615942),
tolerance = 1e-6)
})
test_that("arimaSSM works properly",{
tol <- 1e-3
s <- 12
phis <- 0.99
phi1 <- 0.0001
phi <- c(phi1,rep(0,s-2),phis,-phi1*phis)
theta <- 0.7
out <- makeARIMA(phi,theta,NULL,SSinit="Ross")
out2<-SSMarima(phi,theta)
expect_equal(out$Pn,out2$P1,tolerance=tol,check.attributes=FALSE)
expect_equal(out$T,out2$T,tolerance=tol,check.attributes=FALSE)
expect_equal(out$Z,c(out2$Z),tolerance=tol,check.attributes=FALSE)
})
test_that("AR modelling works properly",{
tol <- 1e-5
# remove intercept from model as it is estimated differently in arima
model <- SSModel(lh~-1+SSMarima(ar=c(0,0,0),Q=1),H=0)
likfn <- function(pars, model, estimate=TRUE){
pars[1:3] <- artransform(pars[1:3])
tmp <- try(SSMarima(pars[1:3], Q = exp(pars[4])),silent=TRUE)
if(!inherits(tmp,"try-error")){
model["T","arima"] <- tmp$T
model["Q","arima"] <- tmp$Q
model["P1","arima"] <- tmp$P1
if(estimate){
-logLik(model)
} else model
} else {
if(estimate){
1e100
} else model
}
}
fit_kfas <- optim(par = c(rep(0, 3), log(var(lh,na.rm = TRUE))), model = model,
fn = likfn, method = "BFGS")
model <- likfn(fit_kfas$par,model, FALSE)
fit_arima <- arima(lh, order = c(3, 0, 0), include = FALSE)
expect_equal(fit_arima$coef,model$T[,1,1],check.attributes=FALSE,tol=tol)
expect_equal(fit_arima$sigma,model$Q[1],check.attributes=FALSE,tol=tol)
})
test_that("ARIMA modelling works properly",{
tol <- 1e-4
data(Nile)
model <- SSModel(Nile ~ SSMarima(ar=c(0.1,0.2),ma=c(0.1),d=1), H=0)
#due to stationarity checks it's easier to use own objective function and optim directly
likfn <- function(pars, model, estimate=TRUE){
# use artransform to transform parameters so the model is stationary and invertible
tmp <- try(SSMarima(artransform(pars[1:2]),
artransform(pars[3]),d=1,Q = exp(pars[4])),silent=TRUE)
if(!inherits(tmp,"try-error")){
model["T","arima"] <- tmp$T
model["R","arima"] <- tmp$R
model["P1","arima"] <- tmp$P1
model["Q","arima"] <- tmp$Q
if(estimate){
-logLik(model)
} else model
} else {
if(estimate){
1e100
} else model
}
}
inits <- c(0.1,0.5,0.5,log(15000))
fit <- optim(inits, likfn, model=model, method='BFGS')
model <- likfn(fit$par,model,FALSE)
fit_arima <- arima(x=Nile, order = c(2,1,1))
expect_equal(fit_arima$coef,c(model$T[2:3,2,1],model$R[3]),check.attributes=FALSE,tol=tol)
expect_equal(fit_arima$sigma,model$Q[1],check.attributes=FALSE,tol=tol)
})
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.