估计glmnet中的许多交互术语

时间:2013-04-30 12:27:01

标签: r formula glmnet

据我所知,glmnet采用矩阵,其中每列是一个解释变量。

我有一个包含~10个解释变量(其中一些是因子)的数据框

如何使用y~(x1 * x2 * x3)+(x4 * x5)+ x6这样的公式并使用glmnet进行估算?

我相信我必须创建一个矩阵,其中每个交互项都有自己的列,但我不知道如何简单地将输入公式和变量(其中一些是因子),并获得输出矩阵我可以容易投入glmnet。

1 个答案:

答案 0 :(得分:14)

假设您需要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