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

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, которая дает такой же результат?

РЕДАКТИРОВАТЬ2: Вышеупомянутая «ошибка» не появляется, если пакет 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 
4
Cettt 26 Мар 2019 в 19:19

1 ответ

Лучший ответ

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

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

Если вы посмотрите на исходный код 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>
6
HFBrowning 26 Мар 2019 в 17:38