【发布时间】:2015-12-22 06:18:48
【问题描述】:
我在 R 中有几个按年频率出现的变量,我想将它们包含在回归分析中,而其他变量按季度出现频率。此外,我希望能够以重现原始年度数据的方式将季度数据转换回年度频率。
我目前从低频到高频时间序列数据转换的方法是使用 zoo 包中的 na.spline 函数。但是,我不知道如何约束季度数据以匹配相应的年度平均值。结果,当我将数据从季度频率转换回年度频率时,我得到的年度值与原始系列不同。
可重现的例子:
library(zoo)
# create annual example series
a <- as.numeric(c("100", "110", "111"))
b <- as.Date(c("2000-01-01", "2001-01-01", "2002-01-01"))
z_a <- zoo(a, b); z_a
# current approach using na.spline in zoo package
end_z <- as.Date(as.yearqtr(end(z_a))+ 3/4)
z_q <- na.spline(z_a, xout = seq(start(z_a), end_z, by = "quarter"), method = "hyman")
# result, with first quarter equal to annual value
c <- merge(z_a, z_q); c
# convert back to annual using aggregate in zoo package
# At this point I would want both series to be equal, but they aren't.
d <- aggregate(c, as.integer(format(index(c),"%Y")), mean, na.rm=TRUE); d
存储原始年度数据是一种解决方案,或者我可以通过将第一季度值作为年度值进行转换。但是这两种方法都增加了复杂性,因为我需要跟踪我的哪些季度系列最初是从年度数据转换而来的。
我更喜欢 zoo 或 xts 包中的解决方案,但也欢迎其他建议。
已编辑以包含方法 #1 由 G. Grothendieck 提出
# Approach 1
yr <- format(time(c), "%Y")
c$z_q_adj <- ave(coredata(c$z_q), yr, FUN = function(x) x - mean(x) + x[1]); c
# simple plot
dat <- c%>%
data.frame(date=time(.), .) %>%
gather(variable, value, -date)
ggplot(data=dat, aes(x=date, y=value, group=variable, color=variable)) +
geom_line() +
geom_point() +
theme(legend.position=c(.7, .4)) +
geom_point(data = subset(dat,variable == "z_a"), colour="red", shape=1, size=7)
这是一个干净、有效的建议。然而,我对方法 1 的最初挑战是它有可能导致 Q4 和 Q1 之间的跳跃(例如,2001Q1 相对于上一季度,如图所示)。这将意味着一个季度的快速增长。部分解决方案可能是使用 6 月的年度值从年度转换为月度,然后使用样条曲线,然后应用 G. Grothendieck 提出的方法 1,然后转换为季度。
其他研究:
【问题讨论】:
标签: r time-series zoo