Оценка многих условий взаимодействия в glmnet

Насколько я понимаю, glmnet принимает матрицы, в которых каждый столбец является независимой переменной.

У меня есть кадр данных с ~ 10 поясняющими переменными (некоторые из которых являются факторами)

Как я мог взять такую ​​формулу, как y~(x1*x2*x3)+(x4*x5)+x6, и оценить ее с помощью glmnet?

Я полагаю, что мне придется создать матрицу, в которой каждый термин взаимодействия имеет свой собственный столбец, но я понятия не имею, как просто взять на вход формулу и переменные (некоторые из которых являются факторами) и получить на выходе матрицу, которую я могу легко поместить в глмнет.


person Will Beauchamp    schedule 30.04.2013    source источник
comment
Я думаю, вы ищете ?model.matrix ...   -  person Ben Bolker    schedule 30.04.2013
comment
спасибо Бен, ?model.matrix именно то, что мне было нужно :P   -  person Will Beauchamp    schedule 30.04.2013


Ответы (1)


Предположим, вам нужна модель формы y = b0 + b1*x1*x2 + b2*x3 + noise, где целевая переменная y и все независимые переменные x1, x2, x3 хранятся в одном фрейме данных. ...

Редактировать: Спасибо @BenBolker за подсказку model.matrix.

Используя model.matrix, следующий код обеспечивает решение:

library(glmnet)

# the original data frame and formula
set.seed(23)
dat <- data.frame(y=runif(5), x1=runif(5), x2=runif(5), x3=runif(5))
f <- as.formula(y~x1:x2+x3+0)
# no intercept here ('+0') because glmnet adds intercept by default

# transform dataframe to matrices as required by glmnet
x <- model.matrix(f, dat)
y <- as.matrix(dat$y, ncol=1)

# fit glmnet model with penalty parameter 0.001
g <- glmnet(x, y, lambda=0.001)
print(coef(g))
#   3 x 1 sparse Matrix of class "dgCMatrix"
#                   s0
# (Intercept) 0.3506450
# x3          0.2308045
# x1:x2       0.1016138

Только для полноты, вот мой исходный ответ без использования model.matrix, что требует небольшого ручного вмешательства:

library(glmnet)

# the original data frame
set.seed(23)
dat <- data.frame(y=runif(5), x1=runif(5), x2=runif(5), x3=runif(5))

# transform dataframe to matrices as required by glmnet
x <- with(dat, as.matrix(cbind("x1*x2"=x1*x2, "x3"=x3)))
y <- with(dat, as.matrix(y, ncol=1))

# fit glmnet model with penalty parameter 0.001
g <- glmnet(x, y, lambda=0.001)
print(coef(g))
#   3 x 1 sparse Matrix of class "dgCMatrix"
#                   s0
# (Intercept) 0.3506450
# x1*x2       0.1016137
# x3          0.2308045
person sieste    schedule 30.04.2013
comment
Таким образом, вы дважды включаете (Intercept) в модель. Добавьте к формуле знак отсутствия перехвата (... + 0). Кроме того, избегайте df в качестве имени объекта (это базовая функция). В противном случае, хороший ответ. - person catastrophic-failure; 21.11.2016