Description
categorie 1
cotegorie 2
Author

Clément Poupelin

Published

Invalid Date

Modified

February 27, 2025

Intervenant.e.s

Rédaction

Relecture

Setup

Show the code
# Données
library(dplyr)        # manipulation des données

library(latex2exp)

# Plots
## ggplot
library(ggplot2)
library(gridExtra)

Données

Analyse

Note

METTRE LES REMARQUES

Warning

METTRE LES POINTS D’ATTENTION

Résultats

METTRE LES CONCLUSIONS

Conclusion

Session info

Show the code
sessioninfo::session_info(pkgs = "attached")
─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.2.1 (2022-06-23 ucrt)
 os       Windows 10 x64 (build 22631)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  French_France.utf8
 ctype    French_France.utf8
 tz       Europe/Paris
 date     2025-02-27
 pandoc   3.2 @ C:/Program Files/RStudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)

─ Packages ───────────────────────────────────────────────────────────────────
 package   * version date (UTC) lib source
 dplyr     * 1.1.4   2023-11-17 [1] CRAN (R 4.2.3)
 ggplot2   * 3.5.1   2024-04-23 [1] CRAN (R 4.2.3)
 gridExtra * 2.3     2017-09-09 [1] CRAN (R 4.2.1)
 latex2exp * 0.9.6   2022-11-28 [1] CRAN (R 4.2.3)

 [1] C:/Users/cleme/AppData/Local/R/win-library/4.2
 [2] C:/Program Files/R/R-4.2.1/library

──────────────────────────────────────────────────────────────────────────────

EXERCICE 1 :


Nous étudions la différence entre une marche aléatoire et un signal linéaire bruité.

QUESTION 1 : Simuler dix marches aléatoires \((x_t)_t = \delta + x_{t-1} + w_t\) avec dérive de longueur \(n = 100\), de paramètre \(\delta = .01\) et de variance \(\sigma^2_W = 1\) pour le bruit.


Si on pose que \(x_0 = w_0\), on peut écrire notre marche aléatoire comme \(x_t = \delta t + \sum_{i=0}^{t}w_i\)

Show the code
# On pose nos paramètres
n = 100         
delta = 0.01    

# On définis notre fonction de marche aléatoire
random_walk = function(n, delta) {
  w = rnorm(n)  
  drift = delta * seq(1, n)  
  
  x = drift + cumsum(w)
  return(x)  
}

# Générer dix marches aléatoires
nb = 10
sim = matrix(0, ncol = n, nrow = nb)
for (i in 1:nb) {
  sim[i, ] = random_walk(n, delta)
}

QUESTION 2 : Estimer le modèle de régression linéaire \(x_t = \beta_t + w_t\)


Show the code
list=1:n
l = c()

for (i in 1:nb){
  mod = lm(sim[i,] ~ list + 0) 
  # +0 pour ne pas faire de modèle avec constante
  l[i] = mod$coefficients
}


QUESTION 3 : Représenter sur un même graphique les dix droites estimées et la tendance moyenne théorique \(\delta_t = .01t\)



QUESTION 4 : Simuler dix séries \((x_t)_t\) de la forme \(x_t = \delta_t + w_t\) (tendance+bruit blanc) de longueur \(n = 100\), de paramètre \(\delta = .01\) et de variance \(\sigma^2_W = 1\)


Show the code
# On définis notre signal linéaire bruité 
noisy_serie = function(n, delta) {
  w = rnorm(n, sd = 1)  
  drift = delta * seq(1, n) 
  
  x = drift + w
  return(x)  
}

# Générer dix séries tendance + bruit
sim2 = matrix(0, ncol = n, nrow = nb)

for (i in 1:nb) {
  sim2[i, ] = noisy_serie(n, delta)
}


QUESTION 5 : Estimer le modèle de régression linéaire \(x_t = \beta_t + w_t\)


Show the code
l2 = c()
for (i in 1:nb){
  mod2 = lm(sim2[i,] ~ list + 0)
  l2[i] = mod2$coefficients
}


QUESTION 6 : Représenter sur un même graphique les dix droites estimées et la tendance théorique \(\delta_t = .01t\)



QUESTION 7 : Commenter les résultats


La tendance théorique (le drift) est mieux estimée par régression dans le cas d’un signal bruité que celui de la marche aléatoire.

Cela peut s’explique par le fait que, dans le cas de la marche aléatoire, la variance de \(x_t\) croît linéairement avec le temps. En effet, \(Var(x_t) = Var( \delta t + \sum_{i=0}^{t}w_i) = Var( \sum_{i=0}^{t}w_i)=\sum_{i=0}^{t}Var(w_i) = \sum_{i=0}^{t}\sigma^2_w=t\sigma^2_w\)

Cela fait donc défaut à l’hypothèse d’homoscédacité cruciale pour la régression linéaire

Par contre, du côté du signal bruite on conserve l’homoscédacité avec le cas très idéal du bruit iid et gaussien.

EXERCICE 2 :


QUESTION 1 : Écrire une fonction qui retourne une série simulée de la forme \(X_j = a cos(ω_j) + bj + \varepsilon_j\)\((\varepsilon_n)\) un bruit blanc gaussien centré et de variance 1.


Les paramètres d’entrée de la fonction sont \(n\), \(a\), \(b\), \(w\) et la sortie est une série temporelle. Pour cela, on utilise la fonction ts() qui transforme nos points générés en une série temporelle.

Show the code
X_j = function(n, a, b, w) {
  eps = rnorm(n)  
  
  x = a*cos(w*seq(1, n) ) + b* seq(1, n) +eps
  return(ts(x))   
}

Maintenant, on fixe \(n = 100\) puis \(n = 500\)

Show the code
n = c(100, 500)

Puis on pose les paramètres qui nous serons utiles par la suite

Show the code
a = c(0, 2)
b = c(0.01, 0)
w = c(2*pi, pi/6) 
#en 2*pi, w n'aura pas d'influence si on voulait enlever la condition a = 0


QUESTION 2 : Pour \(a = 0\) et \(b = .01\), simuler une trajectoire, puis représenter


Show the code
# Pour n = 100
sim1_X_j_100 = X_j(n[1], a[1], b[1], w[1])

# Pour n = 500
sim1_X_j_500 = X_j(n[2], a[1], b[1], w[1])


2-1 : la série et sa suite d’auto-corrélations empiriques



2-2 : la série \(X_n − X_{n−1}\) et sa suite des auto-corrélations empiriques


Show the code
sim1_X_j_100_diff = diff(sim1_X_j_100, lag = 1)

sim1_X_j_500_diff = diff(sim1_X_j_500, lag = 1)


QUESTION 3 : Pour \(b = 0\), \(a = 2\) et \(w = \frac{\pi}{6}\), simuler une trajectoire, puis représenter


Show the code
# Pour n = 100
sim2_X_j_100 = X_j(n[1], a[2], b[2], w[2])

# Pour n = 500
sim2_X_j_500 = X_j(n[2], a[2], b[2], w[2])


3-1 : la série et sa suite des auto-corrélations empiriques



3-2 : la série \(X_n − X_{n−12}\) et sa suite des auto-corrélations empiriques


Show the code
sim2_X_j_100_diff = diff(sim2_X_j_100, lag = 12)

sim2_X_j_500_diff = diff(sim2_X_j_500, lag = 12)

Pour conclure, on peut constater qu’en grandissant l’échantillon, la tendance et la saisonnalité ressortent d’avantage et influencent nos autocorrélation. On ne pourra donc pas considérer les séries comme stationnaires. Mais, l’opération de différenciation peut permettre de résoudre ce problème d’autocorrélation quand celle ci est adaptée à la “perturbation”(tendance ou saison) de notre série.

Pour visualiser cela, on peut effecuer les calculs. Dans le cas de la série \(X_j = 0.01j +\varepsilon_j\) Où il reste l’effet de tendance, \[\begin{align*} X_j - X_{j-1} &= 0.01j +\varepsilon_j - 0.01(j-1) -\varepsilon_{j-1}\\ &= 0.01j - 0.01j - 0.01 + \varepsilon_j - \varepsilon_{j-1}\\ &= -0.01 +\varepsilon_j - \varepsilon_{j-1}\\ \end{align*}\] On a bien une disparition de la tendance.

Dans le cas de la série \(X_j = 2cos(\frac{\pi}{6}j) + \varepsilon_j\) Où il reste l’effet de saison, \[\begin{align*} X_j - X_{j-12} &= 2cos(\frac{\pi}{6}j) +\varepsilon_j - 2cos(\frac{\pi}{6}(j-12)) -\varepsilon_{j-12}\\ &= 2cos(\frac{\pi}{6}j) +\varepsilon_j - 2cos(\frac{\pi}{6}j-\frac{\pi}{6}12) -\varepsilon_{j-12}\\ &= 2cos(\frac{\pi}{6}j) +\varepsilon_j - 2cos(\frac{\pi}{6}j-2\pi) -\varepsilon_{j-12}\\ &= 2cos(\frac{\pi}{6}j) +\varepsilon_j - 2(cos(\frac{\pi}{6}j)cos(2\pi) - sin(\frac{\pi}{6}j)sin(2\pi)) -\varepsilon_{j-12}\\ &= 2cos(\frac{\pi}{6}j) +\varepsilon_j - 2(cos(\frac{\pi}{6}j) - 0) -\varepsilon_{j-12}\\ &= \varepsilon_j -\varepsilon_{j-12}\\ \end{align*}\] On a bien une disparition de la saison.


On a donc qu’une différentiation d’ordre 1 permettra d’enlever la tendance et une différentiation d’ordre \(s\) permettra d’enlever une saison de période \(s\).


EXERCICE 3 :


QUESTION 1 : Ecrire une fonction pour simuler des trajectoires de processus défini par l’équation de récurrence \(X_m + cX_{m−1} = \varepsilon_m\)\((\varepsilon_m)\) est une suite de variables aléatoires centrées iid.


Indication : Pour obtenir une série de longueur \(m\), simuler \(m+ 100\) valeurs et supprimer les 100 premières valeurs pour atténuer l’effet de l’initialisation. Vous pouvez utiliser la fonction filter.

Show the code
xt = function(m, c) {
  eps = rnorm(m + 100)  
  x = rep(NA, m + 100) 
  # On suppose pour notre condition initial
  x[1] = eps[1] 
  
  for (i in (2:(m + 100))) {
    x[i] = eps[i] - c * x[i - 1]
  }
  
  x_final = x[101:(m + 100)]
  return(ts(x_final))  
}


QUESTION 2 : Pour \(|c| = 0, .5, .9\), tracer une trajectoire simulée et sa suite des auto-corrélations empiriques


Show the code
# On pose nos paramètres
m = 500
c = c(-0.9, -0.5, 0, 0.5, 0.9)


QUESTION 3 : Commenter les résultats


On remarque qu’au moment où nos paramètres sont proche de \(1\) ou \(-1\), nos autocorrélations sont forte et notre série perd en stationnarité. En effet, on remarque que le processus est un AR(1) avec son acf qui décroit exponentiellement et la stationnarité se perd quand \(|c| \longrightarrow 1\).

On remarque également que, qand \(c=0\), on a un bruit blanc.


BONUS


En Complément de ces informations, on peut aussi s’interesser au PACF

On reconnait alors les caractéristiques d’un AR(1) au vu des ACF et PACF. Et le cas de \(c=0\) apparait plus clairement comme celui d’un bruit blanc.

EXERCICE 4 :


Le fichier champ.asc est disponible sur le web à l’adresse suivante http://www.math.sciences.univ-nantes.fr/~philippe/lecture/champ.asc

On note \((C_t)\) la série.

Show the code
url = "http://www.math.sciences.univ-nantes.fr/~philippe/lecture/champ.asc"
data = read.csv(url)

Ct = ts(data)


QUESTION 1 : Tracer la série \((C_t)\) et sa suite des auto-corrélations empiriques



QUESTION 2 : En utilisant les résultats de l’exercice précédent, peut-on détecter la présence d’une fonction périodique ou d’une tendance dans cette série.


D’après les graphiques obtenus ainsi que l’analyse faite à l’exercice précédent, on constate clairement une série de type multplicatif (variance qui explose avec le temps) présentant une tendance linéaire et une saisonnalité (de période environ 12 peut-être).

QUESTION 3 : Tracer la série \((log(Ct))\) et sa suite des auto-corrélations empiriques


Show the code
lCt = log(Ct)

On peut observé que le passage au log à permis de contrer la croissance en \(t\) de la variance.
En effet, si on pose \(Y_t = t\varepsilon_t\), alors \(Var(Y_t) = t^2Var(\varepsilon_t)\).
Or, avec le passage au log, on aura que \(Var(log(Y_t)) = Var(log(t\varepsilon_t)) = Var(log(t)+log(\varepsilon_t)) = Var(log(\varepsilon_t))\)


QUESTION 4 : Pour différentes valeurs des paramètres \((\alpha, \beta, \gamma)\), simuler les séries suivantes de longueur 100 où \((\varepsilon_t)\) est une suite de variables aléatoires i.i.d. \(\mathcal{N}_{(0, 1)}\)


On va donc simuler des séries de la forme suivante \[\begin{align} \alpha t + \beta cos(\frac{2πt}{12}) + \gamma cos(\frac{2πt}{6}) + \beta' cos(\frac{2πt}{12}) + \gamma' cos(\frac{2πt}{6}) + \varepsilon_t \end{align}\]

Show the code
ut = function(n, a, b, c, d, e, a0 = 0){
  t = 1:n
  eps_t = rnorm(n)
  
  u = a0 + a*t + b*cos(pi/6*t)  + c*cos(pi/3*t) + d*sin(pi/6*t)  + e*sin(pi/3*t) + eps_t 
  return(u)
}

# Simulations pour différentes valeurs de coefficients
n = rep(100,8)
alpha = rep(c(0.01, 0.05),4)
beta = rep(c(-1,1,0.1,2),2)
gamma = rep(c(-0.1,1,2,-0.5),2)
d = gamma
e = beta
a0 = rep(c(0, 7.5, 8, 8.5),2)


# On stocke les simulations 
ut.vect = Vectorize(ut)
simu.res = ut.vect(n,alpha,beta,gamma,d,e,a0)

On peut déjà constater que cette série à été construite dans l’optique de prendre les périodes que l’on peut détecter avec l’ACF autour du Lag 6 et du Lag 12 et qui sont adéquate à l’aspect de “double pics” présent dans notre série. Le terme \(\alpha\) est de son côté, présent pour prendre en compte la présence de la tendance linéaire.


QUESTION 5 : Comparer l’allure des séries simulées avec la série des ventes de champagne et la série \((log(Ct))\).



QUESTION 6 : Pour laquelle des deux séries \(((Ct))\) \((log(Ct))\), le modèle défini en question 4 vous semble le plus pertinent.


La série \(log(C_t)\) est la plus adaptée à l’halure des séries simulées car, pour les series simulées, on a pas la variance qui augmente comme pour\(C_t\).

QUESTION 7 : Sur cette série, calculer les estimateurs de \((\alpha, \beta, \gamma)\) par la méthode des moindres carrés. Que peut-on dire de la qualité du modèle. Peut on modéliser la série des résidus par un bruit blanc?


Show the code
#construisons un modèle de regression
t = seq(1,length(Ct))

model = lm(log(Ct) ~ t + cos((pi/6)*t)  + cos((pi/3)*t) + sin((pi/6)*t)  + sin((pi/3)*t))
summary(model)

Call:
lm(formula = log(Ct) ~ t + cos((pi/6) * t) + cos((pi/3) * t) + 
    sin((pi/6) * t) + sin((pi/3) * t))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.76107 -0.13260  0.00618  0.18329  0.48198 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      8.1452854  0.0512649 158.886  < 2e-16 ***
t                0.0043032  0.0008477   5.077 1.83e-06 ***
cos((pi/6) * t)  0.2760137  0.0360024   7.667 1.30e-11 ***
cos((pi/3) * t) -0.1698754  0.0361401  -4.700 8.49e-06 ***
sin((pi/6) * t) -0.2165525  0.0360024  -6.015 3.11e-08 ***
sin((pi/3) * t) -0.3990958  0.0357974 -11.149  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2592 on 98 degrees of freedom
Multiple R-squared:  0.7243,    Adjusted R-squared:  0.7103 
F-statistic:  51.5 on 5 and 98 DF,  p-value: < 2.2e-16

On constate une forte significativité de tout nos termes.