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
对象y1
和y2
几乎相同,唯一的例外是插槽call
和series
。所以我想这就是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
对不起,我已经加载了tidyverse
package,但认为它与问题无关。我将编辑我的问题。
我已经使用 stats::arima 和 stats::fitted 重现了错误
【参考方案1】:
你发现是非标准评估导致的问题,在the technical note关于magrittr
管道中简要提到:
magrittr 管道运算符使用非标准评估。他们捕捉 他们的输入并检查他们以确定如何进行。首先一个 函数是从所有单独的右手边产生的 表达式,然后通过应用此函数获得结果 到左侧。对于大多数目的,人们可以忽略微妙的 magrittr 评估的各个方面,但某些函数可能会捕获它们的 调用环境,因此使用运算符将不完全 相当于没有管道操作符的“标准调用”。
如果您查看fitted
的arima
版本的源代码,您会发现您认为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 <- deparse(substitute(x))
中执行此操作,而 fitted
只是从捕获中查找 x
.
@Frank 调用是使用基本函数match.call()
捕获的,fitted.Arima
直接使用它。我实际上不确定保存“系列”的目的是什么,但也许其他地方的另一种方法使用它。以上是关于R中magrittr和arima的兼容性问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 R 中使用 Monte Carlo 进行 ARIMA 模拟函数