一些建模功能,例如glmnet(),要求(或仅允许)将数据作为预测器矩阵和响应矩阵(或向量)传递,如使用公式所示。在这些情况下,通常情况是该predict()方法(例如predict.glmnet())要求newdata参数提供一个预测器矩阵,该矩阵具有与训练模型相同的特征。
当数据框具有因子(R的分类数据类型)时,创建预测变量矩阵的便捷方法是使用该model.matrix()函数,该函数会自动为分类变量创建虚拟特征:
# this is the dataframe and matrix I want to use to train the model
set.seed(1)
df <- data.frame(x1 = factor(sample(LETTERS[1:5], replace = T, 20)),
x2 = rnorm(20, 100, 5),
x3 = factor(sample(c("U","L"), replace = T, 20)),
y = rnorm(20, 10, 2))
mm <- model.matrix(y~., data = df)
Run Code Online (Sandbox Code Playgroud)
但是,当我引入一个带有新观察结果的数据框时,它仅包含原始数据框中因子水平的一个子集,model.matrix()(可预测地)返回一个具有不同虚拟特征的矩阵。无法使用此新矩阵,predict.glm()因为它没有模型期望的相同功能:
# this is the dataframe and matrix I want to predict on
set.seed(1) …Run Code Online (Sandbox Code Playgroud)