我一直在尝试使用 R 包“biglasso”来处理高维数据。但是,我得到的结果与我从“hdm”或“glmnet”获得的 LASSO 函数的结果不匹配。 biglasso 的文档也很差。
在下面的示例中,hdm 和 glmnet 的结果非常接近,但不准确,这是预期的。然而,biglasso 并没有放弃“分享”变量。我已经尝试了所有不同的屏幕设置,但没有什么区别。关于如何让 bigglasso 与其他人更加一致有什么想法吗?谢谢!
编辑:对于给定的 lambda 值,结果非常相似。但每种方法似乎都会选择不同的 lambda ......这对于 hdm 来说是有意义的,因为它是用于因果推理并且不关心样本外预测。 hdm 使用与 Belloni 等人不同的目标函数。 (2012),但我不确定为什么 cv.biglasso 和 cv.glmnet 会有如此大的差异。如果我在没有筛选规则的情况下运行 bigglasso,他们应该仅通过 CV 折叠中的随机差异来最大化相同的目标函数,不是吗?
编辑2:我编辑了下面的代码以包含F.Privé的代码,以使glmnet使用类似于biglasso的算法,以及一些使biglasso模仿glmnet的附加代码。
##########
## PREP ##
##########
## Load required libraries
library(hdm)
library(biglasso)
library(glmnet)
## Read automobile dataset
data(BLP)
df <- BLP[[1]]
## Extract outcome
Y <- scale(df$mpg)
## Rescale variables
df$price <- scale(df$price)
df$mpd <- scale(df$mpd)
df$space <- scale(df$space)
df$hpwt <- scale(df$hpwt)
df$outshr <- scale(df$outshr)
## Limit to variables I want
df <- df[,names(df) %in% c("price","mpd","space","hpwt","share","outshr","air")]
## Convert to matrix
df.mat <- data.matrix(df)
df.bm <- as.big.matrix(df.mat)
#########
## HDM ##
#########
## Set seed for reproducibility
set.seed(1233)
## Run LASSO
fit.hdm <- rlasso(x=df.mat, y=Y, post=FALSE, intercept=TRUE)
## Check results
coef(fit.hdm)
############
## GLMNET ##
############
## Set seed for reproducibility
set.seed(1233)
## LASSO with 10-fold cross-validation
fit.glmnet <- cv.glmnet(df.mat, Y, alpha=1, family="gaussian")
## Check default results
coef(fit.glmnet)
## Try to mimic results of biglasso
coef(fit.glmnet, s = "lambda.min")
##############
## BIGLASSO ##
##############
## LASSO with 10-fold cross-validation
fit.bl <- cv.biglasso(df.bm, Y, penalty="lasso", eval.metric="default",
family="gaussian", screen="None",
seed=1233, nfolds=10)
## Check default results
coef(fit.bl)
## Try to mimic results of glmnet
## Calculate threshold for CV error (minimum + 1 standard error)
thresh <- min(fit.bl$cve) + sd(fit.bl$cve)/sqrt(100)
## Identify highest lambda with CVE at or below threshold
max.lambda <- max(fit.bl$lambda[fit.bl$cve <= thresh])
## Check results for the given lambda
coef(fit.bl$fit)[,which(fit.bl$fit$lambda==max.lambda)]