predict.glmnet:有些因素只有在新数据一个级别(predict.glmnet: Some

2019-11-05 03:06发布

我已经使用glmnet R中训练有素的弹性网模型,并想用它来作出预测掀起了新的数据集。

但是我在生产中的预测()方法的参数使用,因为在新的数据只设置我的一些因素的变量(表示合并症的存在虚拟变量)一个级别(从未被观察到的合并症矩阵麻烦),这意味着我不能使用

model.matrix(RESPONSE〜。,NEW_DATA)

因为它给我的(预期)

误差在contrasts<- *tmp* ,值= contr.funs [1 + ISOF [NN]]):对比度可以仅用于有2级或更多的水平的因素

我在为如何解决这个问题的损失。 是否有R A方式,我可以构建一个合适的基质在使用预测()在这种情况下,还是需要准备的R外基质? 在任何情况下,我怎么可能去这样做呢?

这里是再现我有问题的玩具例子:

x1 <- rnorm(100)
x2 <- as.factor(rbinom(100, 1, 0.6))
x3 <- as.factor(rbinom(100, 1, 0.4))
y <- rbinom(100, 1, 0.2)

toy_data <- data.frame(x1, x2, x3, y)
colnames(toy_data) = c("Continuous", "FactorA", "FactorB", "Outcome")

mat1 <- model.matrix(Outcome ~ ., toy_data)[,-1]
y1 <- toy_data$Outcome

new_data <- toy_data
new_data$FactorB <- as.factor(0)

#summary(new_data) # Just to verify that FactorB now only contains one level

mat2 <- model.matrix(Outcome ~ ., new_data)[,-1]

Answer 1:

您可以设置levels的数据集相匹配的levels在您的示例完整的数据集。 一个因素可以具有存在于该值levels即使当值不存在于该变量。

你可以用做这个levels的参数factor()

new_data$FactorB <- factor(0, levels = levels(toy_data$FactorB))

或使用levels()函数分配:

levels(new_data$FactorB) <- levels(toy_data$FactorB)

使用这两种方法, model.matrix()正常工作,一旦你有一个以上的水平:

head( model.matrix(Outcome ~ ., new_data)[,-1] )
   Continuous FactorA1 FactorB1
1 -1.91632972        0        0
2  1.11411267        0        0
3 -1.21333837        1        0
4 -0.06311276        0        0
5  1.31599915        0        0
6  0.36374591        1        0


文章来源: predict.glmnet: Some Factors Have Only One Level in New Data