Ошибка в контрастах: группа по фактору и оператор минус в формуле () перестают работать - PullRequest
0 голосов
/ 22 февраля 2019

Ошибка возникает при использовании group_by() для коэффициента, хотя впоследствии этот коэффициент удаляется из модели с помощью оператора минус (-) .Мой мотивирующий пример:

library(tidyverse)
df = mtcars %>% mutate(am = factor(am))
fits = df %>%
  group_by(am) %>%
  do(fit = lm(formula(mpg ~ . - am), .)) # Returns the error

Что выдает следующее сообщение об ошибке:

Ошибка в `контрастах <-` (` <em>tmp `, значение = contr.funs [1 + isOF [nn]]): контрасты могут применяться только к факторам с 2 или более уровнями

Я получаю ту же ошибку, если I filter() вместо группы:

fit_am0 = df %>% 
  filter(am == 0) %>%
  lm(formula(mpg ~ . - am), .) # Returns the error

Как будто функция formula() неправильно определяет оператор минуса (- am), когда переменная, которую я пытаюсь удалить, является фактором, то есть комбинацией двух.Это мое предположение, так как следующие примеры работают без ошибок:

fits = mtcars %>% # `am` is numeric
  group_by(am) %>%
  do(fit = lm(formula(mpg ~ . - am), .)) # No error
fit_am0 = df %>%
  filter(am == 0) %>%
  select(-am) %>% # `am` removed prior to running model
  lm(formula(mpg ~ .), .) # No error
fits2 = mtcars %>% 
  mutate(vs = factor(vs)) %>% # A non-grouped factor, later removed
  group_by(am) %>%
  do(fit = lm(formula(mpg ~ . - vs), .)) # No error

Это ошибка?Или я допустил ошибку в своем мотивирующем примере?

1 Ответ

0 голосов
/ 22 февраля 2019

Я нашел решение.Удалите коэффициент в параметре данных вместо параметра формулы, например lm(formula = formula(mpg ~ .), data = select(., -am)).

library(tidyverse)
df = mtcars %>% mutate(am = factor(am))
fits = df %>%
  group_by(am) %>%
  do(fit = lm(
    formula(mpg ~ .), 
    select(., -am)
  )) # No error
...