我的理解是,glmnet採用矩陣,其中每列是解釋變量。估算glmnet中的許多交互項
我有〜10個解釋性變量(其中一些是因子)
如何可能需要式如Y〜(X1 * X2 * X3)+(X4 *×5)+ 5233和一個數據幀估計這個使用glmnet?
我相信我將不得不創建一個矩陣,其中每個交互項都有自己的列,但我不知道如何簡單地獲取輸入的公式和變量(其中一些是因子)並獲得輸出矩陣I可以很容易地進入glmnet。
我的理解是,glmnet採用矩陣,其中每列是解釋變量。估算glmnet中的許多交互項
我有〜10個解釋性變量(其中一些是因子)
如何可能需要式如Y〜(X1 * X2 * X3)+(X4 *×5)+ 5233和一個數據幀估計這個使用glmnet?
我相信我將不得不創建一個矩陣,其中每個交互項都有自己的列,但我不知道如何簡單地獲取輸入的公式和變量(其中一些是因子)並獲得輸出矩陣I可以很容易地進入glmnet。
假設您需要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'作爲對象名稱(這是一個基本功能)。否則,很好的答案。 – 2016-11-21 14:39:15
@ catastrophic-failure謝謝,全部完成。 – sieste 2016-11-21 21:50:28
我想你'尋找'?model.matrix' ... – 2013-04-30 15:05:03
感謝Ben,?model.matrix正是我所需要的:P – 2013-04-30 15:40:17