Etude de la chronique ozone


Il s'agit d'une mesure de la pollution moyenne mensuelle dans la ville de Los Angeles de 1955 à 1972.

Une loi imposant le pot d'échappement catalytique a été appliquée à partir de janvier 1960.

Question: cette loi a-t-elle un impact significatif ? Si oui, pour quelle diminution de la pollution ?


Nous allons représenter graphiquement les données, puis modéliser la chronique ozone sans tenir compte de la loi (modélisation de référence), puis enfin incorporer la loi dans le modèle à l'aide d'une intervention. L'objectif est de déterminer quel est le modèle qui explique le mieux les données.

1. Représentations graphiques

On commence par charger les bibliothèques utiles et la chronique.

In [1]:
library(forecast)
library(lmtest)
library(aTSA)
options(repr.plot.width=12, repr.plot.height=10) # pour redimensionner les graphiques

ozone <- read.table("ozone.txt",header=T)
ozone <- ts(ozone,start=c(1955,1),frequency=12)
Registered S3 method overwritten by 'xts':
  method     from
  as.zoo.xts zoo 

Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 

Registered S3 methods overwritten by 'forecast':
  method             from    
  fitted.fracdiff    fracdiff
  residuals.fracdiff fracdiff

Loading required package: zoo


Attaching package: 'zoo'


The following objects are masked from 'package:base':

    as.Date, as.Date.numeric



Attaching package: 'aTSA'


The following object is masked from 'package:forecast':

    forecast


The following object is masked from 'package:graphics':

    identify


In [2]:
plot(ozone, type="o", pch =20, main="graphe de la chronique Ozone")
grid()

La chronique n'est pas stationnaire, on va être amené à la différencier (ou dériver). Nous n'introduirons pas de transformation de la chronique comme un passage au logarithme par exemple.

Pour commencer, examinons le graphique de la différenciation saisonnière:

In [3]:
plot(diff(ozone,12), ylab="(1-B^12)Ozone", main="graphe de la chronique (1-B^12)Ozone")
grid()

Le graphe ressemble à celui d'une marche aléatoire: il faudra sans doute encore différencier pour arriver à une chronique stationnaire. Néanmoins un processus AR(1) pourrait fournir une représentation similaire.

C'est d'ailleurs ce que semble suggérer les tests augmentés de Dickey-Fuller: dans tous les cas on peut rejeter l'hypothèse de non-stationnarité de la chronique $(1-B^{12})\text{Ozone}_t$ (et donc accepter sa stationnarité).

In [4]:
adf.test(diff(ozone,12))
Augmented Dickey-Fuller Test 
alternative: stationary 
 
Type 1: no drift no trend 
     lag    ADF p.value
[1,]   0 -10.39    0.01
[2,]   1  -8.29    0.01
[3,]   2  -6.23    0.01
[4,]   3  -4.86    0.01
[5,]   4  -4.34    0.01
Type 2: with drift no trend 
     lag    ADF p.value
[1,]   0 -10.55    0.01
[2,]   1  -8.50    0.01
[3,]   2  -6.46    0.01
[4,]   3  -5.05    0.01
[5,]   4  -4.49    0.01
Type 3: with drift and trend 
     lag    ADF p.value
[1,]   0 -10.54    0.01
[2,]   1  -8.53    0.01
[3,]   2  -6.52    0.01
[4,]   3  -5.10    0.01
[5,]   4  -4.51    0.01
---- 
Note: in fact, p.value = 0.01 means p.value <= 0.01 
In [5]:
plot(diff(diff(ozone,12)), ylab="(1-B)(1-B^12)Ozone", main="graphe de la chronique (1-B)(1-B^12)Ozone")
grid()

Cette chronique différenciée deux fois a l'air stationnaire. Dans la méthode de Box et Jenkins il faut s'attendre à devoir appliquer une différenciation saisonnière, et peut-être aussi une différenciation.

Rappelons que l'ordre des différenciations est indifférent, car $(1-B)(1-B^{12}) = (1-B^{12})(1-B)$.


Examinons une décomposition par lissage de la chronique ozone:

In [6]:
plot(decompose(ozone,type="additive"))

La rupture de tendance en 1960 n'est pas claire: il n'est pas évident que le modèle d'intervention sera le plus adapté. La tendance est globalement à une baisse de la pollution à l'ozone au cours du temps.

2. Modèle sans intervention

(modélisation de référence)


On commence par examiner les corrélogrammes de la chronique initiale:

In [7]:
tsdisplay(ozone)

Le corrélogramme (ACF) est périodique: il faut utiliser une différenciation saisonnière, comme le suggéraient nos graphes initiaux.

In [8]:
tsdisplay(diff(ozone,12))

L'ACF présente une décroissance relativement lente: on peut dériver. On peut aussi préférer l'identification alternative: décroissance des corrélations (ACF), corrélation significative pour un décalage de 1 dans le PACF, d'où l'identification d'un processus AR(1) sur les décalages "de court-terme".


2a. On considère $(1-B)(1-B^{12})\text{Ozone}_t$ stationnaire

On commence par le modèle avec différenciation. Remarquons que les tests de Dickey-Fuller nous indiquaient la stationnarité de $(1-B^{12})\text{Ozone}_t$: une dérivation supplémentaire peut être jugée inutile. Nous étudions tout de même ce cas pour des raisons pédagogiques, mais on peut aussi directement passer au paragraphe 2b.

In [9]:
tsdisplay(diff(diff(ozone,12)))

On remarque que l'ACF pour un décalage de 1 est négatif (presque -0.4), peut-être cette dérivation ne s'imposait-elle pas? (comme le suggéraient les graphiques initiaux et les tests de Dickey-Fuller)

On identifie pour la composante court-terme un processus MA(1) (MA(2)?). En effet, il y a globalement décroissance des corrélations partielles, et des corrélations significatives pour des décalages de 1 (2?). Rappelons qu'on n'inclut pas de constante dans le modèle lorsqu'on applique deux dérivations.

In [10]:
arima_ozone <- Arima(ozone,order=c(0,1,1),seasonal=c(0,1,0))
# remarque: la moyenne est nulle par défaut
tsdisplay(residuals(arima_ozone))

Il n'y a plus de corrélations à court-terme. Il n'est pas nécessaire d'envisager un processus MA(2). On identifie maintenant un processus pour la composante saisonnière, en examinant les décalages multiples de 12. Remarquons que les corrélations périodiques sont plus lisibles une fois les corrélations court-termes traitées. Comme l'ACF est significatif pour un décalage de 12, non significatif pour un décalage de 24, et que le PACF indique des corrélations partielles significatives et décroissantes entre les décalages 12 et 24, on identifie un processus SMA(1) pour la composante saisonnière.

In [11]:
arima_ozone <- Arima(ozone,order=c(0,1,1),seasonal=c(0,1,1))
tsdisplay(residuals(arima_ozone))
tsdiag(arima_ozone,gof.lag=15)  # il faut examiner les décalages au moins jusque la valeur de la période

Il n'y a plus de corrélations significatives, on voit que les $p$-valeurs des tests de Portmanteau (Ljung-Box statistic) sont tout juste au dessus du risque de 5%: on ne peut pas rejeter l'hypothèse de résidus formant un bruit blanc gaussien.

In [12]:
hist(residuals(arima_ozone), freq = F, col = "grey")
curve(dnorm(x, mean = mean(residuals(arima_ozone)), sd = sd(residuals(arima_ozone))), col = 2, add = TRUE)

L'histogramme des résidus, superposé à la courbe gaussienne dont la moyenne et l'écart-type sont calculés à partir des données, montre une légère asymétrie dans la distribution des résidus.


Maintenant que l'hypothèse de bruit blanc gaussien pour les résidus du modèle est validée, on peut tester la significativité des coefficients:

In [13]:
coeftest(arima_ozone)
z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ma1  -0.767405   0.070862 -10.829 < 2.2e-16 ***
sma1 -0.757916   0.061467 -12.331 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Les coefficients sont tous significativement non nuls: dans tous les cas la $p$-valeur est très faible, on peut donc rejeter l'hypothèse nulle ${\cal H}_0$ (= "le coefficient est nul").

In [14]:
summary(arima_ozone)
Series: ozone 
ARIMA(0,1,1)(0,1,1)[12] 

Coefficients:
          ma1     sma1
      -0.7674  -0.7579
s.e.   0.0709   0.0615

sigma^2 estimated as 70.78:  log likelihood=-724.99
AIC=1455.99   AICc=1456.11   BIC=1465.93

Training set error measures:
                    ME     RMSE      MAE       MPE     MAPE      MASE      ACF1
Training set -0.433277 8.115868 6.009413 -2.850972 18.07256 0.7416335 0.1299961

Le modèle final s'écrit:

$$ (1-B)(1-B^{12}) Ozone_t = (1-0.7674B)(1-0.7579B^{12}) \varepsilon_t$$

avec un écart-type des résidus estimé à 8.115868 (RMSE).


2b. On considère $(1-B^{12})\;\text{Ozone}_t$ stationnaire

Si on décide de modéliser sans dériver initialement (on utilise tout de même une différenciation saisonnière) mais en utilisant un processus AR(1) pour modéliser les corrélations court-termes:

In [15]:
arima_ozone <- Arima(ozone,order=c(1,0,0),seasonal=c(0,1,0),include.constant=T)
tsdisplay(residuals(arima_ozone))

Remarquons qu'on inclut la moyenne dans le modèle (include.constant=T), ce qui n'est pas le comportement par défaut de Arima. On verra par la suite si la moyenne est significative.

Les corrélations à court-terme ne sont plus significatives.

Si on examine les corrélations pour les décalages multiple de 12, on identifie un processus SMA(1) (car décroissance pour PACF(12)-PACF(24), et ACF(12) significatif / ACF(24) non-significatif).

In [16]:
arima_ozone <- Arima(ozone,order=c(1,0,0),seasonal=c(0,1,1),include.constant=T)
tsdisplay(residuals(arima_ozone))
tsdiag(arima_ozone,gof.lag=15)

Les tests de Portmanteau ne permettent pas de rejeter l'hypothèse de résidus issus d'un bruit blanc gaussien.

In [17]:
hist(residuals(arima_ozone), freq = F, col = "grey")
curve(dnorm(x, mean = mean(residuals(arima_ozone)), sd = sd(residuals(arima_ozone))), col = 2, add = TRUE)

On observe toujours une légère asymétrie.

In [18]:
coeftest(arima_ozone)
z test of coefficients:

       Estimate Std. Error  z value  Pr(>|z|)    
ar1    0.364041   0.065556   5.5532 2.805e-08 ***
sma1  -0.733207   0.069282 -10.5830 < 2.2e-16 ***
drift -0.125438   0.024333  -5.1552 2.534e-07 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
In [19]:
summary(arima_ozone)
Series: ozone 
ARIMA(1,0,0)(0,1,1)[12] with drift 

Coefficients:
         ar1     sma1    drift
      0.3640  -0.7332  -0.1254
s.e.  0.0656   0.0693   0.0243

sigma^2 estimated as 67.9:  log likelihood=-722.89
AIC=1453.79   AICc=1453.99   BIC=1467.06

Training set error measures:
                     ME    RMSE     MAE       MPE     MAPE      MASE
Training set -0.1422955 7.94899 6.08341 -2.629154 17.39237 0.7507657
                    ACF1
Training set -0.01804883

Tous les coefficients sont significatifs. Le modèle identifié est:

$$ (1-0.364B)((1-B^{12}) \,\text{Ozone}_t + 0.1254) = (1-0.7332B^{12}) \varepsilon_t$$

avec un écart-type des résidus estimé à 7.94899.

Si on compare les deux modèles identifiés, on voit que le second modèle induit une composante aléatoire d'amplitude plus faible (RMSE plus petit). Il explique donc mieux les données. Il a également une valeur du critère AIC (légèrement) plus faible, et réalise donc un meilleur compromis entre explication des données et complexité du modèle.

On retient donc ce dernier modèle, de type $\text{SARIMA}(1,0,0)(0,1,1)_{12}$, pour modéliser les données sans tenir compte de la mise en oeuvre de la loi.


3. Modèle avec intervention

On incorpore à présent une fonction d'intervention "en échelon".

On commence par créer une nouvelle série chronologique, appelée loi, qui vaut 1 à partir de janvier 1960, et 0 avant.

In [20]:
loi <- ts(as.numeric(time(ozone)>=1960),start=c(1955,1),frequency=12)
plot(ozone, type="o", pch =20, main="Chronique Ozone et intervention")
lines(loi*80,col=2)
grid()

On commence par estimer les coefficients $\mu$ et $\alpha$ d'un modèle du type: $$\text{Ozone}_t = \mu + \alpha \;\text{loi}_t + R_t$$ par régression au sens des moindres carrés.

In [21]:
fitOLS <- lm(ozone~loi);
summary(fitOLS)
tsdisplay(residuals(fitOLS))
Call:
lm(formula = ozone ~ loi)

Residuals:
    Min      1Q  Median      3Q     Max 
-29.700  -9.700  -0.911   8.878  37.300 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   49.700      1.673  29.712  < 2e-16 ***
loi          -16.578      1.968  -8.423 5.35e-15 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 12.96 on 214 degrees of freedom
Multiple R-squared:  0.249,	Adjusted R-squared:  0.2455 
F-statistic: 70.94 on 1 and 214 DF,  p-value: 5.347e-15

Les résidus $R_t$ ne forment pas un bruit blanc gaussien (on observe une corrélation temporelles), ce à quoi on pouvait se douter vue la composante saisonnière. Rappelons que les différents tests statistiques définis dans le cadre de la régression sont basés sur l'hypothèse de résidus indépendants et identiquement distribués selon une loi normale.

Ici, nous allons plutôt déterminer les coefficients d'un modèle: $$(1-B^{12})\;\text{Ozone}_t = \mu + \alpha\; (1-B^{12})\;\text{loi}_t + R_t$$

In [22]:
fitOLS <- lm(diff(ozone,12)~diff(loi,12))
summary(fitOLS)
tsdisplay(residuals(fitOLS))
Call:
lm(formula = diff(ozone, 12) ~ diff(loi, 12))

Residuals:
    Min      1Q  Median      3Q     Max 
-28.182  -6.182  -0.182   5.818  33.818 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    -0.8177     0.7362  -1.111 0.268031    
diff(loi, 12) -11.3490     3.0356  -3.739 0.000241 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 10.2 on 202 degrees of freedom
Multiple R-squared:  0.06472,	Adjusted R-squared:  0.06009 
F-statistic: 13.98 on 1 and 202 DF,  p-value: 0.0002409

Notons que le cofficient $\mu$ est déclaré non significatif par la fonction lm. Néanmoins ce test n'a de sens que dans les conditions rappelées précédemment, qui ne sont pas remplies ici. De manière générale, on ne peut pas juger de la pertinence de notre modèle d'intervention tant qu'on n'a pas une modélisation fondée sur des hypothèses validées.

Les corrélogrammes montrent que les résidus de ce modèle sont corrélés. Néanmoins, ils sont sans doute à présent stationnaires. Nous allons essayer d'identifier un modèle où les résidus sont modélisés par un processus SARMA. Le couple ACF/PACF suggère un processus AR(1) ou MA(1) pour la composante court-terme.


3a. Alternative 1

Commençons par un processus AR(1). On va préciser à la fonction Arima que l'on cherche une régression de ozone contre loi avec des résidus formant un processus SARIMA, de la manière suivante:

In [23]:
arima_ozloi <- Arima(ozone,order=c(1,0,0),seasonal=c(0,1,0),xreg=loi, include.constant=T)
summary(arima_ozloi)
tsdisplay(residuals(arima_ozloi))
Series: ozone 
Regression with ARIMA(1,0,0)(0,1,0)[12] errors 

Coefficients:
         ar1    drift      xreg
      0.2455  -0.0678  -10.9594
s.e.  0.0681   0.0781    3.7444

sigma^2 estimated as 98.3:  log likelihood=-755.96
AIC=1519.92   AICc=1520.12   BIC=1533.19

Training set error measures:
                      ME     RMSE      MAE       MPE     MAPE      MASE
Training set -0.01610324 9.564163 7.215115 -2.682807 20.34832 0.8904316
                     ACF1
Training set -0.001087849

Dans ce modèle, les résidus n'ont plus de corrélation court-terme. Restent des corrélations saisonnières, pour lesquelles on identifie un processus SMA(1):

In [24]:
arima_ozloi <- Arima(ozone,order=c(1,0,0),seasonal=c(0,1,1),xreg=loi, include.constant=T)
summary(arima_ozloi)
tsdisplay(residuals(arima_ozloi))
tsdiag(arima_ozloi,gof.lag=15)
Series: ozone 
Regression with ARIMA(1,0,0)(0,1,1)[12] errors 

Coefficients:
         ar1     sma1    drift     xreg
      0.3012  -0.7511  -0.0740  -9.1819
s.e.  0.0669   0.0673   0.0257   2.7605

sigma^2 estimated as 64.85:  log likelihood=-718.03
AIC=1446.06   AICc=1446.36   BIC=1462.65

Training set error measures:
                      ME     RMSE      MAE       MPE     MAPE      MASE
Training set -0.09384939 7.749069 5.834338 -2.656906 16.52912 0.7200272
                     ACF1
Training set -0.003973857

Il n'y a plus de corrélations significatives dans les résidus du modèle, ce qui est confirmé par les tests de Portmanteau. Remarquons qu'ici, il n'y a pas d'hésitation: les $p$-valeurs de ce test sont au dessus du risque.

In [25]:
hist(residuals(arima_ozloi), freq = F, col = "grey")
curve(dnorm(x, mean = mean(residuals(arima_ozloi)), sd = sd(residuals(arima_ozloi))), col = 2, add = TRUE)

On peut toujours noter une légère asymétrie.

In [26]:
coeftest(arima_ozloi)
z test of coefficients:

       Estimate Std. Error  z value  Pr(>|z|)    
ar1    0.301209   0.066877   4.5039 6.672e-06 ***
sma1  -0.751080   0.067263 -11.1663 < 2.2e-16 ***
drift -0.073964   0.025725  -2.8752 0.0040382 ** 
xreg  -9.181889   2.760494  -3.3262 0.0008805 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Les coefficients sont significatifs, le modèle est validé. Les intervalles de confiance sont donnés par:

In [27]:
coefci(arima_ozloi)
A matrix: 4 × 2 of type dbl
2.5 %97.5 %
ar1 0.1701321 0.4322864
sma1 -0.8829130-0.6192466
drift -0.1243849-0.0235438
xreg-14.5923581-3.7714197
In [28]:
summary(arima_ozloi)
Series: ozone 
Regression with ARIMA(1,0,0)(0,1,1)[12] errors 

Coefficients:
         ar1     sma1    drift     xreg
      0.3012  -0.7511  -0.0740  -9.1819
s.e.  0.0669   0.0673   0.0257   2.7605

sigma^2 estimated as 64.85:  log likelihood=-718.03
AIC=1446.06   AICc=1446.36   BIC=1462.65

Training set error measures:
                      ME     RMSE      MAE       MPE     MAPE      MASE
Training set -0.09384939 7.749069 5.834338 -2.656906 16.52912 0.7200272
                     ACF1
Training set -0.003973857

Le modèle avec intervention s'écrit donc:

$$ (1-B^{12})\, \text{Ozone}_t = -0.074 -9.1819 (1-B^{12}) \;\text{loi}_t + \frac{1-0.7511B^{12}}{1-0.3012B} \varepsilon_t $$

Autrement dit: $$ \text{Ozone}_t = -9.1819 \;\text{loi}_t + R_t$$ où $$ (1-0.3012B)((1-B^{12})\,R_t + 0.074) = (1-0.7511B^{12})\; \varepsilon_t $$

L'écart-type des résidus $\varepsilon_t$ est estimé à 7.749069.


Remarquons qu'on n'écrit pas les polynomes symboliques $1-B$ ou $1-B^{12}$ au dénominateur d'une fraction rationnelle en $B$ car ils ne sont pas inversibles.


3b. Alternative 2

Pour la modélisation du processus court-terme, on pouvait hésiter avec un processus MA(1):

In [29]:
arima_ozloi <- Arima(ozone,order=c(0,0,1),seasonal=c(0,1,0),xreg=loi, include.constant=T)
summary(arima_ozloi)
tsdisplay(residuals(arima_ozloi))
Series: ozone 
Regression with ARIMA(0,0,1)(0,1,0)[12] errors 

Coefficients:
         ma1    drift      xreg
      0.2491  -0.0689  -10.9616
s.e.  0.0679   0.0738    3.5782

sigma^2 estimated as 98.32:  log likelihood=-755.99
AIC=1519.98   AICc=1520.18   BIC=1533.25

Training set error measures:
                       ME    RMSE      MAE       MPE     MAPE      MASE
Training set -0.007840782 9.56537 7.186457 -2.689293 20.26037 0.8868949
                    ACF1
Training set 0.002616121

... pour lequel on identifie un processus SMA(1) dans la partie saisonnière:

In [30]:
arima_ozloi <- Arima(ozone,order=c(0,0,1),seasonal=c(0,1,1),xreg=loi, include.constant=T)
summary(arima_ozloi)
tsdisplay(residuals(arima_ozloi))
tsdiag(arima_ozloi,gof.lag=15)

hist(residuals(arima_ozloi), freq = F, col = "grey")
curve(dnorm(x, mean = mean(residuals(arima_ozloi)), sd = sd(residuals(arima_ozloi))), col = 2, add = TRUE)

coeftest(arima_ozloi)
Series: ozone 
Regression with ARIMA(0,0,1)(0,1,1)[12] errors 

Coefficients:
         ma1     sma1    drift     xreg
      0.2828  -0.7363  -0.0748  -9.2251
s.e.  0.0627   0.0687   0.0240   2.5311

sigma^2 estimated as 65.5:  log likelihood=-718.74
AIC=1447.49   AICc=1447.79   BIC=1464.08

Training set error measures:
                      ME     RMSE      MAE       MPE     MAPE      MASE
Training set -0.09784783 7.787844 5.875269 -2.815998 16.60765 0.7250786
                   ACF1
Training set 0.02307353
z test of coefficients:

       Estimate Std. Error  z value  Pr(>|z|)    
ma1    0.282769   0.062749   4.5063 6.596e-06 ***
sma1  -0.736289   0.068728 -10.7130 < 2.2e-16 ***
drift -0.074766   0.023979  -3.1180 0.0018207 ** 
xreg  -9.225130   2.531097  -3.6447 0.0002677 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ce modèle (de type $\text{SARIMA}(0,0,1)(0,1,1)_{12}$) est aussi valide que le précédent. Il s'écrit:

$$ (1-B^{12}) \,\text{Ozone}_t = - 0.0748 -9.2251 (1-B^{12}) \;\text{loi}_t + (1+0.2828B)(1-0.7363B^{12}) \varepsilon_t $$

Autrement dit: $$ \text{Ozone}_t = - 9.2251 \;\text{loi}_t + R_t$$ où $$ (1-B^{12})\;R_t = - 0.0748+ (1+0.2828B)(1-0.7363B^{12})\; \varepsilon_t $$


Néanmois, il présente des valeurs de RMSE et AIC légèrement plus grandes: on préfèrera le premier modèle de type $\text{SARIMA}(1,0,0)(0,1,1)_{12}$.


4. Conclusion sur le modèle retenu

Le modèle retenu finalement s'écrit: $$ \text{Ozone}_t = -9.1819 \;\text{loi}_t + R_t$$ où $$ (1-0.3012B)((1-B^{12})\,R_t + 0.074) = (1-0.7511B^{12})\; \varepsilon_t $$

Le drift négatif modélise la décroissance globale du taux d'ozone au cours du temps, ce qui est visible dans le graphique de la chronique. Néanmoins, nous superposons à cette décroissance intrinsèque à la chronique une intervention extrinsèque par l'intermédiaire de la variable loi. Le coefficient négatif ($-9.1819$) montre que l'intervention se traduit par un décrochage "vers le bas" d'amplitude $9.1819$, d'effet permanent à partir de janvier 1960. Cette valeur est à mettre en relation avec l'amplitude des fluctuations aléatoires et avec la gamme des valeurs prises par la chronique (entre 20 et 80 unités).

Ce dernier modèle (avec intervention) a une RMSE plus faible que les modèles qui ne tiennent pas compte de la loi. Les critères d'information (AIC/AICc/BIC) sont également plus faibles, signe que ce modèle réalise un meilleur compromis entre explication des données et complexité du modèle.

On peut donc conclure: notre modélisation de l'influence de la loi comme un échelon explique mieux les données qu'une modélisation n'en tenant pas compte. Selon notre modèle, l'influence de la loi a permis de diminuer significativement (au sens statistique) la pollution à l'ozone. On peut même quantifier cette influence à une diminution de $9.1819$ unités (non précisées ici), avec un intervalle de confiance de l'estimation au risque de 5% qui est $[-14.5923581 ; -3.7714197]$.