Eu não acho que você cometeu um erro no código. É uma questão de interpretar a saída.
O Lasso não indica quais regressores individuais são "mais preditivos" que outros. Ele simplesmente tem uma tendência interna de estimar coeficientes como zero. Quanto maior o coeficiente de penalidade , maior é essa tendência.registro( λ )
Seu gráfico de validação cruzada mostra que, à medida que mais e mais coeficientes são forçados a zero, o modelo realiza um trabalho cada vez melhor de prever subconjuntos de valores que foram removidos aleatoriamente do conjunto de dados. Quando os melhores erros de previsão com validação cruzada (medidos como o "Desvio Binomial" aqui) são alcançados quando todos os coeficientes são zero, você deve suspeitar que nenhuma combinação linear de qualquer subconjunto dos regressores possa ser útil para prever os resultados.
Você pode verificar isso gerando respostas aleatórias que são independentes de todos os regressores e aplicando seu procedimento de ajuste a eles. Aqui está uma maneira rápida de emular seu conjunto de dados:
n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
dimnames=list(1:n, c("y", paste0("x", 1:k)))))
O quadro de dados X
possui uma coluna binária aleatória chamada "y" e 338 outras colunas binárias (cujos nomes não importam). Usei sua abordagem para regredir "y" contra essas variáveis, mas - apenas para ter cuidado - verifiquei se o vetor de resposta y
e a matriz do modelo x
eram compatíveis (o que eles podem não fazer caso haja algum valor faltante nos dados) :
f <- y ~ . - 1 # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")
O resultado é notavelmente semelhante ao seu:
plot(fit)
De fato, com esses dados completamente aleatórios, o Lasso ainda retorna nove estimativas de coeficientes diferentes de zero (embora saibamos, por construção, que os valores corretos são zero). Mas não devemos esperar perfeição. Além disso, como o ajuste é baseado na remoção aleatória de subconjuntos de dados para validação cruzada, normalmente você não obterá a mesma saída de uma execução para a seguinte. Neste exemplo, uma segunda chamada cv.glmnet
produz um ajuste com apenas um coeficiente diferente de zero. Por esse motivo, se você tiver tempo, é sempre uma boa idéia executar novamente o procedimento de ajuste várias vezes e acompanhar quais estimativas de coeficiente são consistentemente diferentes de zero. Para esses dados - com centenas de regressores -, levará alguns minutos para repetir mais nove vezes.
sim <- cbind(as.numeric(coef(fit)),
replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025),
xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
main="Results of Repeated Cross-Validated Lasso Fits")
Oito desses regressores têm estimativas diferentes de zero em cerca de metade dos ajustes; o resto deles nunca tem estimativas diferentes de zero. Isso mostra até que ponto o Lasso ainda incluirá estimativas de coeficientes diferentes de zero, mesmo quando os coeficientes em si forem realmente zero.