【问题标题】:R xts lag() function only lags 1 positionR xts lag() 函数仅滞后 1 个位置
【发布时间】:2020-08-02 03:07:56
【问题描述】:

我对 xts lag() 函数有些困惑。无论我为 k 分配什么值,我都会得到相同的 1 位滞后。

使用来自https://www.rdocumentation.org/packages/xts/versions/0.12-0/topics/diff.xts的示例:

(x <- xts(1:10, Sys.Date()+1:10))
(x1 = lag(x))
(x2 = lag(x, k=2))
(lag(x, k=-1, na.pad=FALSE))

           [,1]
2020-04-20    1
2020-04-21    2
2020-04-22    3
2020-04-23    4
2020-04-24    5
2020-04-25    6
2020-04-26    7
2020-04-27    8
2020-04-28    9
2020-04-29   10
           [,1]
2020-04-20   NA
2020-04-21    1
2020-04-22    2
2020-04-23    3
2020-04-24    4
2020-04-25    5
2020-04-26    6
2020-04-27    7
2020-04-28    8
2020-04-29    9
           [,1]
2020-04-20   NA
2020-04-21    1
2020-04-22    2
2020-04-23    3
2020-04-24    4
2020-04-25    5
2020-04-26    6
2020-04-27    7
2020-04-28    8
2020-04-29    9
           [,1]
2020-04-20   NA
2020-04-21    1
2020-04-22    2
2020-04-23    3
2020-04-24    4
2020-04-25    5
2020-04-26    6
2020-04-27    7
2020-04-28    8
2020-04-29    9

我在这里可能无法理解什么?

【问题讨论】:

  • 再次检查。当我运行代码时,x2 的移位为 2。-1 是一种特殊情况,请使用?lag.xts 检查文档
  • Hmmm... ?lag.xts 给出了预期的结果,但 ?lag 给出了完全不同的头部移位 {data.table}。将函数调用更改为 lag.xts(...) 会使它们按预期工作。所以,我假设 xts lag 函数被其他东西覆盖了。我怎样才能从哪个包中找出我认为是在包中调用函数的正确语法的 xps::lag(...) 被拒绝且没有名为 xps 的包?
  • 请在下面阅读我的回答。如果您真的使您的问题可重现,即包括所有library 电话,您可能已经自己找到了解决方案;)
  • @jay.sf 确实,但我责怪我缺乏基础知识,而不是 R 允许默默地覆盖对象。不过感谢您的回答!

标签: r xts


【解决方案1】:

很可能是dplyr 造成了混乱。

library(dplyr)   
# Attaching package: ‘dplyr’
# 
# The following objects are masked from ‘package:xts’:
#   
#   first, last
# 
# The following objects are masked from ‘package:stats’:
#   
#   filter, lag  <-------------------------------------------   !!!
# 
# The following objects are masked from ‘package:base’:
#   
#   intersect, setdiff, setequal, union

在这种情况下,您可以仔细阅读这些启动消息并在函数前添加stats::(查找?lag,您会看到一个替代列表)。

比较:

cbind(stats::lag(x), stats::lag(x, k=2), stats::lag(x, k=-1, na.pad=F))
#            stats..lag.x. stats..lag.x..k...2. stats..lag.x..k....1..na.pad...F.
# 2020-04-21            NA                   NA                                 2
# 2020-04-22             1                   NA                                 3
# 2020-04-23             2                    1                                 4
# 2020-04-24             3                    2                                 5
# 2020-04-25             4                    3                                 6
# 2020-04-26             5                    4                                 7
# 2020-04-27             6                    5                                 8
# 2020-04-28             7                    6                                 9
# 2020-04-29             8                    7                                10
# 2020-04-30             9                    8                                NA

cbind(dplyr::lag(x), dplyr::lag(x, k=2), dplyr::lag(x, k=-1, na.pad=F))
#            dplyr..lag.x. dplyr..lag.x..k...2. dplyr..lag.x..k....1..na.pad...F.
# 2020-04-21            NA                   NA                                NA
# 2020-04-22             1                    1                                 1
# 2020-04-23             2                    2                                 2
# 2020-04-24             3                    3                                 3
# 2020-04-25             4                    4                                 4
# 2020-04-26             5                    5                                 5
# 2020-04-27             6                    6                                 6
# 2020-04-28             7                    7                                 7
# 2020-04-29             8                    8                                 8
# 2020-04-30             9                    9                                 9

xts::lag.xts 实际上是xts 包的一个方法,它告诉stats::lag 如何处理时间序列。但是,您可以像已经发现的那样直接使用它。两个结果是相同的。

cbind(lag.xts(x), lag.xts(x, k=2), lag.xts(x, k=-1, na.pad=F))
#            lag.xts.x. lag.xts.x..k...2. lag.xts.x..k....1..na.pad...F.
# 2020-04-21         NA                NA                              2
# 2020-04-22          1                NA                              3
# 2020-04-23          2                 1                              4
# 2020-04-24          3                 2                              5
# 2020-04-25          4                 3                              6
# 2020-04-26          5                 4                              7
# 2020-04-27          6                 5                              8
# 2020-04-28          7                 6                              9
# 2020-04-29          8                 7                             10
# 2020-04-30          9                 8                             NA

注意:也许您会使用经过处理的.rprofile 文件自动加载一些包。我建议不要做这样的事情并删除 library/require 那里的电话。另一种可能性是您加载了另一个使用dplyr 作为依赖项的包(例如“tidyverse”)。无论如何,在所有情况下,上面的解决方案都有效(但是每次找出哪个基本 R 函数被一些草率的包再次覆盖时很乏味!)。

【讨论】:

  • 包导入应该真正具有本地(文件)而不是全局范围!在我看来,这是一个非常糟糕的设计决定。
  • @DavidWaterworth:我对 R 的探索还处于早期阶段,但这么早就被这样一个基本的管理问题绊倒是令人担忧的。
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2021-08-28
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
相关资源
最近更新 更多