-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPROJET.Rmd
291 lines (214 loc) · 7.88 KB
/
PROJET.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
---
title: "Annexe : Code du TP série temprelle"
author: "Ahmed Khairaldin et Amine Razig"
date: "17/5/2024"
output: pdf_document
---
![](/Users/aminerazig/Desktop/LOGO-ENSAE.png)
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(factoextra)
```
# **Projet : Fabrication d’instruments et de fournitures à usage médical et dentaire**
## \color{red}Bibliothèques nécessaires:
```{r}
if (!require("httr")) install.packages("httr")
if (!require("ggplot2")) install.packages("ggplot2")
library(httr)
library(ggplot2)
library(zoo)
library(tseries)
library(fUnitRoots)
library(forecast)
library(ellipse)
```
## \color{red}Import des données :
```{r}
#Importation des données : de janvier 1990 à janvier 2008
path <- "/Users/aminerazig/Desktop/ENSAE 2A/S2/Projet_Serie_temp/valeurs_mensuelles_dentaire.csv"
data <- read.csv(path, sep = ";")
```
## \color{red}Manipulation des données :
```{r}
data <- data[-(1:3), ]
colnames(data) <- c("date", "valeur", "code")
# Conversion du format de la date et des valeurs et suppressiin de la période liée au Covid :
data$valeur <- as.numeric(data$valeur)
# Création de la série au format zoo :
X = data[,2]
X <- zoo(X)
# Vue génarale de la série :
plot(X, type='l', col='aquamarine4', xlab="Période", ylab="Indice")
```
## TESTS POUR LA STATIONNARITE (serie initiale) : /!\ 0 lags ..
```{r}
adf.test(X)
```
L’hypothese nulle de racine unitaire H0 : Betha = 0 est testée par une statistique qui suit une loi de Dickey-Fuller dépendant du nombre d’observation et du cas du test dans lequel on se place.
Le test ADF donne :
```{r}
adf <- adfTest(X, lag=0, type="ct")
#Test ADF dans le cas avec constante et tendance. Avant d'interpréter le test, vérifions que les résidus du modèle de Régression ne sont bien pas autocorrélés, sinon le test ne serait pas valide.
```
```{r}
resisuals = adf@test$lm$residuals
```
```{r}
# Source : TD4 du cours de série temporelles
# tests d’autocorrelation :
Qtests <- function(series, k, fitdf=0) {
pvals <- apply(matrix(1:k), 1, FUN=function(l) {
pval <- if (l<=fitdf) NA else Box.test(series, lag=l, type="Ljung-Box", fitdf=fitdf)$p.value
return(c("lag"=l,"pval"=pval))
})
return(t(pvals))
}
Qtests(adf@test$lm$residuals,24,length(adf@test$lm$coefficients))
```
```{r}
# Ajout d'un retard jusqu'a ce que les résidus soient non corrélés
adfTest_valid <- function(series,kmax,type){ #tests ADF jusqu’a des residus non autocorrelles
k <- 0
noautocorr <- 0
while (noautocorr==0){
cat(paste0("ADF with ",k, " lags: residuals OK? "))
adf <- adfTest(series,lags=k,type=type)
pvals <- Qtests(adf@test$lm$residuals,24,fitdf=length(adf@test$lm$coefficients))[,2]
if (sum(pvals<0.05,na.rm=T) == 0) {
noautocorr <- 1; cat("OK \n")}
else cat("nope \n")
k <- k + 1
}
return(adf)
}
adfTest_valid(X,24,'ct')
```
## Serie differenciée :
```{r}
## **TENDANCE - Différenciation de la série **
#Differenciation et retranchement de la moyenne la série pour supprimer tendance
diff_X = X - lag(X,1)
X_diff_mean <- diff_X - mean(diff_X)
plot(X_diff_mean, col='aquamarine4', xlab="Période")
```
## TESTS POUR LA STATIONNARITE (serie differenciée ) :
```{r}
adfTest_valid(X_diff_mean,24,'ct')
```
### Justification du test ADF :
```{r}
# Le test ADF a donc du sens :
adf_diff <- adfTest(X_diff_mean, lag=0, type="ct")
Qtests(adf_diff@test$lm$residuals,24,length(adf_diff@test$lm$coefficients))
```
## TESTS POUR LA STATIONNARITE :
```{r}
pp.test(X_diff_mean)
```
# ----------------------------------------------------------------------------------------
# **Partie II : Modèles ARMA**
# ----------------------------------------------------------------------------------------
## Sélection des ordres p et q de notre modèle :
```{r}
acf(X_diff_mean,lag.max=15)
pacf(X_diff_mean, lag.max=20)
```
Pour nous
- d* = 0
- q* = 1
- p* = 3
### 0n test donc tous les modèles possible : (0,0,1), (1,0,1), (2,0,1),(3,0,1),(1,0,0), ...
```{r}
#test des significativités individuelles des coefficients :
signif <- function(estim){
coef <- estim$coef
se <- sqrt(diag(estim$var.coef))
t <- coef/se
pval <- (1-pnorm(abs(t)))*2
return(rbind(coef,se,pval))
}
arima201 <- arima(X_diff_mean,c(3,0,0))
signif(arima201) #tests de siginificativite de l’ARIMA(2,0,1)
```
**Interpretation** : Les coefficients des retards les plus haut AR(2) ne rejette pas leur nullité à 95% (p-value>0.05), le modèle ARIMA(3,0,2) est donc mal ajusté. Pour MA(2) on rejette la nulité des coefficient.
```{r}
##fonction d’affichage des tests pour la sélection du modèle ARIMA
arimafit <- function(estim){
adjust <- round(signif(estim),3)
pvals <- Qtests(estim$residuals,24,length(estim$coef)-1)
pvals <- matrix(apply(matrix(1:24,nrow=6),2,function(c) round(pvals[c,],3)),nrow=6)
colnames(pvals) <- rep(c("lag", "pval"),4)
cat("tests de nullité des coefficients :\n")
print(adjust)
cat("\n tests d’absence d’autocorrélation des résidus : \n")
print(pvals)
}
```
```{r}
# EXEMPLE :
# Modele pas bien ajusté et non valide (absence de correlation est rejeté)
estim <- arima(X_diff_mean,c(2,0,1)); arimafit(estim)
```
```{r}
# POUR TOUTES LES COMBINAISONS :
for (p in 0:3) {
for (q in 0:1) {
cat(sprintf("\n\nARIMA(%d,0,%d):\n", p, q))
# Estimation du modèle ARIMA
estim <- arima(X_diff_mean,c(p,0,q)); arimafit(estim)
}
}
```
Nos trois modeles ajustés et valides sont :
ARIMA(3,0,0) ; ARIMA(0,0,1)
on peut utiliser un critère d’information, tel que l’AIC ou le BIC (qui dependent négativement de la log-vraisemblance du modele penalisee par le nombre de parametres a estimer) :
```{r}
ARIMA300= arima(X_diff_mean,c(3,0,0))
ARIMA001= arima(X_diff_mean,c(0,0,1))
models <- c("ARIMA300","ARIMA001"); names(models) <- models
apply(as.matrix(models),1, function(m) c("AIC"=AIC(get(m)), "BIC"=BIC(get(m))))
```
**Conclusion** : Le ARIMA(0,0,1) minimise à la fois le critère BIC et AIC donc ont peu le considérer comme ayant les meilleurs ordres et c'ets celui la qu'on retient.
# ----------------------------------------------------------------------------------------
# Partie III : Prévision
# ----------------------------------------------------------------------------------------
```{r}
# On commence par ajuster le modele sélectioné :
model <- arima(X, c(0, 0,1))
# On extrait les résidus du modèle
residuals <- residuals(model)
# QQ plot des résidus (pour savoir si ils suivent une loi normale)
qqnorm(residuals, main = "QQ Plot of ARIMA(0,0,1) Residuals")
qqline(residuals, col = "red")
```
## 8. Représenter graphiquement de la région pour alpha = 95% :
```{r}
# On determine le coef MA(1) :
model_ma1 <- arima(X, order = c(0, 0, 1))
ma1_coeff <- coef(model_ma1)["ma1"]
theta <- ma1_coeff
# Variance des résidus (bruit blanc)
residuals_ma1 <- residuals(model_ma1)
variance_residuals <- var(residuals_ma1)
## On obtiens :
## theta = 0.8323871
## Variance du BB = 83.27074
# Calculer les éléments de la matrice Variance Covariance (Sigma)
element11 <- variance_residuals
element12 <- variance_residuals * (1 - theta)
element21 <- variance_residuals * (1 - theta)
element22 <- variance_residuals * (1 + (1 - theta)^2)
# Créer la matrice Sigma et inversion
Sigma <- matrix(c(element11, element12, element21, element22), nrow=2, ncol=2, byrow=TRUE)
Sigma_inverse <- solve(Sigma)
# Prédiction des valeurs à T+1 et T+2 avec le modèle ARIMA(0,0,1)
valeurs_pred <- predict(model_ma1, n.ahead=2)
prediction_T1 <- valeurs_pred$pred[1]
prediction_T2 <- valeurs_pred$pred[2]
# On trace l'ellipse de confiance
plot(ellipse(Sigma_inverse, centre=c(prediction_T1, prediction_T2), level=0.95),
xlab="Prédiction à T+1", ylab="Prédiction à T+2",
main="Ellipse de confiance pour ARIMA(0,0,1)")
points(x=prediction_T1, y=prediction_T2, col="red", pch=19)
legend("topright", legend="Prédictions", pch=19, col="red", cex=0.8)
```