【问题标题】:BUG in the r xts package's to.period function?r xts 包的 to.period 函数中的 BUG?
【发布时间】:2018-07-27 00:18:14
【问题描述】:

我继承了一些分析模拟结果的 R 代码。有一次,该代码使用indexAt = 'yearmon' 调用xts 包的to.monthly 函数来总结动物园中的一些值。

该代码通常可以正常运行。然而,最近,在对更早的数据进行模拟分析时,对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的调用中。

特别是我发现to.period里面的xx局部变量最初是正确计算的,但是在行之后

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

【问题讨论】:

  • 我没有收到任何警告。事实上,我得到的正是我所期望的,2005 年 3 月和 4 月的开盘/高/低/收盘。 R 3.5.0, xts_0.10-2, zoo_1.8-1
  • @AkselA:你使用的是什么 R 和 xts 版本?
  • @AkselA:很抱歉,如果我在您的原始回复中错过了您的版本信息。今晚在我的家用机器上,我完全卸载了我以前的 R (3.4.3) 并安装了最新的 R (3.5.1)。然后我安装了 zoo 和 xts 包。 (注意:必须使用 0-Cloud [https] CRAN 镜像,因为我第一次尝试的其他 2 个镜像缺少它们......)。仍然不高兴:我收到相同的警告消息,随后出现两次“2005 年 4 月”的动物园。我的家用机器运行的是 Windows 7。你运行的是 linux 还是 Mac?
  • 我使用的是 Mac (10.11.6)。你以前在 R 中做过很多调试吗? Hadley Wickham 有一篇很好的实用技术文章,以备不时之需。

标签: r xts


【解决方案1】:

这看起来像一个错误,与 #158 无关。问题是z 的索引在您当地的时区是POSIXct。您汇总到每月,它没有时区(因此 xts 将时区属性设置为 "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") &lt;- "UTC" 的调用将 3 月的最后一个观察结果推到了 4 月的第一天(请注意,调试器列出了 next 调用,它将在我对 @987654329 的调用之上进行评估@)。

感谢您将范围缩小到indexClass&lt;- 电话。这让我更容易调试!

【讨论】:

  • 我希望你会注意到这篇文章!感谢您完全弄清楚。我猜 AkselA 让代码运行良好,不是因为他在 Mac 上,而是因为他的本地时区如此之大,以至于他无法推迟到下个月?另外,您知道修复程序何时会发布吗?
  • 不客气。是的,AskelA 可能领先于 UTC,而你我落后于 UTC。我不确定它什么时候会被推送,因为它在之前的版本 (0.10-2) 中也被破坏了,我正在处理在发布到 (0.11-0) 时出现的问题。您可以通过在导入索引日期时间时将它们指定为 UTC 来解决此问题。
  • 这看起来像是#53的另一个案例。
  • Joshua:关于您的评论 “您可以通过在导入索引日期时间时将索引日期时间指定为 UTC 来解决此问题”。我厌倦了使用time = positions(z) ; attr(time, "tzone") = "UTC" ; positions(z) = time 将我的动物园的位置转换为UTC 时区,我发现这样做确实会导致to.monthly 不再打印这些警告。我唯一担心的是现在每月的计算将使用 UTC 的月休概念来完成,对吗?在我的情况下,这是一个小错误,但对于尝试此解决方法的其他人来说可能是不好的,对吧?
  • 您的担忧是有效的。我花了一些时间查看这个和#53,由于当前处理时区的一些复杂性,我并不清楚解决方案。我计划进行一些重构,以便更容易尝试此修复,因此我将在重构完成后重新访问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2011-04-13
  • 2020-11-21
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多