Enseignant: Bachirou

Exercice 1 QCM :

Sélectionner cochez (✓) la meilleure réponse pour chacune des questions suivantes

1. Selon le paradigme fréquentiste, les probabilités sont des propriétés :

  • A. Subjectives, reflétant un degré de croyance
  • B. Objectives, liées à la limite des fréquences relatives (✓)
  • C. Basées sur des décisions personnelles
  • D. Dépendantes des conditions initiales

2. Quelles sont les qualités souhaitées d’un estimateur dans le paradigme fréquentiste ?

  • A. Biaisé, mais avec variance minimale
  • B. Non biaisé, convergent, avec une variance minimale et robuste (✓)
  • C. Stable, mais potentiellement biaisé
  • D. Simple à calculer et interpréter

3. Dans le cadre des tests de significativité de Fisher, qu’indique une p-value inférieure à 0,05 ?

  • A. H0 est fausse
  • B. Il faut rejeter H0 (✓)
  • C. Il faut accepter H1
  • D. Les données sont insuffisantes pour conclure

4. Quelle est une interprétation correcte d’un intervalle de confiance à 95 % ?

  • A. La probabilité que le paramètre soit dans l’intervalle est de 95 %.
  • B. Si on répète plusieurs fois l’expérience, 95 % des intervalles contiendront le paramètre. ( ✓)
  • C. Le paramètre est une variable aléatoire avec 95 % de chances de se trouver dans l’intervalle.
  • D. L’intervalle contient toujours le paramètre avec une précision de 95 %.

5. Selon le paradigme fréquentiste, les paramètres d’une population sont :

  • A. Des variables aléatoires ayant une distribution
  • B. Des constantes fixes et inconnues (✓)
  • C. Des hypothèses testées à partir des données
  • D. Des intervalles de confiance

6. Un estimateur est dit sans biais si :

  • A. Il converge vers une constante fixe quand n→∞
  • B. Sa moyenne est égale à la valeur du paramètre ( ✓)
  • C. Sa variance est minimale parmi tous les estimateurs
  • D. Il n’est pas affecté par des changements dans l’échantillon

7. Un estimateur est dit convergent si :

  • A. Il tend vers la vraie valeur du paramètre lorsque n→∞ (✓)
  • B. Sa distribution devient normale quand n→∞
  • C. Sa variance tend vers zéro quand la taille de l’échantillon augmente
  • D. Il minimise les erreurs de type I et II

8. Quelle est la principale différence entre le test de Fisher et celui de Neyman-Pearson ?

  • A. Fisher n’introduit pas d’hypothèse alternative explicite, alors que Neyman-Pearson le fait (✓)
  • B. Fisher utilise une p-value, tandis que Neyman-Pearson se base sur un intervalle de confiance
  • C. Fisher minimise uniquement l’erreur de type II, tandis que Neyman-Pearson minimise l’erreur de type I
  • D. Neyman-Pearson n’utilise pas de région critique, contrairement à Fisher

9. Qu’est-ce qu’un processus stochastique ?

  • A. Un ensemble de points temporels indexés par des variables déterministes
  • B. Un ensemble de variables aléatoires définies sur un espace de probabilité (✓)
  • C. Un modèle mathématique uniquement utilisé pour les données transversales
  • D. Une méthode d'estimation des séries chronologiques

10. Que signifie la non-stationnarité dans une série chronologique ?

  • A. Les chocs s'éteignent rapidement
  • B. La série suit une distribution normale
  • C. Les chocs ne s'éteignent pas et les tests statistiques peuvent être biaisés (✓)
  • D. Il n'y a pas de dépendance temporelle

Exercice 2 : Modélisation du Taux de Croissance Trimestriel du PIB du Niger à l’aide d’un ARIMA

Objectif

Utiliser la méthodologie de Box-Jenkins pour modéliser et prévoir le taux de croissance trimestriel du PIB du Niger à partir de données économiques réelles.

Contenu

Étant donné le jeu de données sur le taux de croissance trimestriel du PIB du Niger (2010T1 à 2023T4), effectuez les étapes suivantes :

  • Charger et inspecter les données.
  • Vérifier la stationnarité et transformer la série si nécessaire.
  • Sélectionner et estimer les paramètres du modèle ARIMA(p, d, q) le mieux ajusté.
  • Valider le modèle à l’aide de tests diagnostiques.
  • Prévoir le taux de croissance du PIB pour les quatre prochains trimestres.

Correction Exercice 2 :

1.Chargement et inspection des données

a. Chargement des bibliothèques nécessaire

Pour faire ce travail, nous utiliserons les packages suivants :

library(readxl)
library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(naniar) 
library(kableExtra)
## 
## Attachement du package : 'kableExtra'
## L'objet suivant est masqué depuis 'package:dplyr':
## 
##     group_rows
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(urca)
library(knitr)
library(forecast)
library(lmtest)
## Le chargement a nécessité le package : zoo
## 
## Attachement du package : 'zoo'
## Les objets suivants sont masqués depuis 'package:base':
## 
##     as.Date, as.Date.numeric
library(tseries)

b. Chargement des données

setwd("C:\\Users\\MAINS2\\Desktop\\IPS 4\\2ème Année\\Serie tempo\\Devoir")
data <- read_xlsx("Niger_Quarterly_GDP_Growth.xlsx")
head(data, 10)
## # A tibble: 10 × 2
##    Quarter             GDP_Growth_Rate
##    <dttm>                        <dbl>
##  1 2010-03-31 00:00:00             1.2
##  2 2010-06-30 00:00:00             0.9
##  3 2010-09-30 00:00:00             1.5
##  4 2010-12-31 00:00:00             1.3
##  5 2011-03-31 00:00:00             0.8
##  6 2011-06-30 00:00:00             0.7
##  7 2011-09-30 00:00:00             1.1
##  8 2011-12-31 00:00:00             1.4
##  9 2012-03-31 00:00:00             1  
## 10 2012-06-30 00:00:00             0.6

c. Pré-traitement de la data base.

Valeurs manquantes

missing_summary <- data %>% miss_var_summary()
kable(missing_summary, 
      format = "markdown", 
      caption = "Résumé des valeurs manquantes")
Résumé des valeurs manquantes
variable n_miss pct_miss
Quarter 0 0
GDP_Growth_Rate 0 0

Notre jeu de données ne possedent pas de valeurs manquantes.

Valeurs aberantes

detect_outliers <- function(df) {
  # Fonction pour détecter les outliers dans un vecteur numérique
  find_outliers <- function(x) {
    Q1 <- quantile(x, 0.25, na.rm = TRUE)
    Q2 <- quantile(x, 0.50, na.rm = TRUE) # La médiane
    Q3 <- quantile(x, 0.75, na.rm = TRUE)
    IQR <- Q3 - Q1
    lower_bound <- Q1 - 1.5 * IQR
    upper_bound <- Q3 + 1.5 * IQR
    outliers <- x[x < lower_bound | x > upper_bound]
    return(list(
      outliers = outliers,
      Q1 = Q1,
      Q2 = Q2,
      Q3 = Q3,
      lower_bound = lower_bound,
      upper_bound = upper_bound
    ))
  }
  
  # Liste pour stocker les résultats par colonne
  results <- list()
  
  # Appliquer la fonction à chaque colonne numérique du data frame
  for (colname in names(df)) {
    if (is.numeric(df[[colname]])) {
      outlier_info <- find_outliers(df[[colname]])
      results[[colname]] <- list(
        outliers = outlier_info$outliers,
        Q1 = outlier_info$Q1,
        Q2 = outlier_info$Q2,
        Q3 = outlier_info$Q3,
        lower_bound = outlier_info$lower_bound,
        upper_bound = outlier_info$upper_bound,
        outlier_count = length(outlier_info$outliers)
      )
    }
  }
  return(results)
}

# Appliquer la fonction au jeu de données
outlier_results <- detect_outliers(data)

# Construire un tableau résumé
summary_table <- do.call(rbind, lapply(names(outlier_results), function(colname) {
  res <- outlier_results[[colname]]
  if (!is.null(res)) {
    data.frame(
      Variable = colname,
      Q1 = res$Q1,
      Q2 = res$Q2,
      Q3 = res$Q3,
      Borne_inferieure = paste0(round(res$lower_bound, 2), " (Q1 - 1.5 * IQR)"),
      Borne_superieure = paste0(round(res$upper_bound, 2), " (Q3 + 1.5 * IQR)"),
      Effectifs = res$outlier_count,
      Pourcentages = round(res$outlier_count * 100 / nrow(data), 2),
      Valeurs_aberantes = ifelse(res$outlier_count > 0, 
                                 paste(res$outliers, collapse = ", "), 
                                 "Aucune")
    )
  }
}))

# Afficher les résultats sous forme de tableau
library(knitr)
summary_table %>% 
  kable("pipe", align = "c", caption = "Détails des valeurs aberrantes par variable")
Détails des valeurs aberrantes par variable
Variable Q1 Q2 Q3 Borne_inferieure Borne_superieure Effectifs Pourcentages Valeurs_aberantes
25% GDP_Growth_Rate 1 1.3 1.5 0.25 (Q1 - 1.5 * IQR) 2.25 (Q3 + 1.5 * IQR) 0 0 Aucune

Les données de la variable GDP_Growth_Rate semblent cohérentes et homogènes. Aucun point de données n'est significativement éloigné des autres selon la méthode basée sur l'IQR.

Les valeurs Q1, Q2, et Q3 montrent une distribution relativement concentrée, avec un faible IQR, indiquant une faible variabilité entre le 25ème et le 75ème percentile.

Les bornes inférieure et supérieure (0.25 et 2.25) sont larges par rapport à la gamme des données présentes, ce qui contribue à l'absence de valeurs aberrantes.

d. Représentation graphique de la série du taux de croissance trimestriel du PIB

variables <- names(data)[-1]  # Exclure la colonne Quarter
variables
## [1] "GDP_Growth_Rate"
# Créer le graphique de la série
for (variable in variables) {
  p <- ggplot(data, aes(x = Quarter , y = .data[[variable]])) +
    geom_line() +
    labs(title = paste("Évolution de", variable),
         x = "Année",
         y = variable) +
    theme_minimal()
  print(p)
}

2.Vérifier la stationnarité et transformer la série si nécessaire.

a.Transformation des données en serie temporelle

# Créer une nouvelle base de données pour stocker
ts_data <- list()

# Définir la période des séries temporelles
start_year <- 2010
start_quarter <- 1

# Transformer chaque colonne en série temporelle
for (var in colnames(data)) {
  ts_data[[var]] <- ts(data[[var]], start = c(start_year, start_quarter), frequency = 4)
}

# Afficher la série temporelle de la variable
print((ts_data$GDP_Growth_Rate))
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2010  1.2  0.9  1.5  1.3
## 2011  0.8  0.7  1.1  1.4
## 2012  1.0  0.6  1.2  1.5
## 2013  1.1  0.8  1.3  1.4
## 2014  1.0  0.7  1.2  1.5
## 2015  1.2  0.9  1.3  1.6
## 2016  1.1  0.8  1.4  1.7
## 2017  1.2  0.9  1.4  1.8
## 2018  1.3  0.8  1.5  1.7
## 2019  1.2  0.9  1.5  1.8
## 2020  1.4  1.0  1.6  1.9
## 2021  1.3  1.1  1.5  1.7
## 2022  1.4  1.0  1.5  1.8
## 2023  1.3  1.1  1.6  1.9

b.Représentation graphique

# Visualiser la série temporelle pour GDP_Growth_Rate
plot.ts(ts_data$GDP_Growth_Rate,
        col = "blue", lwd = 2,
        xlab = "Année", ylab = "GDP_Growth_Rate",
        main = "Évolution de GDP_Growth_Rate")
abline(h = mean(ts_data$GDP_Growth_Rate),
       col = "red", 
       lwd = 2,
       lty = 2)

c. Test de stationnarité

Tests de racine unitaire de Dickey-Fuller (DF)

Les tests de Dickey-Fuller (DF) sont utilisés pour identifier la présence d’une racine unitaire dans une série temporelle, ce qui permet de déterminer si la série est stationnaire. Il existe trois variantes du test, chacune adaptée à des caractéristiques spécifiques des séries temporelles :

i. Modèle sans constante

Le modèle de Dickey-Fuller sans constante s’écrit :

\(y_{t}\) = \(\rho\) * \(y_{t-1}\) + \(\epsilon_{t}\)

où :

  • \(y_{t}\) est la série temporelle.

  • \(\rho\) est le coefficient de \(y_{t-1}\).

  • \(\epsilon_{t}\) est un terme d’erreur blanc.

L’hypothèse nulle (H0) est que \(\rho =1\) (indiquant une racine unitaire), contre l’hypothèse alternative (H1) que \(\rho <1\) (indiquant que la série est stationnaire).

ii. Modèle avec constante

Le modèle de Dickey-Fuller avec constante s’écrit :

\(y_{t}\) = \(\alpha\) + \(\rho\) * \(y_{t-1}\) + \(\epsilon_{t}\)

où :

  • \(\alpha\) est le terme constant.

Dans ce modèle, la série peut fluctuer autour d’une moyenne non nulle. L’hypothèse nulle (H0) est que \(\rho = 1\), contre l’hypothèse alternative (H1) que \(\rho < 1\).

ii. Modèle avec constante et tendance

Le modèle de Dickey-Fuller avec constante et tendance s’écrit :

\(y_{t}\) = \(\alpha\) + \(\beta t\) + \(\rho\) * \(y_{t-1}\) +\(\epsilon_{t}\)

où :

  • \(\beta t\) représente la tendance déterministe.
  • \(\beta\) est le coefficient de la tendance temporelle \(t\).

Ce modèle est utilisé pour des séries qui montrent une tendance croissante ou décroissante au fil du temps. L’hypothèse nulle (H0) est que \(\rho = 1\), contre l’hypothèse alternative (H1) que \(\rho < 1\).

Nous allons commencer par mettre en place les trois modèles de base nécessaires pour tester la stationnarité. Nous appliquerons séquentiellement le modèle 3, suivi du modèle 2, puis du modèle 1, afin de déterminer selon quel modèle la variable est stationnaire. Si la variable n’est stationnaire selon aucun de ces modèles, nous procéderons à une différenciation et reprendrons la procédure avec les mêmes modèles. Ce processus sera réitéré jusqu’à ce que toutes les variables deviennent stationnaires à un certain ordre de différenciation.

Implementation des modeles

iii. Modele avec tendance et constante

# Fonction pour tester la stationnarité avec tendance et constante
modele3 <- function(ts_data, variables) {
  # Fonction pour ajouter des étoiles basées sur la p-value
  add_stars <- function(estimate, p.value) {
    stars <- ifelse(p.value < 0.001,
                    "***",
                    ifelse(p.value < 0.01,
                           "**",
                           ifelse(p.value < 0.05,
                                  "*",
                                  "")))
    paste0(round(estimate, 4), stars)
  }
  
  # Créer une liste pour stocker les résultats
  results <- list()
  
  for (var in variables) {
    series <- ts_data[[var]]
    adf_trend <- ur.df(series, type = "trend", selectlags = "AIC")
    
    # Extraire les coefficients et les p-values
    coef <- summary(adf_trend)@testreg$coefficients
    
    # Vérifier les noms des coefficients disponibles
    coef_names <- rownames(coef)
    
    # Trouver les index des coefficients nécessaires
    z_lag_1_index <- which(coef_names == "z.lag.1")
    trend_index <- which(coef_names == "tt")
    z_diff_lag_index <- grep("z.diff.lag", coef_names)[1]
    const_index <- which(coef_names == "(Intercept)")
    
    # Stocker les résultats pour chaque variable
    results[[var]] <- data.frame(
      Variable = var,
      z.lag.1 = add_stars(coef[z_lag_1_index, "Estimate"], coef[z_lag_1_index, "Pr(>|t|)"]),
      Tendance = add_stars(coef[trend_index, "Estimate"], coef[trend_index, "Pr(>|t|)"]),
      z.diff.lag = ifelse(length(z_diff_lag_index) > 0, add_stars(coef[z_diff_lag_index, "Estimate"], coef[z_diff_lag_index, "Pr(>|t|)"]), NA),
      Constante = add_stars(coef[const_index, "Estimate"], coef[const_index, "Pr(>|t|)"])
    )
  }
  
  # Combiner tous les résultats en un seul dataframe
  results_df <- bind_rows(results)
  
  # Créer le tableau final
  final_table <- results_df %>%
    kable(format = "markdown", col.names = c("Variable", "z.lag.1", "Tendance", "z.diff.lag", "Constante"), align = c("l", "r", "r", "r", "r"))
  
  return(final_table)
}

# Application de la fonction
variables <- c("GDP_Growth_Rate")
modele3(ts_data, variables)
Variable z.lag.1 Tendance z.diff.lag Constante
GDP_Growth_Rate -1.8587*** 0.0158*** 0.9006*** 1.9085***

Interprétation des résultats

  • z.lag.1 : La valeur de -1.8587*** avec trois étoiles indique que ce coefficient est statistiquement significatif au niveau de 0.1% (p < 0.001). Cette valeur négative et significative suggère que le modèle détecte une stationnarité lorsqu'une tendance est incluse.
  • Tendance : La valeur de 0.0158*** avec trois étoiles montre que la tendance est également hautement significative au niveau de 0.1% (p < 0.001). Cela indique une tendance déterministe significative dans la série temporelle.
  • z.diff.lag : La valeur de 0.9006*** avec trois étoiles est significative, ce qui pourrait indiquer une forte autocorrélation dans les différenciations successives.
  • Constante : La constante de 1.9085*** est aussi significative à 0.1% (p < 0.001), ce qui suggère que la série temporelle a une moyenne non nulle lorsqu'on tient compte de la tendance.

En conclusion, les fluctuations du taux de croissance du PIB sont stationnaires autour d'une tendance déterministe sur la période analysée.

ii. Modele avec constante

variables_const <- c("GDP_Growth_Rate")

# Fonction pour tester la stationnarité avec constante
modele2 <- function(ts_data, variables_const) {
  # Fonction pour ajouter des étoiles basées sur la p-value
  add_stars <- function(estimate, p.value) {
    stars <- ifelse(p.value < 0.001, "***",
                    ifelse(p.value < 0.01, "**",
                           ifelse(p.value < 0.05, "*",
                                  "")))
    paste0(round(estimate, 4), stars)
  }
  
  # Créer une liste pour stocker les résultats
  results <- list()
  
  for (var in variables_const) {
    series <- ts_data[[var]]
    adf_drift <- ur.df(series, type = "drift", selectlags = "AIC")
    
    # Extraire les coefficients et les p-values
    coef <- summary(adf_drift)@testreg$coefficients
    
    # Vérifier les noms des coefficients disponibles
    coef_names <- rownames(coef)
    
    # Trouver les index des coefficients nécessaires
    z_lag_1_index <- which(coef_names == "z.lag.1")
    z_diff_lag_index <- grep("z.diff.lag", coef_names)[1]  # Prend le premier s'il y en a plusieurs
    const_index <- which(coef_names == "(Intercept)")
    
    # Stocker les résultats pour chaque variable
    results[[var]] <- data.frame(
      Variable = var,
      z.lag.1 = add_stars(coef[z_lag_1_index, "Estimate"], coef[z_lag_1_index, "Pr(>|t|)"]),
      z.diff.lag = ifelse(length(z_diff_lag_index) > 0, add_stars(coef[z_diff_lag_index, "Estimate"], coef[z_diff_lag_index, "Pr(>|t|)"]), NA),
      constante = add_stars(coef[const_index, "Estimate"], coef[const_index, "Pr(>|t|)"])
    )
  }
  
  # Combiner tous les résultats en un seul dataframe
  results_df_const <- bind_rows(results)
  
  # Créer le tableau final
  final_table_const <- results_df_const %>%
    kable(format = "markdown", col.names = c("Variable", "z.lag.1", "z.diff.lag", "constante"), align = c("l", "r", "r", "r"))
  
  return(final_table_const)
}

# Application de la fonction à tes données
modele2(ts_data, variables_const)
Variable z.lag.1 z.diff.lag constante
GDP_Growth_Rate -1.3326*** 0.6475*** 1.6968***

Interprétation des résultats

  • z.lag.1 : La valeur de -1.3326*** avec trois étoiles indique que ce coefficient est statistiquement significatif au niveau de 0.1% (p < 0.001). Cette valeur négative et significative suggère que le modèle détecte une stationnarité lorsqu'une constante est incluse.
  • z.diff.lag : La valeur de 0.6475*** avec trois étoiles montre une forte autocorrélation dans les différenciations successives, significative au niveau de 0.1% (p < 0.001).
  • Constante : La constante de 1.6968*** est également significative à 0.1% (p < 0.001), ce qui suggère que la série temporelle a une moyenne non nulle lorsqu'on tient compte de la constante.

En conclusion, les fluctuations du taux de croissance du PIB sont stationnaires lorsqu'on inclut une constante dans le modèle, sur la période analysée.

i. Modele sans constante (modele simple, sans tendance ni constante)

# Liste contenant la variable GDP_Growth_Rate
variables_ss <- c("GDP_Growth_Rate")

# Fonction pour tester la stationnarité sans constante
modele1 <- function(ts_data, variables_ss) {
  # Fonction pour ajouter des étoiles basées sur la p-value
  add_stars <- function(estimate, p.value) {
    stars <- ifelse(p.value < 0.001, "***",
                    ifelse(p.value < 0.01, "**",
                           ifelse(p.value < 0.05, "*",
                                  "")))
    paste0(round(estimate, 4), stars)
  }
  
  # Créer une liste pour stocker les résultats
  results <- list()
  
  for (var in variables_ss) {
    series <- ts_data[[var]]
    adf_none <- ur.df(series, type = "none", selectlags = "AIC")
    
    # Extraire les coefficients et les p-values
    coef <- summary(adf_none)@testreg$coefficients
    
    # Vérifier les noms des coefficients disponibles
    coef_names <- rownames(coef)
    
    # Trouver les index des coefficients nécessaires
    z_lag_1_index <- which(coef_names == "z.lag.1")
    z_diff_lag_index <- grep("z.diff.lag", coef_names)[1]  # Prend le premier s'il y en a plusieurs
    
    # Stocker les résultats pour chaque variable
    results[[var]] <- data.frame(
      Variable = var,
      z.lag.1 = add_stars(coef[z_lag_1_index, "Estimate"], coef[z_lag_1_index, "Pr(>|t|)"]),
      z.diff.lag = ifelse(length(z_diff_lag_index) > 0, add_stars(coef[z_diff_lag_index, "Estimate"], coef[z_diff_lag_index, "Pr(>|t|)"]), NA)
    )
  }
  
  # Combiner tous les résultats en un seul dataframe
  results_df_ss <- bind_rows(results)
  
  # Créer le tableau final
  final_table_ss <- results_df_ss %>%
    kable(format = "markdown", col.names = c("Variable", "z.lag.1", "z.diff.lag"), align = c("l", "r", "r"))
  
  return(final_table_ss)
}

# Application de la fonction à tes données
modele1(ts_data, variables_ss)
Variable z.lag.1 z.diff.lag
GDP_Growth_Rate -0.0343 -0.007

Interprétation des résultats

  • z.lag.1 : La valeur de -0.0343 n'est pas statistiquement significative, ce qui suggère que le modèle sans constante ne détecte pas de stationnarité pour cette variable.
  • z.diff.lag : La valeur de -0.007 n'est également pas significative, indiquant une faible autocorrélation dans les différenciations successives.

En conclusion, le modèle sans constante ne permet pas de conclure que les fluctuations du taux de croissance du PIB sont stationnaires pour la période analysée.

En résumé, les tests de stationnarité montrent que la variable GDP_Growth_Rate présente une stationnarité significative lorsque l’on inclut soit une constante, soit une tendance et une constante dans le modèle. Les fluctuations du taux de croissance du PIB du Niger sont donc stationnaires autour d’une moyenne ou d’une tendance déterministe sur la période analysée.

3. Sélectionner et estimer les paramètres du modèle ARIMA(p, d, q) le mieux ajusté.

a.Modèle ARIMA

ARIMA (AutoRegressive Integrated Moving Average) est un modèle de séries temporelles utilisé pour comprendre et prévoir les valeurs futures basées sur les valeurs passées. Le modèle ARIMA se compose de trois parties :

AR (Auto-Regressive)

Cette partie du modèle utilise la dépendance linéaire entre les observations passées et les valeurs présentes. Elle est représentée par le paramètre p.

Par exemple, un modèle AR(1) signifie que la valeur actuelle dépend de la valeur précédente.

Formule générale :
yt = c + φ1yt-1 + φ2yt-2 + ... + φpyt-p + εt

I (Integrated)

Cette partie du modèle représente le nombre de différences nécessaires pour rendre la série temporelle stationnaire. Elle est représentée par le paramètre d.

Si la série est déjà stationnaire, alors d = 0. Si une différenciation est nécessaire, alors d = 1, etc.

Opération de différenciation :
y't = yt - yt-1

MA (Moving Average)

Cette partie du modèle utilise la dépendance linéaire entre les valeurs passées des erreurs (résidus) et la valeur présente. Elle est représentée par le paramètre q.

Par exemple, un modèle MA(1) signifie que la valeur actuelle dépend de l'erreur précédente.

Formule générale :
yt = c + εt + θ1εt-1 + θ2εt-2 + ... + θqεt-q

Processus de Sélection des Paramètres

  • Identification de la stationnarité : Si la série n'est pas stationnaire, il faut différencier la série pour la rendre stationnaire (identifier d).
  • Identification des paramètres AR et MA : Examiner les autocorrélations et autocorrélations partielles pour déterminer les valeurs appropriées de p et q.
  • Estimation des paramètres : Utiliser des méthodes telles que les critères d'information d'Akaike (AIC) ou Bayesien (BIC) pour sélectionner le modèle ARIMA le mieux ajusté.

b.Sélection et Estimation des Paramètres

# Charger les données de série temporelle
series <- ts_data$GDP_Growth_Rate

# Identifier la stationnarité et différencier si nécessaire
ndiffs(series)  # Nombre de différenciations nécessaires pour rendre la série stationnaire
## [1] 1
# Appliquer la différenciation si nécessaire
diff_series <- diff(series, differences = 1)

# Identifier les paramètres p et q en utilisant les fonctions auto.arima
best_model <- auto.arima(series)

# Afficher le modèle ARIMA sélectionné
print(best_model)
## Series: series 
## ARIMA(0,0,1)(1,1,1)[4] with drift 
## 
## Coefficients:
##          ma1     sar1     sma1   drift
##       0.5373  -0.3461  -0.8867  0.0083
## s.e.  0.1341   0.1831   0.2662  0.0010
## 
## sigma^2 = 0.008669:  log likelihood = 47.14
## AIC=-84.28   AICc=-82.98   BIC=-74.52
# Résumé des résultats du modèle
summary(best_model)
## Series: series 
## ARIMA(0,0,1)(1,1,1)[4] with drift 
## 
## Coefficients:
##          ma1     sar1     sma1   drift
##       0.5373  -0.3461  -0.8867  0.0083
## s.e.  0.1341   0.1831   0.2662  0.0010
## 
## sigma^2 = 0.008669:  log likelihood = 47.14
## AIC=-84.28   AICc=-82.98   BIC=-74.52
## 
## Training set error measures:
##                       ME       RMSE        MAE       MPE     MAPE      MASE
## Training set -0.01212366 0.08619943 0.06564736 -2.109385 5.697404 0.5505908
##                   ACF1
## Training set -0.102386

Le modèle ARIMA sélectionné pour la série temporelle du taux de croissance du PIB (GDP_Growth_Rate) est ARIMA(0,0,1)(1,1,1)[4] avec dérive. interprétation des résultats obtenus :

  • Coefficients :
    • ma1 : 0.5373
    • sar1 : -0.3461
    • sma1 : -0.8867
    • drift : 0.0083
  • Erreurs standards (s.e.) :
    • ma1 : 0.1341
    • sar1 : 0.1831
    • sma1 : 0.2662
    • drift : 0.0010
  • Mesures d’erreur du modèle :
    • sigma^2 : 0.008669
    • log likelihood : 47.14
    • AIC : -84.28
    • AICc : -82.98
    • BIC : -74.52

Ces mesures indiquent que le modèle ARIMA sélectionné s’ajuste bien à la série temporelle du taux de croissance du PIB, avec de faibles erreurs et des critères d’information favorables. Le modèle peut être utilisé pour prévoir les valeurs futures de la série temporelle, en tenant compte des composantes saisonnières et de la dérive.

### Cliquez pour obtenir des informations sur les résultats obtenus
Cliquez pour déplier

Coefficients :

  • ma1 : 0.5373
    Explication : Le coefficient MA (Moyenne Mobile) d'ordre 1 indique que la valeur actuelle dépend d'environ 53.73% de l'erreur de prédiction de la période précédente. Un coefficient MA positif signifie que si l'erreur précédente était positive, la valeur actuelle sera ajustée à la baisse, et vice versa.
  • sar1 : -0.3461
    Explication : Le coefficient SAR (Autorégressif Saisonnier) d'ordre 1 indique une dépendance négative entre les valeurs observées à une fréquence saisonnière. Autrement dit, si la valeur du trimestre précédent était élevée, la valeur actuelle pourrait être plus basse et vice versa.
  • sma1 : -0.8867
    Explication : Le coefficient SMA (Moyenne Mobile Saisonnière) d'ordre 1 indique une forte dépendance négative entre les erreurs saisonnières consécutives. Cela signifie qu'une erreur positive dans une période saisonnière tend à être suivie par une erreur négative dans la période suivante.
  • drift : 0.0083
    Explication : La dérive (drift) représente une tendance linéaire dans les données non stationnaires. Un coefficient de 0.0083 indique une légère tendance ascendante dans la série temporelle de la croissance du PIB.

Erreurs standards (s.e.) :

  • ma1 : 0.1341
    Une erreur standard faible (0.1341) indique que l'estimation du coefficient ma1 est précise.
  • sar1 : 0.1831
    L'erreur standard de 0.1831 pour sar1 montre que l'estimation de ce coefficient est relativement précise.
  • sma1 : 0.2662
    L'erreur standard de 0.2662 pour sma1 indique une précision acceptable de l'estimation de ce coefficient.
  • drift : 0.0010
    Une très faible erreur standard de 0.0010 pour la dérive montre que l'estimation de la tendance linéaire est très précise.

Mesures d'erreur du modèle :

  • sigma^2 : 0.008669
    Cela mesure la variance des erreurs de prédiction du modèle. Une valeur faible indique que le modèle capture bien les variations dans les données.
  • log likelihood : 47.14
    Indique la qualité de l'ajustement du modèle aux données. Une valeur élevée est préférable.
  • AIC : -84.28
    Critère d'information d'Akaike, utilisé pour la sélection de modèles. Une valeur plus basse indique un meilleur modèle.
  • AICc : -82.98
    Version corrigée de l'AIC. Utilisée pour des petits échantillons.
  • BIC : -74.52
    Critère d'information bayésien, utilisé également pour la sélection de modèles. Une valeur plus basse indique un meilleur modèle.

4.Valider le modèle à l’aide de tests diagnostiques.

# Charger le modèle ARIMA
best_model <- auto.arima(series)

# Résidus du modèle
residuals <- residuals(best_model)

# Autocorrélation des résidus
acf(residuals)

Le graphique ACF des résidus montre si les résidus sont autocorrélés. Dans un bon modèle ARIMA, les résidus doivent se comporter comme un bruit blanc, c’est-à-dire qu’ils ne doivent pas être autocorrélés. Si les barres d’autocorrélation sont proches de zéro, cela indique que les résidus ne sont pas autocorrélés.

# Test de Ljung-Box
Box.test(residuals, lag=20, type="Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals
## X-squared = 15.754, df = 20, p-value = 0.7318

La p-value de 0.7318 est élevée, ce qui indique que nous ne rejetons pas l’hypothèse nulle. Cela signifie que les résidus sont indépendants et qu’il n’y a pas d’autocorrélation significative.

# Test de Shapiro-Wilk
shapiro.test(residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals
## W = 0.97973, p-value = 0.4642

La p-value de 0.4642 est élevée, ce qui indique que nous ne rejetons pas l’hypothèse nulle de normalité. Cela signifie que les résidus suivent une distribution normale.

# Histogramme des résidus
hist(residuals, main="Histogramme des Résidus", xlab="Résidus")

la distribution est symétrique et en forme de cloche, cela indique que les résidus suivent une distribution normale.

# Q-Q Plot des résidus
qqnorm(residuals)
qqline(residuals, col="red")

les points suivent la ligne droite, cela indique que les résidus suivent une distribution normale.

# ADF Test sur les résidus
adf.test(residuals)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  residuals
## Dickey-Fuller = -2.8602, Lag order = 3, p-value = 0.2278
## alternative hypothesis: stationary

La p-value de 0.2278 est supérieure à 0.05, ce qui indique que nous ne rejetons pas l’hypothèse nulle de non-stationnarité. Cela signifie que les résidus ne sont pas stationnaires.

5.Prévoir le taux de croissance du PIB pour les quatre prochains trimestres

# Estimer le modèle ARIMA
fit <- auto.arima(series)

# Prévoir les quatre prochains trimestres
forecast <- forecast(fit, h=4)

# Afficher les prévisions
print(forecast)
##         Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 2024 Q1       1.485431 1.3655576 1.605305 1.3021004 1.668762
## 2024 Q2       1.107629 0.9715886 1.243669 0.8995733 1.315684
## 2024 Q3       1.643679 1.5076386 1.779719 1.4356233 1.851734
## 2024 Q4       1.893268 1.7572564 2.029279 1.6852564 2.101279
plot(forecast)

Interprétation des Prévisions

-Prévisions du PIB : Ces prévisions montrent les valeurs attendues du taux de croissance du PIB pour les quatre prochains trimestres. Par exemple, pour le premier trimestre de 2024, le taux de croissance prévu est de 1.485431.

-Intervalles de Confiance : Les intervalles de confiance indiquent la variabilité des prévisions. Par exemple, pour le premier trimestre de 2024, il y a 80% de chances que le taux de croissance du PIB se situe entre 1.3655576 et 1.605305, et 95% de chances qu’il se situe entre 1.3021004 et 1.668762.

-Tendances : Les prévisions montrent une augmentation générale du taux de croissance du PIB au fil des trimestres en 2024, avec une prévision de 1.485431 au premier trimestre et atteignant 1.893268 au quatrième trimestre.

Accéder aux Résultats de Prévisions

Vous pouvez accéder aux résultats des prévisions du taux de croissance du PIB pour les quatre prochains trimestres en cliquant sur le lien suivant :

Résultats de Prévisions