R中magrittr和arima的兼容性问题

Posted

技术标签:

【中文标题】R中magrittr和arima的兼容性问题【英文标题】:compatibility issue of magrittr and arima in R 【发布时间】:2019-08-17 02:40:49 【问题描述】:

考虑以下示例:

library(tidyverse)
set.seed(1)
forecast::forecast
x <- cumsum(rnorm(10))
y1 <- arima(x, order = c(1, 0, 0))
y2 <- x %>% arima(order = c(1, 0, 0))

length(fitted(y1))
[1] 10
length(fitted(y2))
[1] 0

对象y1y2几乎相同,唯一的例外是插槽callseries。所以我想这就是fitted 函数开始它的魔力的地方。

我真的很想使用y1 而不是y2。 有谁知道fitted 的替代函数会产生相同的结果?

EDIT2: 如果forecast 包未加载到命名空间(例如通过forecast::forecast),则不会出现上述“错误”。 我不知道将包加载到命名空间会改变某些函数的行为。

编辑: 由于代码似乎不可重现,我添加了我的 `sessionInfo()´

R version 3.5.2 (2018-12-20)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=German_Austria.1252  LC_CTYPE=German_Austria.1252    LC_MONETARY=German_Austria.1252 LC_NUMERIC=C                    LC_TIME=German_Austria.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] forcats_0.4.0   stringr_1.3.1   dplyr_0.8.0.1   purrr_0.3.0     readr_1.3.1     tidyr_0.8.2     tibble_2.0.1    ggplot2_3.1.0   tidyverse_1.2.1 magrittr_1.5   

loaded via a namespace (and not attached):
 [1] zoo_1.8-4         tidyselect_0.2.5  urca_1.3-0        aTSA_3.1.2        haven_2.0.0       lattice_0.20-38   colorspace_1.4-0  generics_0.0.2    yaml_2.2.0        utf8_1.1.4        rlang_0.3.1       pillar_1.3.1     
[13] withr_2.1.2       glue_1.3.0        forecast_8.5      TTR_0.23-4        modelr_0.1.2      readxl_1.2.0      plyr_1.8.4        quantmod_0.4-13   timeDate_3043.102 munsell_0.5.0     gtable_0.2.0      cellranger_1.1.0 
[25] rvest_0.3.2       tseries_0.10-46   lmtest_0.9-36     parallel_3.5.2    curl_3.3          fansi_0.4.0       broom_0.5.1       xts_0.11-2        Rcpp_1.0.0        scales_1.0.0      backports_1.1.3   jsonlite_1.6     
[37] fracdiff_1.4-2    hms_0.4.2         stringi_1.3.1     grid_3.5.2        cli_1.0.1         quadprog_1.5-5    tools_3.5.2       lazyeval_0.2.1    crayon_1.3.4      pkgconfig_2.0.2   xml2_1.2.0        lubridate_1.7.4 

【问题讨论】:

我无法重现该问题。 我也很困惑;您是否可能正在使用您未提及的包中的arima 函数?因为据我所知,stats::arima 没有 fitted 方法,因此在这两个对象上调用 fitted 会返回 NULL 正如@joran 所说,两者都为我返回NULL 对不起,我已经加载了tidyversepackage,但认为它与问题无关。我将编辑我的问题。 我已经使用 stats::arima 和 stats::fitted 重现了错误 【参考方案1】:

你发现是非标准评估导致的问题,在the technical note关于magrittr管道中简要提到:

magrittr 管道运算符使用非标准评估。他们捕捉 他们的输入并检查他们以确定如何进行。首先一个 函数是从所有单独的右手边产生的 表达式,然后通过应用此函数获得结果 到左侧。对于大多数目的,人们可以忽略微妙的 magrittr 评估的各个方面,但某些函数可能会捕获它们的 调用环境,因此使用运算符将​​不完全 相当于没有管道操作符的“标准调用”。

如果您查看fittedarima 版本的源代码,您会发现您认为call 属性对于方法的操作至关重要:

getAnywhere(fitted.Arima)
A single object matching ‘fitted.Arima’ was found
It was found in the following places
  registered S3 method for fitted from namespace TSA
  namespace:TSA
with value

function (object, ...) 

    fitted = eval(object$call$x) - object$residuals
    fitted

<bytecode: 0x000000001e8ff4d8>
<environment: namespace:TSA>

【讨论】:

关于“某些函数可能会捕获调用环境”,我猜是 arima 在它的行 series &lt;- deparse(substitute(x)) 中执行此操作,而 fitted 只是从捕获中查找 x . @Frank 调用是使用基本函数match.call() 捕获的,fitted.Arima 直接使用它。我实际上不确定保存“系列”的目的是什么,但也许其他地方的另一种方法使用它。

以上是关于R中magrittr和arima的兼容性问题的主要内容,如果未能解决你的问题,请参考以下文章

R中的条件数据框突变与magrittr和dplyr

R:在自编写的包中使用magrittr管道运算符

如何在 R 中使用 Monte Carlo 进行 ARIMA 模拟函数

时间序列预测 - ARIMA/ARIMAX 与 R 中的每日数据

R 版本 3.6 和 4.0 的兼容性?

ARIMA 的 R 和 Stata 之间的主要差异