在glmnet中估计多个交互项

9
我了解到glmnet使用列为解释变量的矩阵。您有一个包含约10个解释变量(其中一些是因子)的数据框。
如果要使用glmnet估算如y~(x1*x2*x3)+(x4*x5)+x6这样的公式,则需要创建一个矩阵,其中每个交互项都有自己的列,但我不知道如何简单地将公式和变量(其中一些是因子)输入并获得输出的矩阵,以便能够轻松地放入glmnet中。

5
我认为你正在寻找 ?model.matrix 的内容... - Ben Bolker
谢谢Ben,model.matrix正是我所需要的:P - Will Beauchamp
1个回答

18
假设您需要一个模型,形式为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

在模型中使用了两次(Intercept)。在公式(... + 0)中添加一个无截距项。此外,避免将对象命名为df(它是一个基本函数)。其他方面,答案不错。 - catastrophic-failure

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接