我继承了一些R代码,用于分析仿真结果。一方面,该代码使用to.monthly
调用xts包的indexAt = 'yearmon'
函数,以汇总动物园中的某些值。
该代码通常可以正常运行。但是,最近,当对旧数据进行模拟分析时,对to.monthly
的调用生成了一些令人不安的警告消息,如下所示:
Warning in zoo(xx, order.by = index(x), ...) :
some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique
我将数据筛选到了仍显示此警告的最小大小。从此R代码开始:
library(xts)
z = structure(c(-1062503.35419463, -1080996.55425821, -1099783.92018741,
-1122831.06978888, -1138804.79976585, -1158620.33101501, -1163717.44859603,
-1183250.17288897, -1212428.97863421, -1234981.23171341, -1253605.89670471,
-1269885.84780747, -1272023.98376509, -1284471.17954946, -1313114.61914572,
-1334861.551294, -1349971.87378146, -1360596.77251109, -1363047.71977556,
-1383840.30131117, -1407963.97518998, -1427010.7195352, -1451908.36211767,
-1464563.94519573, -1470017.67402451, -1503642.02732151, -1529231.67395429,
-1560593.79655716, -1582052.24505653, -1595391.99583389), index = structure(c(1111985820,
1112072340, 1112158740, 1112245140, 1112331540, 1112392740, 1112587140,
1112673540, 1112759880, 1112846340, 1112932200, 1112993940, 1113191940,
1113278340, 1113364560, 1113451080, 1113537540, 1113598740, 1113796560,
1113883140, 1113969540, 1114055940, 1114142220, 1114203540, 1114401480,
1114487940, 1114574280, 1114660740, 1114747080, 1114808340), class = c("POSIXct",
"POSIXt")), class = "zoo")
class(z)
head(z)
tail(z)
然后执行对to.monthly
的调用:
to.monthly(z, indexAt = 'yearmon', name = "Monthly")
在生成此输出的机器上:
Warning in zoo(xx, order.by = index(x), ...) :
some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique
Warning in zoo(xx, order.by = index(x), ...) :
some methods for “zoo” objects do not work if the index entries in ‘order.by’ are not unique
Monthly.Open Monthly.High Monthly.Low Monthly.Close
Apr 2005 -1062503 -1062503 -1138805 -1138805
Apr 2005 -1158620 -1158620 -1595392 -1595392
请注意警告消息,后跟to.monthly
的结果,这是一个动物园,其位置重复为"Apr 2005"
。
我花了一些时间在to.monthly
中逐行执行代码,并确定该错误实际上发生在to.monthly
对to.period
的调用中。
特别是,我发现xx
内的to.period
局部变量最初是正确计算的,但是在行
indexClass(xx) <- indexAt
在xx
的位置变得唯一时执行。
对我来说,这种行为肯定像xts包的to.period
函数中的错误。
我很想听听知道to.monthly/to.period/yearmon
实际工作方式的人的声音,或者确认这是一个错误,或者向我解释为什么不这样做,然后给我解决方法。
我在xts github页面上发现了this possibly related report(我不完全了解)。
关于我的机器:
> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)
...
other attached packages:
...
xts_0.10-0
zoo_1.8-0
启动Rgui时,我看到有关xts的警告消息:
Warning: package ‘xts’ was built under R version 3.4.2
答案 0 :(得分:1)
这看起来像是错误,与#158无关。问题在于,z
的索引在您当地的时区为POSIXct
。您汇总为每月,没有时区(因此xts将timezone属性设置为"UTC"
)。
但是时区的更改发生在POSIXct
索引上,它会在将索引转换为"yearmon"
之前更改本地时间。因此,根据您当地时区与UTC的时差,这可能会将一个月中的第一个(最后一个)观测值转换为上一个(下一个)月的最后一个(第一个)观测值。
说明:
Sys.setenv(TZ = "America/Chicago")
debugonce(xts:::`indexClass<-.xts`)
to.monthly(z, indexAt="yearmon", name="monthly")
# <snip>
# Browse[2]>
# debug: attr(attr(x, "index"), "tzone") <- "UTC"
# Browse[2]> print(x) # When timezone is "America/Chicago"
# monthly.Open monthly.High monthly.Low monthly.Close
# 2005-03-31 22:59:00 -1062503 -1062503 -1138805 -1138805
# 2005-04-29 15:59:00 -1158620 -1158620 -1595392 -1595392
# Browse[2]>
# debug: attr(attr(x, "index"), "tclass") <- value
# Browse[2]> print(x) # When timezone is "UTC"
# monthly.Open monthly.High monthly.Low monthly.Close
# 2005-04-01 04:59:00 -1062503 -1062503 -1138805 -1138805
# 2005-04-29 20:59:00 -1158620 -1158620 -1595392 -1595392
# Warning message:
# timezone of object (UTC) is different than current timezone ().
您可以看到,对attr(attr(x, "index"), "tzone") <- "UTC"
的调用将3月的最后一次观察推到了4月的第一天(请注意,调试器列出了 next 调用,它将在我对的调用之上进行评估print(x)
。
感谢您将其范围缩小到indexClass<-
调用。这使我调试起来变得容易得多!