проблема совместимости magrittr и арима в R - PullRequest
4 голосов
/ 26 марта 2019

рассмотрим следующий пример:

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 

1 Ответ

6 голосов
/ 26 марта 2019

То, что вы определили, является проблемой, вызванной нестандартной оценкой, которая кратко упоминается в техническом примечании о magrittr канале:

Магистр трубных операторов использует нестандартную оценку. Они захватывают их вклад и исследует их, чтобы выяснить, как действовать. Первый функция производится со всех отдельных правой стороны выражений, а затем результат получается путем применения этой функции на левой стороне. Для большинства целей можно пренебречь тонким аспекты оценки magrittr, но некоторые функции могут захватить их вызывающая среда, и, следовательно, с использованием операторов не будет точно эквивалентно «стандартному вызову» без pipe-операторов.

Если вы посмотрите на источник arima версии fitted, вы увидите, что вы были правы, считая, что атрибут 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>
...