web-dev-qa-db-fra.com

Ajouter le tracé de moyenne mobile au tracé de série chronologique dans R

J'ai un graphique de séries chronologiques dans le package ggplot2 et j'ai effectué la moyenne mobile et je voudrais ajouter le résultat de la moyenne mobile au graphique de séries chronologiques.

Exemple d'ensemble de données (p31):

ambtemp dt
- 1.14 2007-09-29 00:01:57
- 1.12 2007-09-29 00:03:57
- 1.33 2007-09-29 00:05:57
- 1.44 2007-09-29 00:07:57
- 1.54 2007-09-29 00:09:57
- 1.29 2007-09-29 00:11:57

Code appliqué pour la présentation des séries chronologiques:

  Require(ggplot2)
  library(scales)
  p29$dt=strptime(p31$dt, "%Y-%m-%d %H:%M:%S")
  ggplot(p29, aes(dt, ambtemp)) + geom_line() +
     scale_x_datetime(breaks = date_breaks("2 hour"),labels=date_format("%H:%M")) + xlab("Time 00.00 ~ 24:00 (2007-09-29)") + ylab("Tempreture")+
     opts(title = ("Node 29"))

Exemple de présentation de séries chronologiques Sample of time series presentation

Exemple de tracé de moyenne mobile enter image description here Échantillon de résultats attendus

Le défi est que les données de séries chronologiques ov = b obtenues à partir d'un ensemble de données qui inclut les horodatages et la température, mais les données moyennes mobiles incluent uniquement la colonne moyenne et non les horodatages et l'ajustement de ces deux peut entraîner une incohérence.

Expected Results

21
A.Amidi

Une solution consiste à utiliser la fonction rollmean() de la bibliothèque Zoo pour calculer la moyenne mobile.

Il y a une certaine confusion avec les noms de trame de données dans votre question (p31 et p29), donc j'utiliserai p 29.

p29$dt=strptime(p29$dt, "%Y-%m-%d %H:%M:%S")

library(Zoo)
#Make Zoo object of data
temp.Zoo<-Zoo(p29$ambtemp,p29$dt)

#Calculate moving average with window 3 and make first and last value as NA (to ensure identical length of vectors)
m.av<-rollmean(temp.Zoo, 3,fill = list(NA, NULL, NA))

#Add calculated moving averages to existing data frame
p29$amb.av=coredata(m.av)

#Add additional line for moving average in red
ggplot(p29, aes(dt, ambtemp)) + geom_line() + 
  geom_line(aes(dt,amb.av),color="red") + 
  scale_x_datetime(breaks = date_breaks("5 min"),labels=date_format("%H:%M")) +
  xlab("Time 00.00 ~ 24:00 (2007-09-29)") + ylab("Tempreture")+
  ggtitle("Node 29")

Si les couleurs des lignes doivent apparaître dans la légende, alors aes() dans ggplot() et geom_line() doit être modifié et scale_colour_manual() doit être ajouté.

  ggplot(p29, aes(dt)) + geom_line(aes(y=ambtemp,colour="real")) +
   geom_line(aes(y=amb.av,colour="moving"))+
   scale_x_datetime(breaks = date_breaks("5 min"),labels=date_format("%H:%M")) + 
   xlab("Time 00.00 ~ 24:00 (2007-09-29)") + ylab("Tempreture")+
   scale_colour_manual("Lines", values=c("real"="black", "moving"="red")) +    
   ggtitle("Node 29")
34
Didzis Elferts