Создание различных коэффициентов с помощью glmnet () - PullRequest
0 голосов
/ 28 июня 2019

Я подгоняю модель регрессии лассо, используя пакет glmnet(). Вот некоторая информация о моих данных:

the_data - это фрейм данных с 62 строками и столбцами 2001 года. Последний столбец - это ответ resp. Столбцы обозначены G(column number), поэтому, например, G120 - это 120-й столбец.

Вот код, который я использовал, чтобы соответствовать модели лассо:

> library(glmnet)
> x = model.matrix(resp ~ ., data = the_data)[,-1]
> y = the_data$resp
> grid = 10^seq(10, -2, length = 100)

# making the training and test sets, and fitting the lasso mod
> set.seed(1)
> train = sort(sample(1:nrow(the_data), nrow(the_data)/2))
> test = (1:nrow(the_data))[-train]
> lasso_mod = glmnet(x[train,], as.factor(y[train]), alpha = 1, lambda = grid, 
                     family = "binomial")

# choosing the optimal lambda using cross-validation
> set.seed(1)
> cv_out = cv.glmnet(x[train,], as.factor(y[train]), alpha = 1, family = "binomial")
> best_lambda = cv_out$lambda.min

# fitting the lasso with the optimal lambda
> best_lasso_mod = glmnet(x[train,], as.factor(y[train]), alpha = 1, 
                          lambda = best_lambda, family = "binomial")

Теперь у меня есть два разных метода получения ненулевых коэффициентов с помощью команды coef.glmnet():

# method 1
> best_coef_1 = coef(lasso_mod, s = best_lambda)

# method 2
> best_coef_2 = coef(best_lasso_mod)

Два метода дают похожие, но разные, ненулевые коэффициенты.

# nonzero coefficients from method 1
> rownames(best_coef_1[best_coef_1[, 1] != 0, 0])[-1]
[1] "G258"  "G281"  "G698"  "G822"  "G1153" "G1346" "G1423" "G1582" "G1870"
[10] "G1899"

# nonzero coefficients from method 2
> rownames(best_coef_2[best_coef_2[, 1] != 0, 0])[-1]
[1] "G249"  "G258"  "G281"  "G698"  "G822"  "G1153" "G1423" "G1582" "G1870"

Первый метод дает 10 ненулевых коэффициентов, а второй - 9. Почему они отличаются?

Вот график коэффициентов для модели с выделением оптимального значения лямбда.

> plot(lasso_mod, xvar = "lambda", las = 1, xlim = c(-4, -1))
> abline(v = log(best_lambda), col = "black", lty = 2)

enter image description here

Может быть, это трудно увидеть, поэтому я пошел и выделил все линии, которые отличались от нуля в точке оптимальной лямбды, и их было 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...