1 votos

¿Por qué glmnet da diferentes estimaciones de coeficientes con los mismos datos?

He estado tratando de ajustar un modelo de lazo utilizando cv.glmnet . Intenté aplicar cuatro modelos diferentes (3 utilizando cv.glmnet y 1 utilizando caret::train ) basado en la normalización. Los cuatro modelos dan estimaciones de coeficientes muy diferentes, y no logro entender por qué.

Aquí hay un código totalmente reproducible:

library("glmnet")
data(iris)
iris <- iris
dat <- iris[iris$Species %in% c("setosa","versicolor"),]
X <- as.matrix(dat[,1:4])
Y <- as.factor(as.character(dat$Species))

set.seed(123)
model1 <- cv.glmnet(x = X,
                    y = Y,
                    family = "binomial",
                    standardize = FALSE,
                    alpha = 1,
                    lambda = rev(seq(0,1,length=100)),
                    nfolds = 3)

set.seed(123)
model2 <- cv.glmnet(x = scale(X, center = T, scale = T),
                    y = Y,
                    family = "binomial",
                    standardize = FALSE,
                    alpha = 1,
                    lambda = rev(seq(0,1,length=100)),
                    nfolds = 3)
set.seed(123)
model3 <- cv.glmnet(x = X,
                    y = Y,
                    family = "binomial",
                    standardize = TRUE,
                    alpha = 1,
                    lambda = rev(seq(0,1,length=100)),
                    nfolds = 3)

##Using caret
library("caret")

lambda.grid <- rev(seq(0,1,length=100)) #set of lambda values for cross-validation
alpha.grid <- 1 #alpha
trainControl <- trainControl(method ="cv",
                             number=3) #3-fold cross-validation
tuneGrid <- expand.grid(.alpha=alpha.grid, .lambda=lambda.grid) #these are tuning parameters to be passed into the train function below

set.seed(123)
model4 <- train(x = X,
                y = Y,
                method="glmnet",
                family="binomial",
                standardize = FALSE,
                trControl = trainControl,                          
                tuneGrid = tuneGrid)

c1 <- coef(model1, s=model1$lambda.min)
c2 <- coef(model2, s=model2$lambda.min)
c3 <- coef(model3, s=model3$lambda.min)
c4 <- coef(model4$finalModel, s=model4$finalModel$lambdaOpt)
c1 <- as.matrix(c1)
c2 <- as.matrix(c2)
c3 <- as.matrix(c3)
c4 <- as.matrix(c4)

model2 escala las variables independientes (vector X ) de antemano y model3 lo hace fijando standardize = TRUE . Así que al menos estos dos modelos deberían dar resultados idénticos, pero no es así.

Los lambda.min obtenidos de los cuatro modelos son modelo1 = 0 modelo2 = 0 modelo3 = 0 modelo4 = 0,6565657

Las estimaciones de los coeficientes entre los modelos también difieren drásticamente. ¿Por qué ocurre esto?

2voto

Sean Johnson Puntos 407

Puede que encuentres esto enlace útil.

Esencialmente

  • c1 son los coeficientes de los datos no estandarizados (en las unidades originales de los datos)
  • c2 son coeficientes para datos estandarizados (en unidades de puntuación z unidades)
  • c3 son coeficientes para datos estandarizados (en unidades originales de los datos)
  • c4 se debe a este

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X