【问题标题】:How to break quarterly data into monthly using certain formula in R?如何使用 R 中的某些公式将季度数据分解为月度数据?
【发布时间】:2021-05-17 11:07:42
【问题描述】:

亲爱的

我正在尝试使用 R 将季度数据分解为月度数据。我不关心日期,因为我可以毫无问题地生成与值相对应的月份向量。问题在于值向量和估算缺失数据。请看下面的例子:

Quarter Value
2010-Q1 10
2010-Q2 15
2010-Q3 18
2010-Q4 12

新的数据集应该如下所示

Month   Value
2010-3  10
2010-4  11.67
2010-5  13.34
2010-6  15
2010-7  16
2010-8  17
2010-9  18
2010-10 16
2010-11 14
2010-12 12

现在,使用以下公式填充每个季度内的月份

The first month of the quarter[i] = The previous quarter value [i-1] + ((The difference between the quarter [i] and [i-1])/3)
The second month of the quarter[i] = The previous quarter value [i-1] + 2*((The difference between the quarter [i] and [i-1])/3)

例如:

2020 年第一季度 = 10

2020 年第二季度 = 15

差/3 = 5/3

2020 年至 4 月 = 10 + 差异

2020 年 5 月 = 10 + 2*差异

2020-6 月 = 15(季度末保持不变)或可以计算为 10 + 3*diff

我想知道如何生成一个可以分解上述值的新变量。

谢谢

【问题讨论】:

  • 声称的副本没有任何答案可以回答上述问题。

标签: r time-series data-manipulation


【解决方案1】:

1) 将输入转换为带有yearqtr 索引的动物园系列z(直接表示没有月份或日期的年份和季度),然后用NA 填充并应用na.approx将它们线性填充为Value。假设该系列是规则间隔的,我们可以使用每年 12 个月的频率将第一个索引值转换为 yearmon(直接表示没有日的年月)。最后,要么将其保留为Value,要么使用最后一行将其转换回数据框DF2。另一种可能性是使用as.ts(Value) 将其转换为ts 系列。

请注意,yearmon 类的显示如下所示,但在内部将年和月表示为年加上一个等于 0 的小数,表示一月,1/12 表示二月,...,11/12 表示十二月,所以as.integer(time(Value)) 将给出年份,cycle(time(Value)) 将给出月份编号(Jan = 1, ..., Dec = 12)。

library(zoo)

z <- read.zoo(DF, FUN = function(x) as.yearqtr(x, "%Y-Q%q"))
Value <- zooreg(na.approx(c(t(cbind(z, NA, NA)))), 
  start = as.yearmon(start(z)), freq = 12)
DF2 <- fortify.zoo(Value) # optional

给予:

> DF2
      Index    Value
1  Jan 2010 10.00000
2  Feb 2010 11.66667
3  Mar 2010 13.33333
4  Apr 2010 15.00000
5  May 2010 16.00000
6  Jun 2010 17.00000
7  Jul 2010 18.00000
8  Aug 2010 16.00000
9  Sep 2010 14.00000
10 Oct 2010 12.00000

从图形上看是这样的:

plot(Value, type = "o")

(剧情后续)

2) 第二种方法是从(1)中以z开始,首先创建输出yearmon时序tt,将z的时间索引转换为@987654342 @给z.ym,然后将它们合并生成NA,最后应用na.approx来填充它们。

tt <- seq(as.yearmon(start(z)), as.yearmon(end(z)), 1/12)
z.ym <- aggregate(z, as.yearmon, c)
Value <- na.approx(merge(z.ym, zoo(, tt)))

注意

可重现形式的输入:

Lines <- "Quarter Value
2010-Q1 10
2010-Q2 15
2010-Q3 18
2010-Q4 12"
DF <- read.table(text = Lines, header = TRUE)

【讨论】:

  • 谢谢!我对值列更感兴趣。我可以毫无问题地向它添加时间序列变量。我的问题可能不清楚。如何将 Value 变量单独更改为我在问题中提到的形式。忘记时间。
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2020-08-28
相关资源
最近更新 更多