0

我有一个 cv.glmnet 用于预测新数据。在为要使用 cv.glmnet 对象预测的新数据创建模型矩阵时遇到问题。我需要阻止引导测试数据并预测所有样本的响应。当在某些样本中,某些分类变量只有一个级别时,就会出现问题。然后在创建模型矩阵时出现错误。这是一个例子。

library(splines)
library(caret)
library(glmnet)

data(iris)
Inx <- sample(nrow(iris),100)
iris$Species <- factor(iris$Species)

train_data <- iris[Inx, ]
test_data <- iris[-Inx,]

Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + Species:Petal.Width + Sepal.Width:Petal.Length +  Species +  bs(Petal.Width, df = 2, degree = 2)"
ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T, sep = ""), train_data)
y = train_data[,"Sepal.Length"]

cvglm <- cv.glmnet(x = ModelMatrix,y = train_data$Sepal.Length,nfolds = 4, 
                   keep = TRUE, alpha = 1, parallel = F, type.measure = 'mse')
test_data$Species <- "virginica"
ModelMatrix_test <- predict(caret::dummyVars(Formula, test_data, fullRank = T, sep = ""), test_data)

然后我得到这个错误

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

任何解决问题的建议将不胜感激。

4

1 回答 1

1

错误很简单,因变量test_data只包含一个物种 ( virginica)。因此,不能应用对比。仅当您的因变量(在您的情况下是物种)具有 2 个或更多级别(例如versicolorvirginicasetosaversicolorvirginica)时,才可能计算对比。为此,您可以修改您的sample命令,例如

library(splines)
library(caret)
#> Warning: package 'caret' was built under R version 3.6.2
#> Loading required package: lattice
#> Loading required package: ggplot2
library(glmnet)
#> Warning: package 'glmnet' was built under R version 3.6.2
#> Loading required package: Matrix
#> Loaded glmnet 3.0-2

data(iris)

set.seed(123)
Inx <- sample(nrow(iris), 0.7 * nrow(iris))
iris$Species <- factor(iris$Species)

train_data <- iris[Inx, ]
test_data <- iris[-Inx,]

Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + Species:Petal.Width + Sepal.Width:Petal.Length +  Species +  bs(Petal.Width, df = 2, degree = 2)"
ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T, sep = ""), train_data)
y = train_data[,"Sepal.Length"]

cvglm <- cv.glmnet(x = ModelMatrix,y = train_data$Sepal.Length,nfolds = 4, 
                   keep = TRUE, alpha = 1, parallel = F, type.measure = 'mse')

ModelMatrix_test <- predict(caret::dummyVars(Formula, test_data, fullRank = T, sep = ""), test_data)

最好的做法是将数据划分traintest以这样的方式进行设置,即两个数据集都应该代表原始数据集,这可以通过随机抽样来实现。

reprex 包(v0.3.0)于 2020-04-30 创建

于 2020-04-30T04:50:34.313 回答