...整个季度中的样条 - (最佳)或线性 - 内插(OK)或仅重复值(精细)。问题是我不知道如何将getFin()
和viewFin()
返回的数据类型转换为timeSeries
- 类型可用。这是我的代码:
getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000
我想要的输出是
> x
GMT x.ts
2011-09-01 3816000
2011-08-01 3816000
2011-07-01 3816000
2011-06-01 3815000
2011-05-01 3815000
2011-04-01 3815000
2011-03-01 3813000
2011-02-01 3813000
2011-01-01 3813000
2010-12-01 3778000
2010-11-01 3778000
2010-10-01 3778000
2010-09-01 3484000
但是,这是一些实际输出:
> x
2011-09-30 2011-06-30 2011-03-31 2010-12-31 2010-09-30
3816000 3815000 3813000 3778000 3484000
> str(x)
Named num [1:5] 3816000 3815000 3813000 3778000 3484000
- attr(*, "names")= chr [1:5] "2011-09-30" "2011-06-30" "2011-03-31" "2010-12-31" ...
看起来x对象是一种奇怪的反向格式,其中键是数值,值是日期的字符串。当我尝试提取日期或数字组件时,我无法隔离数字部分以生成时间序列对象。
理想情况下,为了达到我想要的输出,我可以说
mydates <- timeSequence(from = "2011-01-01", to=Sys.Date(), by = "month")
series <- timeSeries(x$data, mydates)
但我似乎无法提取数字数据部分。
的更新 的
getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000
zoox = zoo(x, order.by=as.Date(names(x)))
x2 <- na.spline(merge(zoox, foo=zoo(NA, order.by=seq(start(zoox), end(zoox), "month")))[, 1])
但是,我的输出会稍微破坏日期并混淆插值:
>x2
2010-09-30 2010-10-30 2010-11-30 2010-12-30 2010-12-31 2011-01-30 2011-03-02
3484000 3623591 3720509 3776671 3778000 3804738 3813071
2011-03-30 2011-03-31 2011-04-30 2011-05-30 2011-06-30 2011-07-30 2011-08-30
3813025 3813000 3813100 3814116 3815000 3814976 3814884
2011-09-30
3816000
如您所见,我有2011年3月的12-30和12-31,3个值,但没有2月等。如何解决这个问题?
答案 0 :(得分:1)
我只是遇到了同样的问题 - 我写了两个函数来实现它。
首先,您需要一个日期函数来移动日期,因为您可能需要月末日期,但R更简单地处理第一个日期。
toLastDay <- function(dateObj, monAdv=0, ToFirst = FALSE)
# takes date object, transforms and returns a dat object
{
tt <- as.POSIXlt(dateObj)
tt$mon <- tt$mon + monAdv # moves the month
tt$mday <- 1L # make date the first
if(ToFirst) {
tt <- as.Date(tt)
} else {
tt$mon <- tt$mon + 1L # go to the first of the next month
tt <- as.Date(tt) - 1L # subtract one day, yielding the last of prior month
}
return(tt)
}
现在你想要一个获取数据并进行线性插入的函数 - 我使用zoo
和xts
中的na.approx函数。在这里你可能想要中期qtr日期 - 根据我的经验,大多数qtrly数据最好被认为是qtr中期。
# make Qtrly monthly -- with obsv in the mid qtr
qtr2Mon <- function(QD)
{
fromD <- toLastDay(index(first(QD)), -2L, ToFirst = TRUE)
toD <- toLastDay(index(last(QD)), ToFirst = TRUE)
q2m_dates <- toLastDay(seq(fromD, toD, by = 'mon'))
emptyX <- xts(, q2m_dates)
QD_adj <- QD
index(QD_adj) <- toLastDay(index(QD), monAdv = -1L)
mm <- merge(emptyX, QD_adj)
mm_filled <- na.approx(mm)
return(mm_filled)
}
首先我们制作一个qtrly xts
对象 - 将其视为qtrly GDP或其他一些
Sys.setenv(TZ = 'GMT')
require(xts)
qdates <- seq(as.Date("2000-03-01"), as.Date("2013-06-01"), by = "3 mon")
qdates <- toLastDay(qdates)
qdata <- rnorm(length(qdates), mean = 1)
qtr_XTS <- xts(qdata, order.by = qdates)
现在我们可以使用上面的库函数将其转换为每月,假设线性增长等。
mon_fromQtr <- qtr2Mon(qtr_XTS)
完成!
答案 1 :(得分:0)
更新2 :
请发表更好的答案!这真的很难看,但这就是我接受的东西:
getFin('F')
x <- viewFin(F.f, "BS", period="Q")["Total Common Shares Outstanding",]*1000
zoox = zoo(x, order.by=as.Date(names(x)))
foo=zoo(NA, order.by=seq(as.Date(as.character(timeFirstDayInMonth(start(zoox)))), as.Date(as.character(timeFirstDayInMonth(end(zoox)))), "month"))
foo2 <- na.approx(merge(zoox, foo)[, 1])
fx <- merge(foo2,foo, all=FALSE)[,1]
哪个转换
> x
2011-09-30 2011-06-30 2011-03-31 2010-12-31 2010-09-30
3816000 3815000 3813000 3778000 3484000
到
> fx
2010-10-01 2010-11-01 2010-12-01 2011-01-01 2011-02-01 2011-03-01 2011-04-01
3487196 3586261 3682130 3778389 3790444 3801333 3813022
2011-05-01 2011-06-01 2011-07-01 2011-08-01 2011-09-01
3813681 3814363 3815011 3815348 3815685
我觉得这太难看了,所以我发布了这个答案,但是希望别人发布一个简单的话。