4 - Désaisonnalisation avec correction des jours ouvrables

Désaisonnaliser une série temporelle

Auteur

Alain Quartier-la-Tente

1 Importer les jeux de régresseurs « Jours Ouvrables » sous JDemetra+

  • Cliquer sur l’onglet Providers

  • Clic-droit sur Spreadsheets

  • Cliquer sur Open

  • Cliquer sur le bouton

  • Sélectionner le fichier Excel « regcjo.xlsx » contenant les régresseurs « Jours Ouvrables ».

  • Cliquer sur OK

  • Cliquer sur l’onglet Workspace

  • Cliquer sur le + à côté d’Utilities

  • Clic-droit sur Variables

  • Cliquer sur New

  • Cliquer sur le + à côté de Variables

  • Double cliquer sur l’icône Vars-1

  • Que se passe-t-il ?

  • Retourner dans l’onglet Providers

  • Faire glisser l’ensemble des séries du fichier « regcjo.xls » dans l’onglet Vars-1

  • Renommer les séries en reprenant leur nom d’origine dans le fichier excel « regcjo.xls ».

Ce travail peut être très fastidieux… Heureusement depuis R il existe une solution plus automatique !

Il existe deux façons de faire, en fonction de si l’on utilise une version 2.x.y ou 3.x.y de JDemetra+. Repartons déjà des régresseurs jours ouvrables (pour leur création, voir le TP R associé) :

library(rjd3toolkit)
FR <- national_calendar(list(
    special_day("NEWYEAR"),
    special_day("EASTERMONDAY"), # Lundi de Pâques
    special_day("MAYDAY"), # 1er mai
    special_day("ASCENSION"), # Jour de l'Ascension
    fixed_day(5, 8),
    special_day("WHITMONDAY"), # Lundi de Pentecôte
    fixed_day(7, 14),
    special_day("ASSUMPTION"), # Assomption
    special_day("ALLSAINTSDAY"), # Toussaint
    special_day("ARMISTICE")
))

gen_calendrier <- function(cal, frequency, start = c(1990, 1), end = c(2030, 1)) {
    length = (end[1] - start[1]) * frequency + end[2] - start[2]
    ly <- rjd3toolkit::lp_variable(frequency = frequency, start = start,
                                   length = length)
    # N'hésitez pas à ajouter les votre !
    TD7 <- calendar_td(cal, frequency = frequency, start = start, length = length,
                       groups = c(1, 2, 3, 4, 5, 6, 0))
    TD4 <- calendar_td(cal, frequency = frequency, start = start, length = length,
                       groups = c(1, 1, 1, 1, 2, 3, 0))
    TD3 <- calendar_td(cal, frequency = frequency, start = start, length = length,
                       groups = c(1, 1, 1, 1, 1, 2, 0))
    TD3c <- calendar_td(cal, frequency = frequency, start = start, length = length,
                        groups = c(1, 1, 1, 1, 2, 2, 0))
    TD2 <- calendar_td(cal, frequency = frequency, start = start, length = length,
                       groups = c(1, 1, 1, 1, 1, 0, 0))
    TD2c <- calendar_td(cal, frequency = frequency, start = start, length = length,
                        groups = c(1, 1, 1, 1, 1, 1, 0))
    
    reg_jo <- ts(cbind(TD2, TD2c, TD3, TD3c, TD4, TD7),
                 start = start, frequency = frequency)
    reg_jo <- ts.intersect(reg_jo,
                           ly)
    colnames(reg_jo) <- c(
        "TD2_semaine",
        "TD2c_lundi_samedi",
        sprintf("TD3_%s", c("semaine", "samedi")),
        sprintf("TD3c_%s", c("lundi_jeudi", "vendredi_samedi")),
        sprintf("TD4_%s", c("lundi_jeudi", "vendredi", "samedi")),
        sprintf("TD7_%s", c("lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi")),
        "leap_year")
    reg_jo
}
regresseurs_JO_trim <- gen_calendrier(FR, frequency = 4)
regresseurs_JO_mens <- gen_calendrier(FR, frequency = 12)

colnames(regresseurs_JO_trim) <- paste0(colnames(regresseurs_JO_trim), "_trim")
colnames(regresseurs_JO_mens) <- paste0(colnames(regresseurs_JO_mens), "_mens")

1.1 JDemetra+ 2.x.y

Ci-dessous un code pour vous éviter de faire le travail manuel. Il est un peu peu compliqué mais une fois le code écrit, vous pouvez l’utiliser tel quel ! Vous pourrez ensuite repartir du workspace créé pour y ajouter vos propres séries.

# On va créer un nouveau workspace où l'on va ajouter les nouvelles variables
library(RJDemetra)
library(rJava)
complete_variables <- function(liste_var, workspace){
    if(!is.mts(liste_var))
        stop("liste_var doit être de type mts")
    context_dictionary <- .jcall(workspace,"Lec/tstoolkit/algorithm/ProcessingContext;", "getContext")
    ts_variable_managers <- context_dictionary$getTsVariableManagers()
    ts_variables <- .jnew("ec/tstoolkit/timeseries/regression/TsVariables")
    jd_r_variables <- ts_variable_managers$get("r")
    if (is.null(jd_r_variables)) {
        ts_variable_managers$set("r",
                                 .jnew("ec/tstoolkit/timeseries/regression/TsVariables"))
        jd_r_variables <- ts_variable_managers$get("r")
    }
    jd_var_names <- jd_r_variables$getNames()
    
    model_var_names <- colnames(liste_var)
    
    for (i in seq_along(model_var_names)) {
        name <- model_var_names[i]
        dictionary_var <- jd_r_variables$get(name)
        tsvar <- .jnew("ec/tstoolkit/timeseries/regression/TsVariable",
                       name, RJDemetra:::ts_r2jd(liste_var[, i]))
        if (is.null(dictionary_var)) {
            jd_r_variables$set(name, tsvar)
        } else {
            warning(sprintf("La variable %s existe déjà", name))
        }
    }
}

# Création d'un nouveaux
jws <- new_workspace()
# regresseurs_JO est l'objet mts qui contient tous vos régresseurs
# Il doit donc déjà être créé (voir code ci-dessus) !
complete_variables(regresseurs_JO_mens, jws)
complete_variables(regresseurs_JO_trim, jws)
save_workspace(jws,"workspace_CJO.xml")

1.2 JDemetra+ 3.x.y

Pour la version 3 de JDemetra+, le code est plus simple. Vous pouvez également ajouter les calendriers

# On va créer deux groupes de variables, on peut donc simplifier les noms
colnames(regresseurs_JO_mens) <- 
    colnames(regresseurs_JO_trim) <- 
    gsub("_mens", "", colnames(regresseurs_JO_mens))
ctxt <- rjd3toolkit::modelling_context(
    # on appelle "FR" le calendrier
    calendars = list(FR = FR), 
    # on crée un groupe de variables "cjo_mens" contenant les régresseurs mensuels
    # et un groupe de variables "cjo_trim" contenant les régresseurs trimestriels
    variables = list(cjo_mens = regresseurs_JO_mens,
                     cjo_trim = regresseurs_JO_trim)
) 

jws <- rjdemetra3::.jws_new(ctxt)
# On peut également ajouter les calendriers et les variables avec les fonctions :
# rjdemetra3:::add_variable()
# rjdemetra3:::add_calendar()
rjdemetra3::save_workspace(jws, "workspace_CJO_v3.xml")

2 Créer une spécification incluant les jeux de régresseurs « jours ouvrables » personnalisés

  • Cliquer sur l’onglet Workspace

  • Double cliquer sur Seasonal adjustment

  • Double cliquer sur specifications

  • Double cliquer sur x13

  • Clic-droit sur RSA5c

  • Cliquer sur Clone

  • Que se passe-t-il ?

  • Double-cliquer sur X13Spec-1

  • Cliquer sur le + à côté de Calendar

  • Cliquer sur le + à côté de tradingDays

  • Cliquer sur Default à côté de option

  • Que se passe-t-il ?.

  • Cliquer sur UserDefined

  • Cliquer sur Unused à côté de userVariables

  • Que se passe-t-il ?

  • Faire passer les 6 régresseurs du jeu de régresseurs TD6 + leap_year de la gauche vers la droite

  • Cliquer sur le bouton Done

  • Cliquer sur OK

3 Réaliser une désaisonnalisation automatique de vos séries en utilisant la spécification X13Spec-1

Voir TP1.

4 Analyser les diagnostics relatifs à la correction des effets de calendrier

Pour chaque série, répondez aux questions suivantes :

  • Y a-t-il eu une correction des effets de calendrier ?

  • Si oui, est-ce que tous les coefficients associés aux régresseurs « JO » sont significativement différents de 0 ?

  • Si non, essayer d’autres jeux de régresseurs « JO »

  • Y a-t-il eu une correction de l’effet Pâques ?

  • La série CVS-CJO présente-t-elle des effets « Jours Ouvrables » résiduels ?