Sur le lissage exponentiel, je pourrais renvoyer vers Gardner (1985), et la version remise au goût du jour, Gardner (2005). J’avais pris comme position, dans le cours, de présenter rapidement le lissage exponentiel, en notant qu’on les évoquerais à nouveau plus tard comme cas particulier des modèles ARIMA. Comme le note la dernière version, Gardner (2005), ce n’est pas forcément l’unique manière de voir, et le cours pourrait être orienté complètement autour des notions de lissage exponentiel (c’est d’ailleurs le point du vue de livre Hyndman, Koehler, Ord & Snyder (2008)), “when Gardner (2005) appeared, many believed that exponential smoothing should be disregarded because it was either a special case of ARIMA modeling or an ad hoc procedure with no statistical rationale. As McKenzie (1985) observed, this opinion was expressed in numerous references to my paper. Since 1985, the special case argument has been turned on its head, and today we know that exponential smoothing methods are optimal for a very general class of state-space models that is in fact broader than the ARIMA class.”
N’étant toujours pas convaincu, j’évoquerais à nouveau le lissage exponentiel quand on présentera les modèles ARIMA. En attendant, un peu de code pour mieux comprendre ce qui est fait quand on fait du lissage exponentiel.
Commençons par le lissage exponentiel simple, i.e.

où désigne un poids attribué à la nouvelle observation dans la fonction de lissage
. Le code pour lisser une série est alors assez simple,
> library(datasets) > X=as.numeric(Nile) > Lissage=function(a){ + T=length(X) + L=rep(NA,T) + L[1]=X[1] + for(t in 2:T){L[t]=a*X[t]+(1-a)*L[t-1]} + return(L) + } > plot(X,type="b",cex=.6) > lines(Lissage(.2),col="red")
Sur la figure ci-dessus, non visualise l’impact de sur le lissage. La prévision que l’on fait à la date
, pour un horizon
est alors
. Il est alors possible de voir le poids comme un paramètre et on va alors chercher le poids optimal. La stratégie classique est de minimiser l’erreur de prédiction commise à un horizon de 1
> V=function(a){ + T=length(X) + L=erreur=rep(NA,T) + erreur[1]=0 + L[1]=X[1] + for(t in 2:T){ + L[t]=a*X[t]+(1-a)*L[t-1] + erreur[t]=X[t]-L[t-1] } + return(sum(erreur^2)) + }
Ici, on obtient comme poids optimal
> A=seq(0,1,by=.02) > Ax=Vectorize(V)(A) > plot(A,Ax,ylim=c(min(Ax),min(Ax)*1.05)) > optimize(V,c(0,.5))$minimum [1] 0.246581
On notera que c’est ce que suggère la fonction de R,
> hw=HoltWinters(X,beta=FALSE,gamma=FALSE,l.start=X[1]) > hw Holt-Winters exponential smoothing without trend an seasonal comp. Call: HoltWinters(x = X, beta = FALSE, gamma = FALSE, l.start = X[1]) Smoothing parameters: alpha: 0.2465579 beta : FALSE gamma: FALSE Coefficients: [,1] a 805.0389 > plot(hw) > points(2:(length(X)+1),Vectorize(Lissage)(.2465),col="blue")
Dans le cas du lissage exponentiel double, i.e.
et
Dans ce cas, la prédiction est . Le code pour faire un lissage double est là encore assez simple,
> Lissage=function(a,b){ + T=length(X) + L=B=rep(NA,T) + L[1]=X[1]; B[1]=0 + for(t in 2:T){ + L[t]=a*X[t]+(1-a)*(L[t-1]+B[t-1]) + B[t]=b*(L[t]-L[t-1])+(1-b)*B[t-1] } + return(L) + }
Sur la figure suivante, on visualise l’évolution du lissage en fonction de (
étant ici fixé),
(le lissage simple – avec le même poids – apparaissant ici en trait clair).
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (February 24, 2012). Sur le lissage exponentiel. Freakonometrics. Retrieved February 14, 2025 from https://doi.org/10.58079/oukm
merci pour ces éclaircissements sur le calcul fait par R pour estimer les paramètres alpha et bêta. Mais vous ne parler pas du cas saisonnier. Pourtant c’est possible de prendre en compte les effets saisonniers, non ? ça marche comment ?
@Yves, il existe diverses manières de prendre en compte les effets saisonniers.
On peut faire un lissage exponentiel de Holt Winter par exemple ( même en présence d’une tendance )
Dans ce cas, il existe des fonctions sous R comme hw ou dshw.
Cordialement, HLBL
oui, c’est la fonction qu’on utilise ici. Maintenant, “le” modèle de HW avait été introduit en présence de cycles, mais ici c’est inutile, c’est pour ça que je ne le présente pas ici