时间序列,将月度数据更改为季度
Posted
技术标签:
【中文标题】时间序列,将月度数据更改为季度【英文标题】:Time series, change monthly data to quarterly 【发布时间】:2014-07-03 03:25:38 【问题描述】:现在我有一些月度数据,例如:
1/1/90 620
2/1/90,591
3/1/90,574
4/1/90,542
5/1/90,534
6/1/90,545
#...etc
如果我使用 ts() 函数,很容易将数据变成时间序列结构,例如:
Jan Feb Mar ... Nov Dec
1990 620 591 574 ... 493 464
1991 100 200 300 ...........
是否有可能将其更改为这样的季度重复:
1st 2nd 3rd 4th
1990-Q1 620 591 574 464
1990-Q2 100 200 300 400
1990-Q3 ...
1990-Q4 ...
1991-Q1 ...
我试图改变
ts(mydata,start=c(1990,1),frequency=12)
到
ts(mydata,start=c(as.yearqrt("1990-1",1)),frequency=4)
但它似乎不起作用。
谁能帮帮我?非常感谢。
【问题讨论】:
季度数据意味着您每季度有一个数据点,但在您想要的输出中,您似乎每季度有 4 个数据点? 您是否需要将您的月度数据汇总为季度数据? (即以季度mean
为例)
非常感谢 beginneR、Fernando 和 Rob....我知道我的想法有点特别。我正在尝试您的想法,非常感谢!
【参考方案1】:
monthly <- ts(mydata, start = c(1990, 1), frequency = 12)
quarterly <- aggregate(monthly, nfrequency = 4)
【讨论】:
当我尝试这个时,我得到 `Aggregate.zoo(z, nfrequency = 4) 中的错误:缺少参数“by”,没有默认值' 如果有人看到这个答案,为避免您在上述评论中看到的错误,请使用aggregate.ts(monthly, nfrequency = 4)
如果您告诉人们添加平均聚合可能会有所帮助。ts(ts(na.omit(lacondos[,variable_of_interest,drop=FALSE]),frequency=fresult),mean, nfrequency = 4) 【参考方案2】:
我不同意海德曼的观点。这很少见,因为海德曼通常不会做错事。但是,我可以向您展示他的解决方案并没有给 OP 他想要的东西。
test<-c(1:100)
test_ts <- ts(test, start=c(2000,1), frequency=12)
test_ts
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 13 14 15 16 17 18 19 20 21 22 23 24
2002 25 26 27 28 29 30 31 32 33 34 35 36
2003 37 38 39 40 41 42 43 44 45 46 47 48
2004 49 50 51 52 53 54 55 56 57 58 59 60
2005 61 62 63 64 65 66 67 68 69 70 71 72
2006 73 74 75 76 77 78 79 80 81 82 83 84
2007 85 86 87 88 89 90 91 92 93 94 95 96
2008 97 98 99 100
test_agg <- aggregate(test_ts, nfrequency=4)
test_agg
2000 6 15 24 33
2001 42 51 60 69
2002 78 87 96 105
2003 114 123 132 141
2004 150 159 168 177
2005 186 195 204 213
2006 222 231 240 249
2007 258 267 276 285
2008 294
嗯,等等,第一季度不是 3 个月的平均值,而是总和。 (1+2+3 =6,但您希望它显示平均值=2)。所以你需要稍微修改一下。
test_agg <- aggregate(test_ts, nfrequency=4)/3
# divisor is (old freq)/(new freq) = 12/4 = 3
Qtr1 Qtr2 Qtr3 Qtr4
2000 2 5 8 11
2001 14 17 20 23
2002 26 29 32 35
2003 38 41 44 47
2004 50 53 56 59
2005 62 65 68 71
2006 74 77 80 83
2007 86 89 92 95
2008 98
现在显示按季度写入的每月数据的平均值。 除数是这里的诀窍。如果您有每周 (freq=52) 并且想要每季度 (freq=4) 您将除以 52/4=13。
【讨论】:
您可以只设置FUN = "mean"
而不是aggregate
ing 使用sum
并除以三。
2 年后,我现在使用 library(xls) 和 apply.quarterly(zoo_object, FUN=mean)
,这样头疼得多了。【参考方案3】:
如果你想要平均值而不是总和,只需添加“平均值”:
quarterly <- aggregate(monthly, nfrequency=4,mean)
【讨论】:
以上是关于时间序列,将月度数据更改为季度的主要内容,如果未能解决你的问题,请参考以下文章