Ошибка при использовании метлы (augment) и dplyr с loess fit

Я пытаюсь использовать аугментацию для лессовой посадки, но получаю следующую ошибку:

Error in data.frame(..., check.names = FALSE) : 
  arguments imply differing number of rows: 32, 11

В сообщении об ошибке 11 соответствует количеству наблюдений в одном сегменте, а 32 - общему количеству наблюдений. Код ниже.

require(broom)
require(dplyr)

# This example uses the lm method and it works
regressions <- mtcars %>% group_by(cyl) %>%  do(fit = lm(wt ~ mpg, .))
regressions %>% augment(fit)

# This example uses the loess method and it generates the error
regressions2 <- mtcars %>% group_by(cyl) %>%  do(fit = loess(wt ~ mpg, .))
regressions2 %>% augment(fit)

# The below code appropriately plots the loess fit using geom_smooth. 
# My current # workaround is to do a global definition as an aes object in geom_smooth`
cylc = unique(mtcars$cyl) %>% sort()
for (i in 1:length(cyl)){
  print(i)
  print(cyl[i])
  p<- ggplot(data=filter(mtcars,cyl==cylc[i]),aes(x=mpg,y=wt)) + geom_point() + geom_smooth(method="loess") + ggtitle(str_c("cyl = ",cyl[i]))
  print(p)
}

person Steve    schedule 02.04.2018    source источник


Ответы (1)


Похоже, это проблема, связанная с оператором do(): когда мы проверяем model.frame() на одном из объектов модели LOESS, мы возвращаем все 32 строки, а не подмножество, соответствующее этой модели.

Обходной путь - сохранить данные, а не только модель, и передать это в качестве второго аргумента augment():

regressions2 <- mtcars %>%
  group_by(cyl) %>%
  do(fit = loess(wt ~ mpg, .),
     data = (.)) %>%
   augment(fit, data)

Обычно это рекомендуется в любом случае с augment(), поскольку model.frame() не получает все исходные столбцы.


Между прочим, я поддерживаю broom и обычно больше не рекомендую подход do() (поскольку dplyr в основном отходил от него).

Вместо этого я предлагаю использовать nest() tidyr и map() purrr, как описано в этой главе R4DS. Это немного упрощает хранение данных и их включение в augment().

library(tidyr)
library(purrr)

mtcars %>%
  nest(-cyl) %>%
  mutate(fit = map(data, ~ loess(wt ~ mpg, .))) %>%
  unnest(map2(fit, data, augment))
person David Robinson    schedule 02.04.2018
comment
Спасибо, Дэвид, за подробный ответ. Я прочитал эту главу, и решение было четким и разумным. Вы можете рассмотреть возможность обновления виньетки здесь: cran.r- project.org/web/packages/broom/vignettes/, поскольку именно здесь я использую do (). - person Steve; 04.04.2018
comment
@ Стив, ты совершенно прав! Есть некоторые новые планы и ресурсы для обслуживания метлы, а это значит, что эти обновления, скорее всего, произойдут этим летом. - person David Robinson; 05.04.2018
comment
Потрясающие. В очередной раз благодарим за помощь! - person Steve; 06.04.2018
comment
В качестве воспроизводимого решения добавьте библиотеку (tidyverse), библиотеку (broom). - person Aran; 06.07.2019