9

glmnet は、各列が説明変数である行列を取ることを理解しています。

〜10個の説明変数を持つデータフレームがあります(そのうちのいくつかは要因です)

y~(x1*x2*x3)+(x4*x5)+x6 などの式を取得し、glmnet を使用してこれを推定するにはどうすればよいですか?

各相互作用項が独自の列を持つマトリックスを作成する必要があると思いますが、入力を式と変数(一部は因子)から取得し、簡単に入力できるマトリックスを出力する方法がわかりませんglmnet。

4

1 に答える 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
于 2013-04-30T15:01:02.303 に答える