【问题标题】:predict.glmnet: Some Factors Have Only One Level in New Datapredict.glmnet:某些因素在新数据中只有一个级别
【发布时间】:2019-01-27 20:56:47
【问题描述】:

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

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

model.matrix(RESPONSE ~ ., new_data)

因为它给了我(预期的)

contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]]) 中的错误: 对比只能应用于具有 2 个或更多级别的因素

我不知道如何解决这个问题。在这种情况下,R 中有没有一种方法可以构造一个合适的矩阵用于 predict() 中,还是我需要在 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]

【问题讨论】:

  • 最好跟踪训练数据集中的所有分类变量。在新数据中,以 model.matrix 的方式更改这些分类(创建虚拟变量)。然后用它来预测。这样做可以让您预测甚至单个记录。
  • 您可以在执行模型矩阵之前设置因子的水平以匹配训练数据中的水平。喜欢levels(new_data$FactorB) &lt;- levels(toy_data$FactorB)
  • @aosmith 这似乎已经解决了这个问题!如果您有时间,请发布作为答案,我会投票/接受。

标签: r logistic-regression glmnet model.matrix


【解决方案1】:

您可以将数据集的 levels 设置为与示例中完整数据集的 levels 匹配。一个因子可以在levels 中存在值,即使该值不存在于变量中。

您可以使用factor() 中的levels 参数来做到这一点:

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

【讨论】:

    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2011-10-04
    • 2017-05-14
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多