次のように、計算の前に余分なレベルを削除する必要があります。
> 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
下部には、両方のモデル マトリックスがあります。の 1 つに余分な列があることがわかります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
より理論的な部分では、すべてのレベルがなくてもモデルを構築できます。さて、前に説明しようとしたように、そのモデルは、モデルを構築するときに使用したレベルに対してのみ有効です。新しいレベルに遭遇した場合は、新しいモデルを構築して追加情報を含める必要があります。そうしないと、余分なレベルをデータセットから削除するしかありません。しかし、基本的にそこに含まれていたすべての情報が失われるため、一般的には良い方法とは見なされません。