{"word_count": 243, "character_count": 2954}
Quelques lignes de code que l'on reprendra au prochain cours, avec une transformation en log, et une tendance linéaire. Considérons la recherche du mot clé headphones, au Canada, la base est en ligne sur l'ancien blog, à l'adresse freakonometrics.blog.free.fr/...&#62; report=read.table(+ "report-headphones.csv",+ skip=4,header=TRUE,sep=",",nrows=464)&#62; source("http://freakonometrics.blog.free.fr/public/code/H2M.R")&#62; headphones=H2M(report,lang="FR",type="ts")&#62; plot(headphones)Mais le modèle linéaire ne devrait pas convenir, car la série explose,&#62; n=length(headphones)&#62; X1=seq(12,n,by=12)&#62; Y1=headphones[X1]&#62; points(time(headphones)[X1],Y1,pch=19,col="red")&#62; X2=seq(6,n,by=12)&#62; Y2=headphones[X2]&#62; points(time(headphones)[X2],Y2,pch=19,col="blue")Il est alors naturel de prendre le logarithme de la série,&#62; plot(headphones,log="y")C'est cette série que l'on va modéliser (mais c'est bien entendu la première série, au final, qu'il faudra prévoir). On commence par ôter la tendance (ici linéaire)&#62; X=as.numeric(headphones)&#62; Y=log(X)&#62; n=length(Y)&#62; T=1:n&#62; B=data.frame(Y,T)&#62; reg=lm(Y~T,data=B)&#62; plot(T,Y,type="l")&#62; lines(T,predict(reg),col="purple",lwd=2)On travaille alors sur la série résiduelle.&#62; Z=Y-predict(reg)&#62; acf(Z,lag=36,lwd=6)&#62; pacf(Z,lag=36,lwd=6)On peut tenter de différencier de manière saisonnière,&#62; DZ=diff(Z,12)&#62; acf(DZ,lag=36,lwd=6)&#62; pacf(DZ,lag=36,lwd=6)On ajuste alors un processus ARIMA, sur la série différenciée,&#62; mod=arima(DZ,order=c(1,0,0),+ seasonal=list(order=c(1,0,0),period=12))&#62; modCoefficients:ar1     sar1  intercept0.7937  -0.3696     0.0032s.e.  0.0626   0.1072     0.0245sigma^2 estimated as 0.0046:  log likelihood = 119.47Mais comme c'est la série de base qui nous intéresse, on utilise une écriture SARIMA,&#62; mod=arima(Z,order=c(1,0,0),+ seasonal=list(order=c(1,1,0),period=12))On fait alors la prévision de cette série.&#62; modpred=predict(mod,24)&#62; Zm=modpred$pred&#62; Zse=modpred$seOn utilise aussi le prolongement de la tendance linéaire,&#62; tendance=predict(reg,newdata=data.frame(T=n+(1:24)))Pour revenir enfin à notre série initiale, on utilise les propriétés de la loi lognormales, et plus particulièrement la forme de la moyenne, pour prédire la valeur de la série,&#62; Ym=exp(Zm+tendance+Zse^2/2)Graphiquement, on a&#62; plot(1:n,X,xlim=c(1,n+24),type="l",ylim=c(10,90))&#62; lines(n+(1:24),Ym,lwd=2,col="blue")Pour les intervalles de confiance, on peut utiliser les quantiles de la loi lognormale,&#62; Ysup975=qlnorm(.975,meanlog=Zm+tendance,sdlog=Zse)&#62; Yinf025=qlnorm(.025,meanlog=Zm+tendance,sdlog=Zse)&#62; Ysup9=qlnorm(.9,meanlog=Zm+tendance,sdlog=Zse)&#62; Yinf1=qlnorm(.1,meanlog=Zm+tendance,sdlog=Zse)&#62; polygon(c(n+(1:24),rev(n+(1:24))),+ c(Ysup975,rev(Yinf025)),col="orange",border=NA)&#62; polygon(c(n+(1:24),rev(n+(1:24))),+ c(Ysup9,rev(Yinf1)),col="yellow",border=NA)