我一直在试验R包'biglasso'来获取高维数据。但是,我得到的结果与我从"hdm"或"glmnet"获得的LASSO函数的结果不匹配。biglasso的文档也非常差。
在下面的示例中,hdm 和 glmnet 的结果非常接近,但并不精确,这是意料之中的。但是,biglasso不会删除"share"变量。我已经尝试了所有不同的屏幕设置,但没有区别。关于如何让 biglasso 与其他人更加一致的任何想法?谢谢!
编辑:对于给定的lambda值,结果非常相似。但是每种方法似乎都选择了不同的lambda。这对于HDM来说是有意义的,因为它用于因果推理,而不涉及样本外预测。hdm使用与Belloni et al. (2012(不同的目标函数,但我不确定为什么cv.biglasso和cv.glmnet会有很大的不同。如果我在没有筛选规则的情况下运行 biglasso,它们应该仅通过 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)]
在 CV 之后选择"最佳"lambda 基本上有两种方法:
-
最小化CV错误的那个(默认值为{biglasso}(
-
CV 误差低于最小 + 1 标准误差(默认值为 {glmnet}(的最简洁(最高 lambda(的那个。
尝试coef(fit.glmnet, s = "lambda.min")
使用最小值。
此外,为了确保可重复性,请尝试设置 CV 折叠而不是一些种子。glmnet()
中有参数foldid
,biglasso()
中有cv.ind
参数。