R从zoo对象转换为tseries时出现奇怪的结果
当我将一个普通的动物园对象转换为tseries时,我得到了奇怪的结果。我已经在两个不同版本的R(3.2.2和3.0.0)和两个版本的zoo(1.7-12和1.7-11)上使用了相同的方法,在不同操作系统(Windows 7 x64 SP1和Centos 7.0)的不同计算机上使用了相同的结果 只需使用csv文件中的数据创建一个常规zoo对象,如下所示: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"
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()
vsts()
时遇到过一些问题。不确定这是否有帮助;但是关于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