Вы должны удалить дополнительные уровни перед любым вычислением, например:
> id <- which(!(foo.new$predictor %in% levels(foo$predictor)))
> foo.new$predictor[id] <- NA
> predict(model,newdata=foo.new)
1 2 3 4
-0.1676941 -0.6454521 0.4524391 NA
Это более общий способ, он установит все уровни, которые не встречаются в исходных данных, в NA,Как упомянул Хэдли в комментариях, они могли бы включить это в функцию predict()
, но они не
Почему это нужно сделать, становится очевидным, если вы посмотрите на сам расчет.Внутренне прогнозы рассчитываются следующим образом:
model.matrix(~predictor,data=foo) %*% coef(model)
[,1]
1 -0.1676941
2 -0.6454521
3 0.4524391
Внизу у вас есть обе матрицы моделей.Вы видите, что у foo.new
есть дополнительный столбец, поэтому вы больше не можете использовать матричный расчет.Если вы будете использовать новый набор данных для моделирования, вы также получите другую модель, представляющую собой дополнительную фиктивную переменную для дополнительного уровня.
> model.matrix(~predictor,data=foo)
(Intercept) predictorB predictorC
1 1 0 0
2 1 1 0
3 1 0 1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$predictor
[1] "contr.treatment"
> model.matrix(~predictor,data=foo.new)
(Intercept) predictorB predictorC predictorD
1 1 0 0 0
2 1 1 0 0
3 1 0 1 0
4 1 0 0 1
attr(,"assign")
[1] 0 1 1 1
attr(,"contrasts")
attr(,"contrasts")$predictor
[1] "contr.treatment"
Вы не можете просто удалить последний столбец изМатрица модели тоже, потому что, даже если вы сделаете это, оба других уровня все еще влияют.Код для уровня A
будет (0,0).Для B
это (1,0), для C
это (0,1) ... и для D
это снова (0,0)!Таким образом, ваша модель предполагает, что A
и D
- это один и тот же уровень, если она наивно опускает последнюю фиктивную переменную.
С более теоретической точки зрения: можно построить модель безуровни.Теперь, как я пытался объяснить ранее, эта модель только действительна для уровней, которые вы использовали при построении модели.Если вы сталкиваетесь с новыми уровнями, вы должны создать новую модель, включающую дополнительную информацию.Если вы этого не сделаете, единственное, что вы можете сделать, - это удалить дополнительные уровни из набора данных.Но тогда вы в основном теряете всю информацию, которая содержалась в нем, поэтому это обычно не считается хорошей практикой.