【问题标题】:R strange result when converting from zoo object to tseries从动物园对象转换为 tseries 时的 R 奇怪结果
【发布时间】: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 &lt;- zoo(as.numeric(x0[,2]), order.by=x0[,1])。在各种对象上使用 str() 使我能够看到问题所在。
  • 您仍然需要删除日期列。 TS 对象是带有日期标识符的向量。您不应同时包含这两列

标签: r time-series zoo


【解决方案1】:

通过使用 str(x0.zoo) 和 str(x0.reg),我能够确定 zoo 对象不是使用数字数据创建的。使用:

x0.zoo <- zoo(as.numeric(x0[,2]), order.by=x0[,1])

创建 zoo 对象使一切按预期工作,从而产生时间序列数据:

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2012  88 103 120  74  83  65  72  68  64  80  53  70
2013  49  43  58  63  63  57  70  64  56  66  64  68
2014  48  51  57  56  52  60  56  54  43  63  47  65
2015  42  41  52  68  57   0   0

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 2017-01-13
    • 2012-12-13
    • 2021-11-02
    • 2012-02-27
    • 2014-01-19
    • 2013-01-10
    • 2012-02-27
    相关资源
    最近更新 更多