预言.glmnet:某些因素在新数据中只有一个层次

时间:2018-08-21 15:58:27

标签: r logistic-regression glmnet model.matrix

我已经使用glmnet在R中训练了一个弹性网络模型,并希望使用它来根据新数据集进行预测。

但是我在生成矩阵以用作predict()方法中的参数时遇到了麻烦,因为在新数据集中我的某些因子变量(指示合并症的虚拟变量)只有一个级别(合并症)从未观察到),这意味着我无法使用

  

model.matrix(RESPONSE〜。,new_data)

因为它给了我(期望的)

  

CancellationTokencontrasts<-中的错误,值= contr.funs [1 + isOF [nn]]):     对比只能应用于2个或更多级别的因素

我不知所措如何解决这个问题。在这种情况下,R中是否有一种方法可以构造一个合适的矩阵以供predict()使用,还是需要在R之外准备矩阵?无论哪种情况,我该怎么做?

这是一个玩具示例,它再现了我遇到的问题:

*tmp*

1 个答案:

答案 0 :(得分: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