2014-09-12 10 views
3

Je suis un n00b en R et un n00b en débordement de pile (juste joint), alors pardonnez-moi si je n'ai pas réussi à utiliser le balisage (que je ne connais pas) ou raté quelque chose dans le readme. Si cela ne vous dérange pas, je vais passer à travers mon problème complet ici, peut-être que vous pourriez être assez aimable pour donner un aperçu de la façon dont je devrais faire mieux à ce sujet! Construction d'objets de séries chronologiques individuels pour chaque TS1 Veuillez trouver un exemple de données ci-dessous. Essentiellement, je charge un fichier csv avec plusieurs séries chronologiques irrégulières (exemple TS1, TS2) ci-dessous, donc dans un monde idéal, je les diviserais en objets de séries temporelles individuels et irréguliers (par exemple zoo?), Donc TS1, TS2, ... ce problème a été discuté ici (R/zoo: handle non-unique index entries but not lose data?) mais j'ai essayé à plusieurs reprises d'utiliser cette approche, et j'ai échoué.R: séries temporelles avec entrées d'index temporel en double

Date TS Data 
21/05/2014 TS1 0.95 
17/04/2014 TS1 1.02 
27/03/2014 TS1 0.90 
30/01/2014 TS1 0.80 
12/12/2013 TS1 0.70 
18/09/2013 TS1 0.67 
01/11/2012 TS1 0.71 
01/11/2012 TS1 0.70 
21/05/2014 TS2 0.47 
20/05/2014 TS2 0.51 
16/05/2014 TS2 0.49 
15/05/2014 TS2 0.55 
10/05/2014 TS2 0.63 
07/05/2014 TS2 0.77 

comme on le voit, le problème se pose en raison de dupliquer l'index de date de 01/11/2012 pour TS1 qui provoque read.zoo ne pas créer mon objet de données partagé.

Étape 2
Ce que je voudrais alors faire est, à chaque date irrégulière, ajouter toutes les données à cette date ensemble. Puisque toutes les séries temporelles sont irrégulières, et avec une régularité différente, je voudrais utiliser la valeur antérieure pour un TS. Par exemple. pour 21/05/2014, ce calcul dans l'exemple est simple car TS1 et 2 ont une entrée, donc la réponse serait 0.47 + 0.95. Mais pour 20/05, seul TS2 a une entrée, donc la valeur pour TS1 qui devrait être utilisée est la plus récente à cette date, c'est-à-dire la valeur 17/04/2014 de 1.02, donc le calcul pour 20/05/2014 devrait être 0.51 + 1.02. Il se pourrait que le moyen le plus simple d'y parvenir soit de convertir chaque TS en valeur journalière, de sorte que la valeur précédente soit utilisée jusqu'à un nouveau point de données. mais ceci est inutile/inutile pour l'étape 3 ci-dessous. Après avoir créé cette somme de données agrégées de tous les TS ', je veux faire un ajustement de courbe polynomiale. Je veux aussi différencier cette courbe-ajustement pour trouver le taux de changement à la date d'aujourd'hui fondée sur cette courbe ajustée.

Toute aide serait grandement appréciée! Je sens que frapper à plusieurs reprises la tête contre un mur serait plus amusant que de faire quoi que ce soit d'autre à ce stade !!

Merci

Mise à jour: J'ai maintenant le code comme suit grâce à Grothendieck.

library(scales) 
library(zoo) 
library(ggplot2) 

f <- function (z) { 
zz <- read.zoo(z, header = TRUE, split = 2, format = "%d/%m/%Y", aggregate = mean); 
z.fill <- na.locf(zz); 
z.fill <- (z.fill >= 0.5) * z.fill; 
z.fill <- na.fill(z.fill,0); 
zfill.mat = matrix(z.fill, NROW(z.fill)); 
z.sum <- rowSums(zfill.mat); 
zsum <- zoo(z.sum,time(z.fill)); 
return(zsum); 
} 

DF <- read.csv(file.choose(), header = TRUE, as.is = TRUE); 
DF.S <- split(DF[-2], DF[[2]]); 
user <- DF[1,2]; 
Ret <- lapply(DF.S, f); 

I un problème restant:
Ret contient une liste d'une trame de données. Je peux y accéder en tapant Ret $ user, mais comme l'utilisateur varie, j'ai besoin de le rendre dynamique. J'ai essayé de construire une expression dynamique par exemple:
x < - coller ("Ret $ '", utilisateur, "'", sep = "");
tracer (x)

mais n'a pas pu obtenir cela à évaluer.

+0

Je suis venu dans cette une ou deux fois, une option facile est de read.table, puis agrégées toutes les entrées de date en double de quelque manière que vous s'il vous plaît, puis convertir au zoo. – DMT

Répondre

2

read.zoo a un argument aggregate= qui prend une fonction qui est utilisée pour agréger les valeurs à des moments dupliqués dans la même série.Ici, nous prenons le mean des jours en double dans la série, mais vous pouvez utiliser sum ou toute autre fonction. (Si les données provenaient d'un fichier, nous remplacerions text = Lines argument par read.zoo avec quelque chose comme "myfile.dat".) Ensuite, nous utilisons na.locf pour remplir les NA, additionner les lignes et nous utilisons na.omit pour supprimer les NAs principaux donnant zsum. Ensuite, nous calculons une grille temporelle régulièrement espacée g et une fonction spline splfun évaluant cette fonction et sa dérivée sur la grille qui, après la conversion au zoo, donne zspl et zder. Enfin nous les complotons.

Lines <- "Date TS Data 
21/05/2014 TS1 0.95 
17/04/2014 TS1 1.02 
27/03/2014 TS1 0.90 
30/01/2014 TS1 0.80 
12/12/2013 TS1 0.70 
18/09/2013 TS1 0.67 
01/11/2012 TS1 0.71 
01/11/2012 TS1 0.70 
21/05/2014 TS2 0.47 
20/05/2014 TS2 0.51 
16/05/2014 TS2 0.49 
15/05/2014 TS2 0.55 
10/05/2014 TS2 0.63 
07/05/2014 TS2 0.77" 

library(zoo) 

z <- read.zoo(text = Lines, header = TRUE, split = 2, format = "%d/%m/%Y", 
     aggregate = mean) 
zsum <- na.omit(zoo(rowSums(na.locf(z)), time(z))) 

g <- seq(start(zsum), end(zsum), "day") 
splfun <- splinefun(time(zsum), coredata(zsum)) 
zspl <- zoo(splfun(g), g) 
zder <- zoo(splfun(g, deriv = 1), g) 

plot(merge(zspl, zder)) 

screenshot

+0

Merci beaucoup. Juste pour quelqu'un d'autre qui regarde cela en essayant de résoudre un problème similaire, je voulais utiliser un zéro où un TS avait une NA, plutôt que d'omettre. Pour ce faire, j'ai modifié votre zsum comme suit: zsum <- zoo (rowSums (na.fill (na.locf (z), 0)), time (z)). Une autre chose que je dois maintenant faire est d'éditer chaque TS de sorte que si TS <0,5, TS = 0. – Carl

+0

Essayez: '(TS> 0,5) * TS' –

+0

Merci encore. Juste pour clarifier pour d'autres n00bs comme moi, (TS> 0.5) est une condition donc si c'est vrai, alors le() est 1, et 1 * TS = TS. Sinon, si TS <= 0.5, les() sont faux, ie. 0, et 0 * TS = 0. – Carl

Questions connexes