Как рассчитать перекрестную проверку R2 по регрессии LASSO? - PullRequest
0 голосов
/ 08 июня 2018

Я использую этот код для подгонки модели с использованием регрессии LASSO.

library(glmnet)
IV1 <- data.frame(IV1 = rnorm(100))
IV2 <- data.frame(IV2 = rnorm(100))
IV3 <- data.frame(IV3 = rnorm(100))
IV4 <- data.frame(IV4 = rnorm(100))
IV5 <- data.frame(IV5 = rnorm(100))
DV <- data.frame(DV = rnorm(100))

data<-data.frame(IV1,IV2,IV3,IV4,IV5,DV)

x <-model.matrix(DV~.-IV5 , data)[,-1]
y <- data$DV

AB<-glmnet(x=x, y=y, alpha=1)
plot(AB,xvar="lambda")

lambdas = NULL
for (i in 1:100)
{
  fit <- cv.glmnet(x,y)
  errors = data.frame(fit$lambda,fit$cvm)
  lambdas <- rbind(lambdas,errors)
}

lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)


bestindex = which(lambdas[2]==min(lambdas[2]))
bestlambda = lambdas[bestindex,1]


fit <- glmnet(x,y,lambda=bestlambda)

Я хотел бы рассчитать некоторый тип R2, используя данные обучения.Я предполагаю, что один из способов сделать это - использовать перекрестную проверку, которую я выполнил при выборе лямбды.Исходя из этого поста кажется, что это можно сделать с помощью

r2<-max(1-fit$cvm/var(y))

Однако, когда я запускаю это, я получаю эту ошибку:

Warning message:
In max(1 - fit$cvm/var(y)) :
no non-missing arguments to max; returning -Inf

МожетКто-нибудь указывает мне правильное направление?Это лучший способ вычислить R2 на основе данных обучения?

1 Ответ

0 голосов
/ 08 июня 2018

Функция glmnet не возвращает cvm в результате при подгонке

?glmnet

Что вы хотите сделать, это использовать cv.glmnet

?cv.glmnet 

Следующие работы (обратите внимание, вы должныукажите более 1 лямбды или дайте ей понять)

fit <- cv.glmnet(x,y,lambda=lambdas[,1])

r2<-max(1-fit$cvm/var(y))

Я не уверен, что понимаю, что вы пытаетесь сделать.Может быть, сделать это?

for (i in 1:100)
{
  fit <- cv.glmnet(x,y)
  errors = data.frame(fit$lambda,fit$cvm)
  lambdas <- rbind(lambdas,errors)
  r2[i]<-max(1-fit$cvm/var(y))
}

lambdas <- aggregate(lambdas[, 2], list(lambdas$fit.lambda), mean)


bestindex = which(lambdas[2]==min(lambdas[2]))
bestlambda = lambdas[bestindex,1]
r2[bestindex]
...