Utilisation du package de prévisions R avec des valeurs manquantes et / ou des séries chronologiques irrégulières

16

Je suis impressionné par le forecastpackage R , ainsi que par exemple le zoopackage pour les séries temporelles irrégulières et l'interpolation des valeurs manquantes.

Mon application est dans le domaine des prévisions de trafic du centre d'appels, donc les données le week-end sont (presque) toujours manquantes, ce qui peut être bien géré zoo. De plus, certains points discrets peuvent être manquants, j'utilise juste des R NApour cela.

Le truc, c'est que toute la belle magie du paquet de prévisions, comme eta(), auto.arima()etc., semble s'attendre à des tsobjets simples , c'est-à-dire des séries temporelles équidistantes ne contenant aucune donnée manquante. Je pense que les applications du monde réel pour les séries temporelles à espacement unique existent certainement, mais - à mon avis - très limitées.

Le problème de quelques NAvaleurs discrètes peut être facilement résolu en utilisant l'une des fonctions d'interpolation proposées dans zooainsi que par forecast::interp. Après cela, je lance les prévisions.

Mes questions:

  1. Quelqu'un suggère-t-il une meilleure solution?
  2. (ma principale question) Au moins dans mon domaine d'application, la prévision du trafic du centre d'appels (et pour autant que je puisse imaginer la plupart des autres domaines problématiques), les séries temporelles ne sont pas espacées. Au moins, nous avons un programme récurrent de "jours ouvrables" ou quelque chose du genre. Quelle est la meilleure façon de gérer cela et d'utiliser toujours toute la magie du package de prévisions?

    Dois-je simplement "compresser" la série chronologique pour remplir les week-ends, faire les prévisions, puis "gonfler" à nouveau les données pour réinsérer les valeurs NA dans les week-ends? (Ce serait dommage, je pense?)

    Est-il prévu de rendre le package de prévisions entièrement compatible avec les packages de séries chronologiques irrégulières comme zoo ou son? Si oui, quand et si non, pourquoi pas?

Je suis assez nouveau dans les prévisions (et les statistiques en général), donc je pourrais oublier quelque chose d'important.

entreprogreur
la source
Bienvenue sur le site et à la prévision! Les applications du monde réel pour des séries temporelles à espacement uniquement ne sont certainement pas très limitées. Il se trouve que je connais un peu les prévisions qui prévoient que votre supermarché dispose de suffisamment de produits pour répondre à la demande promotionnelle, et croyez-moi, ces millions de séries chronologiques (20000 SKU dans 1000 magasins sont très courantes) sont en effet très espacées. (Désolé, mais vous l'avez en quelque sorte demandé ...) Mais je vais essayer de trouver quelque chose de plus utile dans une minute.
Stephan Kolassa
2
Pourriez-vous être plus explicite sur la raison pour laquelle les données du centre d'appels ne sont pas espacées? (Peut-être que je me méprends sur ce que vous entendez par "espacé".) Les méthodes de prévision du centre d'appels que j'ai vues regroupent généralement les appels entrants en intervalles de 15 minutes, ce qui correspond à ma définition d '"espacé". Nous devons ensuite faire face à une saisonnalité complexe (intra-quotidienne, intra-hebdomadaire, annuelle), pour quel sujet cela peut vous aider: stats.stackexchange.com/questions/44704/… Est-ce que cela répond à votre question? Sinon, dites-nous simplement ce dont vous avez besoin.
Stephan Kolassa
5
auto.arimapeut gérer les valeurs manquantes.
Rob Hyndman
1
Merci pour tous les commentaires constructifs! Stephan, mes données ne sont pas espacées de deux manières: 1. De nombreux centres d'appels sont fermés les samedis et dimanches. Certains sont fermés le dimanche uniquement. Ainsi, l'espace "normal" entre deux points de données adjacents est d'un jour, sauf du vendredi au lundi, qui est de trois jours. L'espace n'est donc pas égal, c'est-à-dire non espacé. Deuxièmement, il peut y avoir des données manquantes aléatoires quelque part, car ils ont juste oublié d'allumer leur appareil de mesure ce jour-là ou autre chose. J'espère que cela clarifie mon propos.
entreprogreur
1
Juste une pensée (provocatrice). Si vous dites que les centres d'appels sont fermés le week-end. Vous n'avez alors aucune donnée manquante. Votre série chronologique s'étend du lundi au vendredi. 5 jours. assez équidistant. Interpoler les week-ends me semble formellement faux, car vous savez qu'aucun appel ne se produit et que toute information que vous imputez est fausse. Je dirais que vous ne pouvez jamais améliorer une estimation en inventant des données ...
moyen à sens

Réponses:

1

Je ne suis pas un expert en R, alors peut-être qu'il existe un moyen plus simple, mais je l'ai déjà rencontré auparavant. Ce que j'ai fait auparavant, c'est implémenter une fonction qui mesure la distance (en unités de temps) entre les dates réelles et l'enregistre dans une nouvelle colonne de la série chronologique existante. Nous avons donc quelque chose comme:

index/date | value | distance  
01.01.2011 |  15   |   1  
02.01.2011 |  17   |   3  
05.01.2011 |  22   |   ..   

De cette façon, si votre série temporelle n'est pas encore associée à une série réelle de points dans le temps (ou au mauvais format ou autre), vous pouvez toujours travailler avec.

Ensuite, vous écrivez une fonction qui crée pour vous une nouvelle série chronologique, comme ceci:

Tout d'abord, vous calculez combien d'unités de temps la série temporelle aurait réellement entre les dates de votre choix et créez cette chronologie dans zoo ou ts ou quel que soit le choix avec des valeurs vides.

Deuxièmement, vous prenez votre tableau de séries chronologiques incomplet et, à l'aide d'une boucle, remplissez les valeurs dans la chronologie correcte, selon les limites de votre choix. Lorsque vous tombez sur une ligne où la distance unitaire n'est pas un (les jours (les unités) sont manquants), vous remplissez des valeurs interpolées.

Maintenant, puisque c'est votre fonction, vous pouvez réellement choisir comment interpoler. Par exemple, vous décidez que si la distance est inférieure à deux unités, vous utilisez une interpolation linéaire standard. Si une semaine est manquante, vous faites autre chose et si un certain seuil de dates manquantes est atteint, vous donnez un avertissement sur les données - vraiment tout ce que vous voulez imaginer.

Si la boucle atteint la date de fin, vous retournez vos nouveaux ts.

L'avantage d'une telle fonction est que vous pouvez utiliser différentes interpolations ou procédures de traitement en fonction de la longueur de l'écart et renvoyer une série créée proprement au format de votre choix. Une fois écrit, il vous permet de tirer des ts propres et agréables de toute sorte de données tabulaires. J'espère que cela vous aide d'une manière ou d'une autre.

IMA
la source
Merci, IMA, pour la réponse utile! Donc, ce que je fais maintenant: pour les valeurs manquantes discrètes, j'utilise l'interpolation (ainsi que des "ajustements" fournis par l'utilisateur) pour remplir les données manquantes. IMA, votre réponse en améliorant davantage cela est très utile. Pour les données manquantes "régulières" telles que le week-end, je transforme mes données en secondes, "pseudo" ts uniquement à des fins de prévision, puis je retransforme le résultat dans la série chronologique "correcte", de sorte que la prévision aura également des valeurs manquantes pendant les weekends. Je serais toujours reconnaissant pour une suggestion plus élégante sur la façon de gérer les «lacunes» régulières le week-end.
entreprogreur
@entreprogreur, je n'ai pas répondu, IMA l'a fait. IMA obtient le crédit complet ici. J'ai juste modifié la mise en forme pour qu'elle s'affiche correctement.
gung - Rétablir Monica
1

Vous devez être très prudent lorsque vous appliquez une interpolation avant de poursuivre le traitement statistique. Le choix que vous faites pour votre interpolation introduit un biais dans vos données. C'est quelque chose que vous voulez absolument éviter, car cela pourrait altérer la qualité de vos prévisions. À mon avis pour les valeurs manquantes telles que celles que vous avez mentionnées, qui sont régulièrement espacées dans le temps et qui correspondent à un arrêt des activités, il serait peut-être plus correct de laisser ces jours hors de votre modèle. Dans le petit monde de votre centre d'appels (le modèle que vous construisez à ce sujet), il serait peut-être préférable de considérer que le temps s'arrête tout simplement lorsqu'il est fermé au lieu d'inventer les mesures d'une activité inexistante. D'un autre côté, le modèle ARIMA a été construit statistiquement sur l'hypothèse que les données sont également espacées. Autant que je sache, il n'y a pas d'adaptation d'ARIMA à votre cas. Si vous manquez quelques mesures les jours ouvrables réels, vous pourriez être obligé d'utiliser l'interpolation.

Remi D
la source
0

Je n'interpolerais pas les données avant d'estimer le modèle sur ces données, comme l'a noté @Remi. C'est une mauvaise idée. Un exemple extrême: imaginez que vous disposez de deux points de données janvier 2013 et janvier 2014. Maintenant, interpolez 10 points mensuels entre février et décembre 2013 et exécutez une régression sur la date mensuelle. En réalité, ça ne va pas être si mauvais, mais c'est la même idée: vous gonflerez vos statistiques au mieux.

La voie à suivre consiste à utiliser des méthodes de séries chronologiques qui gèrent les données manquantes. Par exemple, les méthodes d'espace d'état. Jetez un œil au package astsa R. Il est accompagné d'un excellent livre sur l'analyse des séries chronologiques. Cela gérera bien les données manquantes. Matlab a maintenant une fonctionnalité similaire dans le package ssm . Vous devez apprendre à convertir vos modèles sous forme d'espace d'état, mais vous devez quand même apprendre cela si vous voulez vous éloigner de la auto.arima"magie".

Aksakal
la source