【发布时间】:2015-08-30 00:17:47
【问题描述】:
当我将常规 zoo 对象转换为 tseries 时,我得到了奇怪的结果。我已经在具有不同操作系统(Windows 7 x64 SP1 和 Centos 7.0)的不同计算机上的两个不同版本的 R(3.2.2 和 3.0.0)和两个版本的 zoo(1.7-12 和 1.7-11)上尝试了这个同样的结果。
我只需使用 csv 文件中的数据创建一个常规动物园对象,如下所示:
dput(x0)
structure(list(MonthDate = structure(1:43, .Label = c("2012-01",
"2012-02", "2012-03", "2012-04", "2012-05", "2012-06", "2012-07",
"2012-08", "2012-09", "2012-10", "2012-11", "2012-12", "2013-01",
"2013-02", "2013-03", "2013-04", "2013-05", "2013-06", "2013-07",
"2013-08", "2013-09", "2013-10", "2013-11", "2013-12", "2014-01",
"2014-02", "2014-03", "2014-04", "2014-05", "2014-06", "2014-07",
"2014-08", "2014-09", "2014-10", "2014-11", "2014-12", "2015-01",
"2015-02", "2015-03", "2015-04", "2015-05", "2015-06", "2015-07"
), class = "factor"), Qty = c("88", "103", "120", "74", "83",
"65", "72", "68", "64", "80", "53", "70", "49", "43", "58", "63",
"63", "57", "70", "64", "56", "66", "64", "68", "48", "51", "57",
"56", "52", "60", "56", "54", "43", "63", "47", "65", "42", "41",
"52", "68", "57", "0", "0")), .Names = c("MonthDate", "Qty"), row.names = c(NA, 43L), class = "data.frame")
然后我创建一个动物园对象并将其转换为常规对象,以防数据有任何缺失值
x0.zoo <- zoo(x0[,2], order.by=x0[,1])
x0.reg <- aggregate(x0.zoo, as.yearmon, identity)
is.regular(x0.reg)
[1] TRUE
这给了我:
x0.reg
Jan 2012 Feb 2012 Mar 2012 Apr 2012 May 2012 Jun 2012 Jul 2012 Aug 2012 Sep 2012 Oct 2012 Nov 2012
88 103 120 74 83 65 72 68 64 80 53
Dec 2012 Jan 2013 Feb 2013 Mar 2013 Apr 2013 May 2013 Jun 2013 Jul 2013 Aug 2013 Sep 2013 Oct 2013
70 49 43 58 63 63 57 70 64 56 66
Nov 2013 Dec 2013 Jan 2014 Feb 2014 Mar 2014 Apr 2014 May 2014 Jun 2014 Jul 2014 Aug 2014 Sep 2014
64 68 48 51 57 56 52 60 56 54 43
Oct 2014 Nov 2014 Dec 2014 Jan 2015 Feb 2015 Mar 2015 Apr 2015 May 2015 Jun 2015 Jul 2015
63 47 65 42 41 52 68 57 0 0
然后,如果我将其转换为 tseries,则数据值会完全改变:
as.ts(x0.reg)
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012 28 2 3 25 27 20 24 22 19 26 12 23
2013 9 6 16 18 18 15 23 19 14 21 19 22
2014 8 10 15 14 11 17 14 13 6 18 7 20
2015 5 4 11 22 15 1 1
我在这里做错了吗?
如果过去两个月没有零,则转换似乎工作正常。如果我用 NA 替换过去两个月的零,我会得到第二组不同的时间序列值。
根据 Alex 的建议,我尝试了:
ts(x0.reg, start=c(2012,1), frequency=12)
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012 28 2 3 25 27 20 24 22 19 26 12 23
2013 9 6 16 18 18 15 23 19 14 21 19 22
2014 8 10 15 14 11 17 14 13 6 18 7 20
2015 5 4 11 22 15 1 1
看起来是相同的(错误的)结果。
【问题讨论】:
-
如果你使用
dput()而不是打印出来会更有帮助。 -
另外,我在过去使用
as.ts()与ts()时遇到过一些问题。不确定这是否有帮助;但是ts(x0.reg, start= c(2012,1), frequency= 12)呢? -
有趣的是,我得到了相同(错误)的结果,见上文。
-
好的,我想我已经解决了。当我最初创建 zoo 对象时,我需要确保 zoo 认为数据是数字的,使用
x0.zoo <- zoo(as.numeric(x0[,2]), order.by=x0[,1])。在各种对象上使用 str() 使我能够看到问题所在。 -
您仍然需要删除日期列。 TS 对象是带有日期标识符的向量。您不应同时包含这两列
标签: r time-series zoo