2012-11-26 1 views
0

J'ai un objet que j'ai créé en utilisant la fonction as.ts dans R, et maintenant je voudrais un moyen simple de transformer l'une des variables et de l'ajouter au même objet ts. Ainsi, par exempleAjout d'une variable à un objet ts dans R

tsMloa <- ts(read.dta("http://www.stata-press.com/data/r12/mloa.dta"), frequency=12, start=1959) 
tsMloa[, "meanLog"] <- tsMloa[,"log"] - mean(tsMloa[,"log"]) 

me donne une erreur subscript out of bounds. Comment puis-je contourner cela?

Répondre

2

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").

+0

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

+0

@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'. –

+0

@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

Questions connexes