R从zoo对象转换为tseries时出现奇怪的结果

R从zoo对象转换为tseries时出现奇怪的结果,r,time-series,zoo,R,Time Series,Zoo,当我将一个普通的动物园对象转换为tseries时,我得到了奇怪的结果。我已经在两个不同版本的R(3.2.2和3.0.0)和两个版本的zoo(1.7-12和1.7-11)上使用了相同的方法,在不同操作系统(Windows 7 x64 SP1和Centos 7.0)的不同计算机上使用了相同的结果 只需使用csv文件中的数据创建一个常规zoo对象,如下所示: dput(x0) structure(list(MonthDate = structure(1:43, .Label = c("2012-01"

当我将一个普通的动物园对象转换为tseries时,我得到了奇怪的结果。我已经在两个不同版本的R(3.2.2和3.0.0)和两个版本的zoo(1.7-12和1.7-11)上使用了相同的方法,在不同操作系统(Windows 7 x64 SP1和Centos 7.0)的不同计算机上使用了相同的结果

只需使用csv文件中的数据创建一个常规zoo对象,如下所示:

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")
然后我创建一个zoo对象,并将其转换为常规对象,以防数据中缺少任何值

x0.zoo <- zoo(x0[,2], order.by=x0[,1])
x0.reg <- aggregate(x0.zoo, as.yearmon, identity)
is.regular(x0.reg)
[1] TRUE
然后,如果我将其转换为T系列,则数据值将完全改变:

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
我做错什么了吗

如果过去两个月没有零,转换似乎可以正常工作。如果我用NAs替换过去两个月的零,我会得到时间序列的第二组不同的值

根据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
它看起来是相同的(错误的)结果。

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

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

如果您对数据使用
dput()
而不是将其打印出来,这将更有帮助。此外,我过去使用
as.ts()
vs
ts()
时遇到过一些问题。不确定这是否有帮助;但是关于
ts(x0.reg,start=c(2012,1),frequency=12)
呢?有趣的是,我得到了相同(错误)的结果,见上文。好的,我想我已经解决了。当我最初创建zoo对象时,我需要确保zoo认为数据是数字的,通过使用
x0.zoo,您仍然需要去掉日期列。TS对象是带有日期标识符的向量。不应该同时包含这两列
x0.zoo <- zoo(as.numeric(x0[,2]), order.by=x0[,1])
     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