0

我有一个使用as.tsR 中的函数创建的对象,现在我想要一种简单的方法来转换其中一个变量并将其添加到同一个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错误。我怎样才能解决这个问题?

4

1 回答 1

2

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

我对文件或它们的格式一无所知*.dta,但我可以告诉你,如果你想在 中使用时间序列R,你最好研究一下zooandxts系列函数。

考虑到这一点,请尝试以下操作:

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

于 2012-11-26T09:04:05.263 回答