predict.glmnet: 一些因子在新数据中只有一个水平
predict.glmnet: Some Factors Have Only One Level in New Data
我已经使用 glmnet 在 R 中训练了一个弹性网络模型,并想用它来对新数据集进行预测。
但是我在生成用作 predict() 方法参数的矩阵时遇到了问题,因为我在新数据集中的一些因子变量(表示存在合并症的虚拟变量)只有一个级别(从未观察到合并症),这意味着我不能使用
model.matrix(RESPONSE ~ ., new_data)
因为它给了我(预期的)
Error in contrasts<-
(*tmp*
, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
我不知道如何解决这个问题。在这种情况下,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]
您可以设置数据集的 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
我已经使用 glmnet 在 R 中训练了一个弹性网络模型,并想用它来对新数据集进行预测。
但是我在生成用作 predict() 方法参数的矩阵时遇到了问题,因为我在新数据集中的一些因子变量(表示存在合并症的虚拟变量)只有一个级别(从未观察到合并症),这意味着我不能使用
model.matrix(RESPONSE ~ ., new_data)
因为它给了我(预期的)
Error in
contrasts<-
(*tmp*
, value = contr.funs[1 + isOF[nn]]) : contrasts can be applied only to factors with 2 or more levels
我不知道如何解决这个问题。在这种情况下,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]
您可以设置数据集的 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