r xts包的to.period函数中的BUG?

时间:2018-07-19 21:32:06

标签: r xts

我继承了一些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.monthlyto.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

1 个答案:

答案 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<-调用。这使我调试起来变得容易得多!