Создание матрицы моделей для прогнозирования новых данных с использованием объекта cv.gl mnet в R - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть cv.gl mnet для прогнозирования новых данных. У меня возникла проблема при создании матрицы моделей для прогнозирования новых данных с использованием объекта cv.gl mnet. Мне нужно заблокировать bootstrap тестовые данные и предсказать ответ для всех образцов. Проблема возникает, когда в некоторых примерах некоторые из категориальных переменных имеют только один уровень. Тогда я получаю ошибку при создании модели матрицы. Вот пример.

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)

Тогда я получаю эту ошибку

Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) : 
  contrasts can be applied only to factors with 2 or more levels

Буду признателен за любые предложения по решению проблемы.

1 Ответ

0 голосов
/ 30 апреля 2020

Ошибка очень проста, зависимая переменная в test_data содержит только один вид (virginica). Таким образом, контрасты не могут быть применены. Расчет контрастов возможен только тогда, когда ваша зависимая переменная (в вашем случае это вид) имеет 2 или более уровней (например, versicolor и virginica или setosa, versicolor и virginica). Чтобы добиться этого, вы можете изменить команду 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)

. Лучше всегда разделять данные в наборах train и test таким образом, чтобы оба набора данных представляли исходный набор данных, который может быть получен путем случайной выборки.

Создан в 2020-04-30 пакетом Представить (v0.3.0)

...