Tout d'abord, vous devriez envisager d'ajouter require(foreign)
à votre exemple de code, car il est nécessaire d'exécuter votre code.
Je ne sais pas quoi que ce soit à propos *.dta
fichiers ou leur mise en forme, mais je peux vous dire que si vous souhaitez travailler avec des séries chronologiques dans R
, vous feriez bien de regarder dans la famille zoo
et xts
de les fonctions.
Dans cet esprit, procédez comme suit:
require(xts)
require(foreign)
tsMloa <- ts(read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959)
tt <- seq(as.Date("1959-01-01"), as.Date("1990-12-01"), by='mon')
tsMloa_x <- xts(unclass(tsMloa)[,1:3], order.by=tt)
tsMloa_x$meanLog <- tsMloa_x$log - mean(tsMloa_x$log)
Cela devrait faire ce que vous cherchez - et il vous donne une raison de regarder dans les emballages très bons.
le faire avec zoo
- plus j'ai créé une fonction pour transformer vos entiers en mois.
require(foreign)
require(zoo)
Mloa <- read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959)
intToMonth <- function(intMonth, origin = "1960-01-01"){
dd <- as.POSIXlt(origin)
ddVec <- rep(dd, length(intMonth))
ddVec$mon <- ddVec$mon + intMonth%%12
ddVec$year <- ddVec$year + intMonth%/%12
ddRet <- as.Date(ddVec)
return(ddRet)
}
dateString <- intToMonth(Mloa[, 'tm'])
zMloa <- zoo(Mloa[, -2], dateString)
zMloa$meanLog <- zMloa$log - mean(zMloa$log)
Comme je le vois, votre problème est de convertir les horodateurs dans le fichier source à quelque chose R comprend et peut fonctionner avec. J'ai trouvé cette partie de l'adaptation à R particulièrement difficile.
La fonction ci-dessus prendra vos entiers mensuels et les transformera en objet Date
. La sortie résultante fonctionnera avec zoo
et xts
comme l'argument order.by
.
Si vous devez modifier la date d'origine, fournissez simplement le second argument à la fonction, c'est-à-dire otherDateString <- intToMonth(timeInts, "2011-01-01")
.
Merci! Est-il possible de convertir l'objet lu en utilisant 'read.dta' directement dans un objet' xts'? 'dfMloa <- as.data.frame (read.dta (" http://www.stata-press.com/data/r12/mloa.dta ", convert.dates = T))' pour le lire en tant que un 'data.frame' puis' xts (dfMloa, order.by = as.Date (dfMloa $ tm)) '? Cela ne me donne pas les bonnes dates, cependant. – tchakravarty
@fgnu: 'read.dta' renvoie déjà un data.frame; pas besoin d'envelopper dans "as.data.frame". xts exige que l'index soit une classe date-heure et 'tm' n'est qu'un nombre, donc ça ne marchera pas (c'est pourquoi @ricardo a créé' tt'). zoo n'a pas cette exigence, donc vous pouvez utiliser 'zmloa <- zoo (mloa [, - 2], mloa $ tm)', où 'mloa' est le résultat de la fonction' read.dta'. –
@fg nu - Je pense que votre problème ici est d'obtenir les détails de conversion de date juste à droite dans R. Je trouve cela aussi difficile. J'ai écrit une petite fonction qui va convertir des entiers qui sont mappés en mois à des dates avec lesquelles R peut travailler. – ricardo