Une fois que la série est stationnaire, elle n’est pas nécessairement “parfaite”, dans le sens où d’autres éléments peuvent encore avoir de l’influence sur la série. Ces éléments sont notamment le coefficient auto-régressif (AR) et la moyenne mobile, ou moving average (MA), qui forment la structure de la série lorsqu’on ajoute l’ordre d’intégration (I) de la série, qu’on a vu dans la séance 2 sur la stationnarité. Une série idéale a la structure suivante :
\[ Y_t= \varepsilon_t \]
Dans ce cas, la série est parfaitement stationnaire. Dans certains cas, même lorsqu’elle est stationnaire, la série est influencée par son propre lag :
\[ Y_t=\phi Y_{t-1} + \varepsilon_t \]
On appelle cela des processus \(AR(1)\). On peut généraliser à \(p\) lags pour les \(AR(p)\):
\[ Y_t=\phi_1 Y_{t-1} + \phi_2 Y_{t-2} + \cdots + \phi_p Y_{t-p} + \varepsilon_t \\ Y_t = \sum_{p=1}^{P} \phi_1 Y_{t-p}+\varepsilon_t \]
Parfois, la série peut être influencée par ses propres chocs passés :
\[ Y_t= \varepsilon_t + \theta \varepsilon_{t-1} \]
Qu’on appelle les modèles \(MA(1)\) et qu’on peut généraliser à \(q\) délais pour les \(MA(q)\) :
\[\begin{equation} Y_t= \varepsilon_t + \theta _1\varepsilon_{t-1}+\theta _2\varepsilon_{t-2}+\cdots + \theta _q\varepsilon_{t-q} \\ Y_t= \sum_{q=0}^{Q}\theta _q\varepsilon_{t-q} \end{equation}\]
Et parfois, la série est influencée à la fois par ses propres lags et par ses chocs passés, on parle alors de modèle \(ARMA\) :
\[ Y_t=\phi Y_{t-1} + \varepsilon_t + \theta \varepsilon_{t-1} \]
Ici, dans le cas d’un modèle \(ARMA(1,1)\), mais qu’on peut généraliser en \(ARMA(p,q)\). \[ Y_t = \sum_{p=1}^{P} \phi_1 Y_{t-p}+\sum_{q=1}^{Q}\theta _q\varepsilon_{t-q}+\varepsilon_t \] Dans notre cas, on avait étudié dans les séances précédentes la courbe de Phillips et nous avons déterminé que l’inflation et le taux de chômage sont tous deux intégrés d’ordre 1 (il faut les passer en différence première pour les stationnariser).
setwd(dir = "C:/Users/fkraus/Desktop/TD/2025-2026/ECONOMETRIE/séance5")
data_schularick <-read_excel("C:/Users/fkraus/Desktop/data_schularick.xlsx")
donnees_france <- data_schularick %>%
filter(country=="France")%>%
select(year, unemp, cpi) %>%
mutate(inflation = (log(cpi) - lag(log(cpi)))*100)%>%
# mutate(dinflation = inflation - lag(inflation))%>%
mutate(dunemp = unemp - lag(unemp))%>%
na.omit()%>%
filter(year > 1950)
On va maintenant s’interesser à la structure du taux de chômage dans un premier temps, en sachant que pour faire la régression de l’inflation expliquée par le chômage, il faut également vérifier la structure du taux d’inflation. C’est ce qu’on fera dans un deuxième temps.
Il est possible de repérer la structure ARIMA d’une série temporelle à l’aide de l’autocorrélogramme complet (ACF) et partiel (PACF) :
acf(donnees_france$dunemp)
pacf(donnees_france$dunemp)
Dans la pratique, on se reporte plutôt à des tests formels. Plus précisément, on applique des modèles AR de différents ordres \(p\), des modèles MA de différents ordres \(q\), et des modèles ARMA de différents ordres \(p\) et \(q\). Par exemple, pour un AR(1)
ar1 <- arima(donnees_france$dunemp, order=c(1,0,0))
ar1
Call:
arima(x = donnees_france$dunemp, order = c(1, 0, 0))
Coefficients:
ar1 intercept
0.2937 0.0768
s.e. 0.1138 0.1001
sigma^2 estimated as 0.3538: log likelihood = -63.01, aic = 132.01
Le modèle donne le coefficient associé au premier retard (ar1) et à la constante (intercept), ainsi qu’un critère important : AIC. Le but dans la sélection du modèle est de choisir le modèle qui minimise ce critère parmi l’ensemble des modèles qu’on a testé. On peut donner l’exemple avec tous les modèles jusqu’à deux lags.
ar1 <- arima(donnees_france$dunemp, order=c(1,0,0))
ar2 <- arima(donnees_france$dunemp, order=c(2,0,0))
ma1 <- arima(donnees_france$dunemp, order=c(0,0,1))
ma2 <- arima(donnees_france$dunemp, order=c(0,0,2))
arma12<- arima(donnees_france$dunemp, order=c(1,0,2))
arma21<- arima(donnees_france$dunemp, order=c(2,0,1))
arma22<- arima(donnees_france$dunemp, order=c(2,0,2))
aic <- data.frame(
"ar1"= ar1$aic, "ar2"= ar2$aic, "ma1"= ma1$aic,
"ma2"= ma2$aic, "arma12"= arma12$aic, "arma21"= arma21$aic,"arma22"= arma22$aic
)
aic
(Vous pouvez tester avec des retards jusqu’à 3 à la main, et vous verrez que le nombre de modèle à estimer est exponentiel avec le nombre de retards).
Ici, la sélection faite à la main indique que le modèle AR(1) est celui qui minimise le critère AIC, donc la série de taux de chômage semble suivre un modèle auto-régressif d’ordre 1. Pour rappel, la série est également intégrée d’ordre 1, donc le taux de chômage suit un processus ARIMA(1,1,0).
On peut également automatiser la sélection du modèle avec la fonction
auto.arima() dans R, du package forecast.
require(forecast)
auto<- auto.arima(donnees_france$dunemp,
max.p = 10,
max.q = 10,
max.d = 0)
auto
Series: donnees_france$dunemp
ARIMA(1,0,0) with zero mean
Coefficients:
ar1
0.3061
s.e. 0.1131
sigma^2 = 0.3619: log likelihood = -63.29
AIC=130.59 AICc=130.77 BIC=135.09
La sélection automatique du modèle nous donne également le modèle AR(1) comme celui minimisant le critère AIC. On peut donc regarder la dynamique des résidus du modèle AR(1) - qui représentent donc la série de taux de chômage indépendante de cette composante - et la comparer à la dynamique de la série qui contient cette influence.
residus_ar1 <- residuals(auto)
nouvelles_donnees <- cbind(donnees_france, residus_ar1)
nouvelles_donnees %>% ggplot(aes(x=year, y=dunemp))+
geom_line(lwd=1)+
geom_line(aes(y=residus_ar1), color="red", lwd=1, lty=2)+
theme_bw()
Et on peut faire la même chose pour l’inflation.
auto_inflation<- auto.arima(donnees_france$inflation,
max.p = 10,
max.q = 10,
max.d = 0)
auto_inflation
Series: donnees_france$inflation
ARIMA(2,0,2) with non-zero mean
Coefficients:
ar1 ar2 ma1 ma2 mean
-0.2690 0.5610 1.3530 0.5548 4.4512
s.e. 0.1376 0.1797 0.1533 0.1755 1.1217
sigma^2 = 5.881: log likelihood = -159.7
AIC=331.4 AICc=332.73 BIC=344.89
residus_inflation <- residuals(auto_inflation)
nouvelles_donnees2 <- cbind(nouvelles_donnees, residus_inflation)
La série ne suit aucune structure temporelle de type ARMA.
On peut donc faire la régression avec les données indépendantes de leur structure, et comparer avec la régression qui ne prend pas en compte la structure :
reg1 <- feols(residus_inflation ~ residus_ar1, data= nouvelles_donnees2)
reg2 <-feols(inflation ~ dunemp, data= nouvelles_donnees2)
etable(reg1, reg2)
reg1 reg2
Dependent Var.: residus_inflation inflation
Constant -0.1155 (0.2840) 4.060*** (0.4607)
residus_ar1 -0.1488 (0.4755)
dunemp 1.663* (0.7335)
_______________ _________________ _________________
S.E. type IID IID
Observations 70 70
R2 0.00144 0.07031
Adj. R2 -0.01325 0.05664
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Ici, on voit que la régression qui ne prend pas en compte la structure auto-régressive des données donne un coefficient positif et significatif. Quand on isole correctement les variables de leur structure ARIMA, on voit que le coefficient n’est pas significativement différent de 0.
checkresiduals(reg1)
Ljung-Box test
data: Residuals from feols
Q* = 16.409, df = 10, p-value = 0.08851
Model df: 0. Total lags used: 10
checkresiduals(reg2)
Ljung-Box test
data: Residuals from feols
Q* = 87.576, df = 10, p-value = 1.621e-14
Model df: 0. Total lags used: 10
Ici, le fait d’utiliser la structure correcte ARIMA n’a pas énormément changer l’allure des résidus de la régression. C’est normal car le modèle de régression n’a pas tant changé. La seule différence qu’on peut constater est que les résidus suivent un peu plus une loi normale quand on ajoute la structure ARIMA, mais ce qu’on avait montré dans la séance précédente, c’était que le modèle était relativement correcte dans l’ensemble, mais manque de pouvoir prédictif (ou, du moins, peut être mieux expliqué).
On peut également noter un élément important : les modèles ARIMA permettent d’expliquer la dynamique d’une série à partir de son processus passé. Il est donc possible de faire des prévisions avec ARIMA, c’est-à-dire prédire les valeurs futures d’une série temporelle, sur la base de son historique (voir séance 6).