我一直在尝试使用R包'biglasso'处理高维数据。但是,我得到的结果与从“ hdm”或“ glmnet”获得的LASSO函数的结果不匹配。 biglasso的文档也很差。
在下面的示例中,来自hdm和glmnet的结果非常接近,但并不精确,这是可以预期的。但是,biglasso不会删除“ share”变量。我尝试了所有不同的屏幕设置,但没有任何区别。关于如何使biglasso与其他眼镜保持一致的任何想法?谢谢!
编辑:对于给定的lambda值,结果非常相似。但是每种方法似乎选择一个不同的lambda ..对于hdm来说,这是有意义的,因为它是用于因果推理的,并且与样本外预测无关。 hdm使用与Belloni等人不同的目标函数。 (2012),但我不确定cv.biglasso和cv.glmnet为何会有如此大的差异。如果我在没有筛选规则的情况下运行biglasso,则仅在CV折叠中存在随机差异的情况下,它们应该最大化同一目标函数,不是吗?
##########
## 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$share <- scale(df$share)
## Limit to variables I want, convert to matrix
df <- df[,names(df) %in% c("price","mpd","space","hpwt","share")]
df.mat <- data.matrix(df)
df.bm <- as.big.matrix(df.mat)
#########
## HDM ##
#########
set.seed(1233)
fit.hdm <- rlasso(x=df.mat, y=Y, post=FALSE, intercept=TRUE)
coef(fit.hdm)
##############
## BIGLASSO ##
##############
fit.bl <- cv.biglasso(df.bm, Y, penalty="lasso",
family="gaussian", screen="SSR",
seed=1233, ncores=4, nfolds=10)
coef(fit.bl)
############
## GLMNET ##
############
set.seed(1233)
fit.glmnet <- cv.glmnet(df.mat, Y, alpha=1, family="gaussian")
coef(fit.glmnet)
在简历后选择“最佳” lambda基本上有两种方法:
最小化CV错误(默认为{biglasso})
CV误差小于最小值+ 1标准误差(默认值为{glmnet}的情况下,最简约(最高的λ)的那个。)>] >>
尝试使用coef(fit.glmnet, s = "lambda.min")
使用最小值。
此外,为确保可重复性,请尝试设置CV折叠而不是某些种子。 foldid
中有参数glmnet()
,cv.ind
中有参数biglasso()
。