我一直在尝试使用R包’biglasso’来处理高维数据。然而,我得到的结果与’hdm’或’glmnet’中的LASSO函数的结果不匹配。biglasso的文档也非常差。
在下面的例子中,hdm和glmnet的结果非常接近但不完全相同,这是可以预期的。然而,biglasso没有删除’share’变量。我尝试了所有不同的筛选设置,但没有任何效果。有什么办法可以让biglasso的结果与其他方法更加一致吗?谢谢!
编辑:对于给定的lambda值,结果非常相似。但每种方法似乎选择了不同的lambda..对于hdm来说,这是可以理解的,因为它旨在进行因果推断,并不关心样本外预测。hdm使用了Belloni等人(2012年)的不同目标函数,但我不知道为什么cv.biglasso和cv.glmnet会有如此大的差异。如果我不使用筛选规则运行biglasso,它们应该是在最大化相同的目标函数,只是CV折叠中有随机差异,对吗?
编辑2:我已经编辑了下面的代码,加入了F. Privé的代码,使glmnet使用类似于biglasso的算法,并添加了一些额外的代码,使biglasso模仿glmnet。
############ PREP ############## Load required librarieslibrary(hdm)library(biglasso)library(glmnet)## Read automobile datasetdata(BLP)df <- BLP[[1]]## Extract outcomeY <- scale(df$mpg)## Rescale variablesdf$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 wantdf <- df[,names(df) %in% c("price","mpd","space","hpwt","share","outshr","air")]## Convert to matrixdf.mat <- data.matrix(df)df.bm <- as.big.matrix(df.mat)########### HDM ############# Set seed for reproducibilityset.seed(1233)## Run LASSOfit.hdm <- rlasso(x=df.mat, y=Y, post=FALSE, intercept=TRUE)## Check resultscoef(fit.hdm)############## GLMNET ################ Set seed for reproducibilityset.seed(1233)## LASSO with 10-fold cross-validationfit.glmnet <- cv.glmnet(df.mat, Y, alpha=1, family="gaussian")## Check default resultscoef(fit.glmnet)## Try to mimic results of biglassocoef(fit.glmnet, s = "lambda.min")################ BIGLASSO ################## LASSO with 10-fold cross-validationfit.bl <- cv.biglasso(df.bm, Y, penalty="lasso", eval.metric="default", family="gaussian", screen="None", seed=1233, nfolds=10)## Check default resultscoef(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 thresholdmax.lambda <- max(fit.bl$lambda[fit.bl$cve <= thresh])## Check results for the given lambdacoef(fit.bl$fit)[,which(fit.bl$fit$lambda==max.lambda)]
回答:
在CV之后选择“最佳”lambda基本上有两种方法:
-
使CV误差最小化的那个({biglasso}的默认设置)
-
最简洁的(最高的lambda),其CV误差低于最小值+1个标准误({glmnet}的默认设置)。
尝试使用coef(fit.glmnet, s = "lambda.min")
来使用最小值。
此外,为了确保可重复性,尝试设置CV折叠而不是使用某些种子。glmnet()中有foldid
参数,biglasso()中有cv.ind
参数。