从年度数据转换为季度数据,限制为年度平均值

Ara*_*ran 4 r time-series zoo

我在 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
Run Code Online (Sandbox Code Playgroud)

存储原始年度数据是一种解决方案,或者我可以通过将第一季度值作为年度值来转换回来。但是这两种方法都增加了复杂性,因为我需要跟踪我的哪个季度系列最初是从年度数据转换而来的。

我更喜欢 zoo 或 xts 包中的解决方案,但也欢迎其他建议。

编辑以包括G. Grothendieck 提出的方法 #1

# 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)
Run Code Online (Sandbox Code Playgroud)

这是一个干净、有效的建议。然而,我对方法 1 的最初挑战是它有可能导致 Q4 和 Q1 之间的跳跃(例如,2001Q1 相对于上一季度,如图所示)。这些将意味着单个季度的快速增长。部分解决方案可能是从年度转换为月度,使用六月的年度值,然后使用样条,然后应用 G. Grothendieck 提出的方法 1,然后转换为季度。

其他研究:

  • 我已经查看了 zoo 的文档,并通过 r 中的频率转换讨论进行了广泛的搜索。也许我忽略了 na.approx 或 na.spline 中的参数?
  • 我看了看棒子包(“约束的B样条曲线”)。也许它会起作用,但将值限制为特定系列的平均值的选项对我来说并不容易。如果这是最好的方法,我愿意投入更多时间来学习如何使用它。
  • 相关问题包括:
  • 我熟悉 Eviews,这是一款计量经济学软件,它通过“二次匹配平均”设置提供如此低到高的频率转换,可实现所需的结果。

chr*_*ris 5

这里有点晚了,但是tempdisagg可以满足您的需求。它确保所得高频序列的总和、平均值、第一个或最后一个值与低频序列一致。

它还允许您使用外部指标系列,例如,通过Chow-Lin技术。如果您没有它,Denton-Cholette方法会产生比 Eviews 中的方法更好的结果。

这是你的例子:

# need ts object as input
z_a <- ts(c(100, 110, 111), start = 2000)

library(tempdisagg)
z_q <- predict(td(z_a ~ 1, method = "denton-cholette", conversion = "average"))

z_q
#           Qtr1      Qtr2      Qtr3      Qtr4
# 2000  97.65795  98.59477 100.46841 103.27887
# 2001 107.02614 109.71460 111.34423 111.91503
# 2002 111.42702 111.06100 110.81699 110.69499

# which has the same means as your original series:

tapply(z_q, floor(time(z_q)), mean)
# 2000 2001 2002 
#  100  110  111 
Run Code Online (Sandbox Code Playgroud)