首先,您应该考虑将require(foreign)
添加到您的示例代码中,因为它需要运行您的代码。
我不知道*.dta
文件或者其格式什么,但我可以告诉你,如果你想在R
时间序列的工作,你会做很好地窥视zoo
和xts
家庭功能。
考虑到这一点,请尝试以下操作:
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)
这应该做你正在寻找什么 - 它给你一个理由寻找到了很好的封装。
与zoo
做这 - 再加上我已经创建了一个功能,把你的整数变成个月。
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)
正如我所看到的,您的问题是将源文件中的时间戳转换为R可以理解并可以使用的内容。我发现这部分适应R特别棘手。
上面的函数会把你的月份整数,并把它们变成一个Date
对象。结果输出将与zoo
和xts
一起使用,作为order.by
参数。
如果您需要更改原点日期,只需向函数提供第二个参数即otherDateString <- intToMonth(timeInts, "2011-01-01")
。
谢谢!是否可以将使用'read.dta'直接读入的对象转换为'xts'对象? 'dfMloa < - as.data.frame(read.dta(“http://www.stata-press.com/data/r12/mloa.dta”,convert.dates = T))'将其作为一个'data.frame'然后'xts(dfMloa,order.by = as.Date(dfMloa $ tm))'?然而,这并不能给我正确的日期。 – tchakravarty
@fgnu:'read.dta'已经返回一个data.frame;不需要将其包装在'as.data.frame'中。 xts要求索引是一个日期时间类,而'tm'只是一个数字,所以它不起作用(这就是@ricardo创建'tt'的原因)。动物园没有这个要求,所以你可以使用'zmloa < - 动物园(mloa [, - 2],mloa $ tm)',其中'mloa'是'read.dta'函数的结果。 –
@fg nu - 我认为你的问题在于在R中获得日期转换的细节。我也发现这一点很棘手。我已经写了一个小函数,它将映射到月份的整数转换为R可以使用的日期。 – ricardo