\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \renewcommand*\familydefault{\sfdefault} \marginparwidth 0pt \oddsidemargin 0pt \evensidemargin 0pt \marginparsep 0pt \topmargin 0pt \textwidth 16cm \textheight 23cm \parindent 5mm \begin{document} \section{Package R "ppmfun"} Le package $-$ Predict PM10 with FUNctional methods $-$ contient le code permettant de (re)lancer les expériences numériques décrites dans ce document. La fonction principale \emph{predictPM10} se divise en trois parties, décrites successivement au cours des trois paragraphes suivants.\\ <>= #Chargement de la librairie (après compilation, "R CMD INSTALL ppmfun/") library(ppmfun) @ Note : sur la base de nos dernières expériences, on considère que \begin{itemize} \item on ne touche pas à la fenêtre obtenue par optim() ;} \item on oublie la méthode consistant à prédire forme et niveau de manière complètement déconnectée : il faut relier les deux. \end{itemize} \subsection{Acquisition des données} Compte-tenu de la nature hétérogène des données utilisées $-$ fonctionnelles pour les PM10, vectorielles pour les variables exogènes $-$, celles-ci sont organisées sous forme d'une liste \emph{data}, la $i^{eme}$ cellule correspondant aux données disponibles au $i^{eme}$ jour à l'heure $H$ de prédiction choisie (1h00, 8h00 ou 14h00) : c'est-à-dire les valeurs des PM10 de $H-24h$ à $H-1H$, ainsi que les variables météo prédites pour la période de $1h00$ à $0h$ du jour courant (sauf si on prédit à 0h : on prend alors les valeurs mesurées de la veille).\\ Exemple :\\ <>= #Le premier argument indique la zone horaire souhaitée ; "GMT" ou "local" #pour l'heure française, ou tout autre fuseau horaire. data = getData("local", "7h") @ \subsection{Prédiction} Deux types de prévisions du prochain bloc de $24h$ sont à distinguer : \begin{itemize} \item prévision de la forme (centrée) ; \item prévision du saut d'une fin de série au début de la suivante. \end{itemize} \noindent Il faut ainsi préciser à la fois une méthode de prévision de forme ("Persistence" et "Neighbors" implémentées), et une méthode de prédiction de saut ("Zero", "Persistence" ou "Neighbors"). On détaille surtout la méthode à voisins ci-après.\\ \begin{enumerate} \item \textbf{Préparation des données} : calcul des niveaux sur 24h, fenêtrage si demandé (paramètre "memory"). \item \textbf{Optimisation des paramètres d'échelle} : via la fonction \emph{optim()} minimisant la somme des 45 dernières erreurs jounalières L2. \item \textbf{Prédiction finale} : une fois le (ou les, si "simtype" vaut "mix") paramètre d'échelle $h$ déterminé, les similarités sont évaluées sur les variables exogènes et/ou endogènes, sous la forme $s(i,j) = \mbox{exp}\left(-\frac{\mbox{dist}^2(i,j)}{h^2}\right)$. La formule indiquée plus haut dans le rapport est alors appliquée. \end{enumerate} \subsection{Calcul des erreurs} Pour chacun des instants à prévoir jusqu'à minuit du jour courant, on calcule l'erreur moyenne sur tous les instants similaires du passé (sur la plage prédite). Trois types d'erreurs sont considérées : \begin{itemize} \item l'erreur "abs" égale à la valeur absolue moyenne entre la mesure et la prédiction ; \item l'erreur "MAPE" égale à l'erreur absolue normalisée par la mesure. \item l'erreur "RMSE" égale à la racine carrée de l'erreur quadratique moyenne. \end{itemize} \subsection{Expériences numériques} %, fig.show='hold'>>= <>= p_endo = predictPM10(data, 2200, 2230, 0,0, "Neighbors", "Neighbors", simtype="endo") p_exo = predictPM10(data, 2200, 2230, 0,0, "Neighbors", "Neighbors", simtype="exo") p_mix = predictPM10(data, 2200, 2230, 0,0, "Neighbors", "Neighbors", simtype="mix") p = c(p_endo, p_exo, p_mix) yrange_MAPE = range(p_mix$errors$MAPE, p_endo$errors$MAPE, p_exo$errors$MAPE) yrange_abs = range(p_mix$errors$abs, p_endo$errors$abs, p_exo$errors$abs) yrange_RMSE = range(p_mix$errors$RMSE, p_endo$errors$RMSE, p_exo$errors$RMSE) ranges = c(yrange_MAPE,yrange_abs,yrange_RMSE) par(mfrow=c(1,3)) titles = paste("Erreur",c("MAPE","abs","RMSE")) for (i in 1:3) #error type (MAPE,abs,RMSE) { for (j in 1:3) #model (mix,endo,exo) { plot(p[j]$errors[[i]], type="l", col=j, main=titles[i], xlab="Temps", ylab="Erreur", ylim=ranges[i]) par(new=TRUE) } } #Ne tenir compte que des similarités sur les variables exogènes semble #conduire à l'erreur la plus faible. @ <>= p_nn = predictPM10(data, 2200, 2230, 0, 0, "Neighbors", "Neighbors", sameSeaon=TRUE) p_np = predictPM10(data, 2200, 2230, 0, 0, "Neighbors", "Persistence", sameSeaon=TRUE) p_nz = predictPM10(data, 2200, 2230, 0, 0, "Neighbors", "Zero", sameSeaon=TRUE) p_pp = predictPM10(data, 2200, 2230, 0, 0, "Persistence", "Persistence") p_pz = predictPM10(data, 2200, 2230, 0, 0, "Persistence", "Zero") p = c(p_nn, p_np, p_nz, p_pp, p_pz) yrange_MAPE = range(p_nn$errors$MAPE, p_nz$errors$MAPE, p_np$errors$MAPE, p_pp$errors$MAPE, p_pz$errors$MAPE) yrange_abs = range(p_nn$errors$abs, p_nz$errors$abs, p_np$errors$abs, p_pp$errors$abs, p_pz$errors$abs) yrange_RMSE = range(p_nn$errors$RMSE, p_nz$errors$RMSE, p_np$errors$RMSE, p_pp$errors$RMSE, p_pz$errors$RMSE) ranges = c(yrange_MAPE,yrange_abs,yrange_RMSE) par(mfrow=c(1,3)) for (i in 1:3) #error type (MAPE,abs,RMSE) { for (j in 1:5) #model (nn,np,nz,pp,pz) { plot(p[j]$errors[[i]], type="l", col=j, main=titles[i], xlab="Temps", ylab="Erreur", ylim=ranges[i]) if (j<5) par(new=TRUE) } } #Meilleurs results: nn et nz (np moins bon) @ %%TODO: analyse sur les trois périodes indiquées par Michel ; simtype=="exo" par defaut 16/03/2015 p_nn_epandage = predictPM10(data, 2200, 2200, 0, 0, "Neighbors", "Neighbors", sameSeaon=FALSE) 19/01/2015 p_nn_chauffage = predictPM10(data, 2200, 2200, 0, 0, "Neighbors", "Neighbors", sameSeaon=FALSE) 23/02/2015 p_nn_nonpollue = predictPM10(data, 2200, 2200, 0, 0, "Neighbors", "Neighbors", sameSeaon=FALSE) \subsection{Suite du travail} Le type de jour n'est pas pris en compte dans la recherche de voisins ; cela diminuerait nettement le nombre de similarités retenues, mais pourrait significativement améliorer les prévisions. \textcolor{blue}{OK : on le prend désormais en compte}\\ \noindent Il serait intéressant également de disposer de plusieurs méthodes de prédiction, pour par exemple les agréger à l'aide de méthodes similaires à celles du précédent contrat. \textcolor{blue}{OK : on commence à en avoir quelques-unes} \end{document}