Skip to content

Commit cff5442

Browse files
committed
Fixes in gum() to make it more robust
1 parent d7f1f69 commit cff5442

File tree

2 files changed

+42
-36
lines changed

2 files changed

+42
-36
lines changed

R/adam-gum.R

+38-34
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,8 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
464464
# The reversed lags to fill in values in the state vector
465465
# lagsModelRev <- lagsModelMax - lagsModel + 1;
466466
componentsNumberARIMA <- componentsNumber <- sum(orders);
467+
# Record how many values in the initial state vector need to be estimated
468+
initialsNumber <- orders %*% lags;
467469

468470
# componentsNumberAll is used to fill in all matrices
469471
componentsNumberAll <- componentsNumber
@@ -509,33 +511,36 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
509511
initialType <- "provided";
510512
}
511513
else{
512-
if(initialType!="complete"){
513-
slope <- (cov(yInSample[1:min(max(12,lagsModelMax),obsInSample),],c(1:min(max(12,lagsModelMax),obsInSample)))/
514-
var(c(1:min(max(12,lagsModelMax),obsInSample))));
515-
intercept <- (sum(yInSample[1:min(max(12,lagsModelMax),obsInSample),])/min(max(12,lagsModelMax),obsInSample) -
516-
slope * (sum(c(1:min(max(12,lagsModelMax),obsInSample)))/
517-
min(max(12,lagsModelMax),obsInSample) - 1));
518-
519-
vtvalues <- vector("numeric", orders %*% lags);
520-
nCoefficients <- 0;
521-
if(any(lags==1) && length(orders[lags==1])>=1){
522-
vtvalues[nCoefficients+1] <- intercept;
523-
nCoefficients[] <- nCoefficients + 1;
524-
}
525-
if(any(lags==1) && length(orders[lags==1])>1){
526-
vtvalues[nCoefficients+1] <- slope;
527-
nCoefficients[] <- nCoefficients + 1;
528-
}
529-
if((orders %*% lags)>2){
530-
vtvalues[nCoefficients + 1:(orders %*% lags - nCoefficients)] <- yInSample[1:(orders %*% lags - nCoefficients),];
531-
}
514+
# if(initialType!="complete"){
515+
slope <- (cov(yInSample[1:min(max(12,lagsModelMax),obsInSample),],c(1:min(max(12,lagsModelMax),obsInSample)))/
516+
var(c(1:min(max(12,lagsModelMax),obsInSample))));
517+
intercept <- (sum(yInSample[1:min(max(12,lagsModelMax),obsInSample),])/min(max(12,lagsModelMax),obsInSample) -
518+
slope * (sum(c(1:min(max(12,lagsModelMax),obsInSample)))/
519+
min(max(12,lagsModelMax),obsInSample) - 1));
520+
521+
vtvalues <- vector("numeric", initialsNumber);
522+
nCoefficients <- 0;
523+
if(any(lags==1) && length(orders[lags==1])>=1){
524+
vtvalues[nCoefficients+1] <- intercept;
525+
nCoefficients[] <- nCoefficients + 1;
526+
}
527+
if(any(lags==1) && length(orders[lags==1])>1){
528+
vtvalues[nCoefficients+1] <- slope;
529+
nCoefficients[] <- nCoefficients + 1;
530+
}
531+
if((initialsNumber)>2){
532+
# rep is needed to make things work for the small samples
533+
vtvalues[nCoefficients + 1:(initialsNumber - nCoefficients)] <-
534+
rep(yInSample[1:min(initialsNumber - nCoefficients,obsInSample),],
535+
ceiling(obsInSample/initialsNumber)+1)[1:(initialsNumber - nCoefficients)];
536+
}
532537

533-
nCoefficients[] <- 0;
534-
for(i in 1:componentsNumber){
535-
matVt[i,1:lagsModel[i]] <- vtvalues[nCoefficients+(1:lagsModel[i])];
536-
nCoefficients[] <- nCoefficients + lagsModel[i];
537-
}
538+
nCoefficients[] <- 0;
539+
for(i in 1:componentsNumber){
540+
matVt[i,1:lagsModel[i]] <- vtvalues[nCoefficients+(1:lagsModel[i])];
541+
nCoefficients[] <- nCoefficients + lagsModel[i];
538542
}
543+
# }
539544
}
540545

541546
# Add parameters for the X
@@ -582,14 +587,14 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
582587
B <- vector("numeric", persistenceEstimate*componentsNumberAll +
583588
transitionEstimate*componentsNumberAll^2 +
584589
measurementEstimate*componentsNumber +
585-
initialEstimate*(initialType=="optimal")*sum(orders %*% lags) +
590+
initialEstimate*(initialType=="optimal")*sum(initialsNumber) +
586591
xregNumber*initialXregEstimate*(initialType!="complete"));
587592
names(B) <- c(paste0("g",1:componentsNumberAll)[persistenceEstimate*(1:componentsNumberAll)],
588593
paste0("F",paste0(rep(1:componentsNumberAll,each=componentsNumberAll),
589594
rep(1:componentsNumberAll,times=componentsNumberAll))
590595
)[transitionEstimate*(1:(componentsNumberAll^2))],
591596
paste0("w",1:componentsNumber)[measurementEstimate*(1:componentsNumber)],
592-
paste0("vt",1:sum(orders %*% lags))[initialEstimate*(initialType=="optimal")*(1:sum(orders %*% lags))],
597+
paste0("vt",1:sum(initialsNumber))[initialEstimate*(initialType=="optimal")*(1:sum(initialsNumber))],
593598
xregNames[(1:xregNumber)*initialXregEstimate*(initialType!="complete")]);
594599

595600
nCoefficients <- 0;
@@ -824,7 +829,7 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
824829
# }
825830

826831
# if(initialType=="optimal"){
827-
# parametersNumber[1,1] <- (parametersNumber[1,1] + orders %*% lags);
832+
# parametersNumber[1,1] <- (parametersNumber[1,1] + initialsNumber);
828833
# }
829834
}
830835
if(xregModel){
@@ -864,12 +869,6 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
864869
matVt <- zoo(t(matVt), order.by=yStatesIndex);
865870
}
866871

867-
##### Make a plot #####
868-
if(!silent){
869-
graphmaker(actuals=y,forecast=yForecast,fitted=yFitted,
870-
legend=FALSE,main=modelname);
871-
}
872-
873872
# Transform everything into appropriate classes
874873
if(any(yClasses=="ts")){
875874
yInSample <- ts(yInSample,start=yStart, frequency=yFrequency);
@@ -899,6 +898,11 @@ gum <- function(data, orders=c(1,1), lags=c(1,frequency(data)), type=c("additive
899898
errormeasures <- NULL;
900899
}
901900

901+
if(!silent){
902+
graphmaker(actuals=y,forecast=yForecast,fitted=yFitted,
903+
legend=FALSE,main=modelname);
904+
}
905+
902906
##### Return values #####
903907
modelReturned <- list(model=modelname, timeElapsed=Sys.time()-startTime,
904908
call=cl, orders=orders, lags=lags, type=type,

R/autogum.R

+4-2
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,9 @@ auto.gum <- function(data, orders=3, lags=frequency(data), type=c("additive","mu
177177
ordersTest <- rep(1,length(lagsBest)+1);
178178
lagsTest <- c(i,lagsBest);
179179
nComponents <- sum(ordersTest);
180-
nParamMax <- (1 + nComponents + nComponents + (nComponents^2)
180+
# We don't estimate measurement by default, so the nParamMax is lower
181+
# nParamMax <- (1 + nComponents + nComponents + (nComponents^2)
182+
nParamMax <- (1 + nComponents + (nComponents^2)
181183
+ (ordersTest %*% lagsTest)*(initial=="optimal"));
182184
if(obsInSample<=nParamMax){
183185
ICs[i] <- 1E100;
@@ -216,7 +218,7 @@ auto.gum <- function(data, orders=3, lags=frequency(data), type=c("additive","mu
216218
}
217219
ordersTest <- which(ICs==ICs[i],arr.ind=TRUE);
218220
nComponents <- sum(ordersTest);
219-
nParamMax <- (1 + nComponents + nComponents + (nComponents^2)
221+
nParamMax <- (1 + nComponents + (nComponents^2)
220222
+ (ordersTest %*% lagsBest)*(initial=="optimal"));
221223
if(obsInSample<=nParamMax){
222224
ICs[i] <- NA;

0 commit comments

Comments
 (0)