【问题标题】:Estimating many interaction terms in glmnet在 glmnet 中估计许多交互项
【发布时间】:2013-04-24 08:57:32
【问题描述】:

据我了解,glmnet 采用矩阵,其中每列都是解释变量。

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

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

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

【问题讨论】:

  • 我想你在找?model.matrix ...
  • 感谢 Ben,?model.matrix 正是我所需要的:P

标签: r formula glmnet


【解决方案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

【讨论】:

  • 您以这种方式在模型中包含(Intercept) 两次。在公式中添加无截距 (... + 0)。另外,避免将df 作为对象名称(它是一个基本函数)。否则,很好的答案。
猜你喜欢
  • 2018-12-03
  • 2018-10-27
  • 2016-01-20
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多