将变量添加到R中的ts对象

时间:2012-11-26 08:34:27

标签: r time-series

我有一个使用R中的as.ts函数创建的对象,现在我想要一种简单的方法来转换其中一个变量并将其添加到同一个ts对象中。所以,例如

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

给了我一个subscript out of bounds错误。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:2)

首先,您应该考虑在示例代码中添加require(foreign),因为运行代码是必要的。

我对*.dta文件或其格式没有任何了解,但我可以告诉您,如果您想在R中使用时间序列,那么您应该做得很好看进入zooxts系列函数。

考虑到这一点,请尝试以下方法:

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对象。结果输出将同时使用zooxts作为order.by参数。

如果您需要更改原始日期,只需为该函数提供第二个参数 - 即otherDateString <- intToMonth(timeInts, "2011-01-01")