您可以尝试通过正确设置级别来避免此问题。看看以下非常愚蠢的例子:
set.seed(106)
thedata <- data.frame(
y = rnorm(100),
x = factor(sample(letters[1:3],100,TRUE))
)
head(model.matrix(y~x, data = thedata))
thetrain <- thedata[1:7,]
length(unique(thetrain$x))
head(model.matrix(y~x, data = thetrain))
我用 ax 和 ay 变量制作了一个数据集,x 是一个具有 3 个级别的因子。训练数据集只有 2 个级别的 x,但模型矩阵仍然构造正确。那是因为 R 保留了原始数据集的级别数据:
> levels(thetrain$x)
[1] "a" "b" "c"
当您的训练集以某种方式使用例如函数data.frame()
或任何其他丢弃levels
因子信息的方法构建时,就会出现问题。
尝试以下操作:
thetrain$x <- factor(thetrain$x) # erases the levels
levels(thetrain$x)
head(model.matrix(y~x, data = thetrain))
您在第二行中看到级别“b”已被删除,因此模型矩阵不再是您想要的。因此,请确保您的训练数据集中的所有因素实际上都具有所有级别,例如:
thetrain$x <- factor(thetrain$x, levels = c("a","b","c"))
附带说明:如果您使用model.frame()
or自己构建模型矩阵model.matrix()
,则该参数xlev
可能会有所帮助:
thetrain$x <- factor(thetrain$x) # erases the levels
levels(thetrain$x)
head(model.matrix(y~x, data = thetrain,
xlev = list(x = c('a','b','c'))))
请注意,此xlev
参数实际上来自model.frame
,并且model.matrix
并非model.frame
在每种情况下都调用。因此,不能保证该解决方案始终有效,但它应该适用于数据帧。