https://www.math.mcgill.ca/yyang/comp/notes/note4code.R
library(glmnet)
ãã®ããã±ã¼ã¸ã§ä½¿ç¨ãããããã©ã«ãã®ã¢ãã«ã¯ãGuassianç·å½¢ã¢ãã«ã¾ãã¯æå°äºä¹æ³ã§ããã説æã®ããã«ãããããä½æãããã¼ã¿ã»ããããã¼ããããã¦ã¼ã¶ã¯èªåã®ãã¼ã¿ããã¼ããããã¨ããã¯ã¼ã¯ã¹ãã¼ã¹ã«ä¿åããã¦ãããã¼ã¿ã使ç¨ãããã¨ãã§ããã
pacman::p_install_gh("emeryyi/gglasso")
library(gglasso) data(bardet) x<- bardet[["x"]] y<- bardet[["y"]]
glmnetã®æãåºæ¬çãªå¼ã³åºãã使ã£ã¦ã¢ãã«ããã£ãããããã
fit = glmnet(x, y)
"fit "ã¯glmnetã¯ã©ã¹ã®ãªãã¸ã§ã¯ãã§ããã£ãããããã¢ãã«ã®é¢é£æ å ±ããã¹ã¦å«ãã§ãããæã ã¯ãã¦ã¼ã¶ãç´æ¥æåãæ½åºãããã¨ãæ¨å¥¨ãã¦ããªãããã®ä»£ããã«ãplotãprintãcoefãpredictãªã©ã®æ§ã ãªã¡ã½ããããªãã¸ã§ã¯ãã«æä¾ããããããã®ã¿ã¹ã¯ãããã¨ã¬ã¬ã³ãã«å®è¡ãããã¨ãã§ããã
ploté¢æ°ãå®è¡ããã°ãä¿æ°ãå¯è¦åãããã¨ãã§ããï¼
plot(fit)
åæ²ç·ã¯å¤æ°ã«å¯¾å¿ãããããã¯ãλãå¤åããæã®ä¿æ°ãã¯ãã«å ¨ä½ã®ã1-normãã«å¯¾ããä¿æ°ã®ãã¹ã示ãã¦ãããä¸ã®è»¸ã¯ãç¾å¨ã®Î»ã«ãããéã¼ãä¿æ°ã®æ°ã示ãã¦ãããããã¯lassoã®æå¹èªç±åº¦(df)ã¨ãªããã¦ã¼ã¶ã¼ã¯ãæ²ç·ã«æ³¨éãä»ãããã¨ãã§ããããã¯plotã³ãã³ãã§label = TRUEãè¨å®ãããã¨ã§å¯è½ã ã
ãªãã¸ã§ã¯ãåãå ¥åããããprintæ©è½ã使ãã°ãåã¹ãããã§ã®glmnetãã¹ã®æ¦è¦ã表示ãããï¼
print(fit)
Call: glmnet(x = x, y = y) Df %Dev Lambda 1 0 0.00 0.097200 2 1 7.73 0.088560 3 1 14.16 0.080690 4 1 19.49 0.073520 5 1 23.91 0.066990 6 1 27.59 0.061040 7 2 31.42 0.055620 8 2 36.05 0.050680 9 4 40.59 0.046180 10 6 45.05 0.042070 ...
å·¦ããã¼ãã§ãªãä¿æ°ã®æ°(Df)ã-log(尤度)ã®å¤(%dev)ãã©ã ãã®å¤(Lambda)ã表示ããããããã©ã«ãã§ã¯glmnetã¯100åã®Î»ã®å¤ãè¦æ±ãããã%dev%ãλã®å¤ãã次ã®Î»ã®å¤ã¾ã§ååã«å¤åããªãå ´åãããã°ã©ã ã¯æ©æã«åæ¢ãã(å ¸åçã«ã¯ãã¹ã®çµããè¿ã)ã
é åã®ç¯å²å ã®1ã¤ä»¥ä¸ã®ã©ã ãã§å®éã®ä¿æ°ãå¾ããã¨ãã§ããï¼
coef0 = coef(fit,s=0.1)
é¢æ°glmnetã¯ãã¦ã¼ã¶ã¼ãé¸æã§ããä¸é£ã®ã¢ãã«ãè¿ããå¤ãã®å ´åãã¦ã¼ã¶ã¼ã¯ã½ããã¦ã§ã¢ããã®ä¸ãã1ã¤ãé¸æãããã¨ã好ããããããªããã¯ãã¹ããªãã¼ã·ã§ã³ã¯ããããããã®ã¿ã¹ã¯ã®ããã®æãã·ã³ãã«ã§æãåºã使ããã¦ããæ¹æ³ã§ããã
cv.glmnetã¯ããããããäºæ¸¬ãªã©ã®æ§ã ãªãµãã¼ãã¡ã½ããã¨ã¨ãã«ãã¯ãã¹ããªãã¼ã·ã§ã³ãè¡ãããã®ã¡ã¤ã³é¢æ°ã§ããããã§ã¯ãåã«èªã¿è¾¼ãã ãµã³ãã«ãã¼ã¿ã使ã£ã¦ããã
cvfit = cv.glmnet(x, y)
cv.glmnetã¯ãcv.glmnetãªãã¸ã§ã¯ããè¿ãã¾ãããããã¯ããã§ã¯ "cvfit"ã§ãããã¯ãã¹ããªãã¼ã·ã§ã³é©åã®ãã¹ã¦ã®æåãå«ããªã¹ãã§ããglmnetã«é¢ãã¦ã¯ãé¸æãããλã®å¤ãè¦ã以å¤ã«ã¯ãã¦ã¼ã¶ãç´æ¥æåãæ½åºãããã¨ã¯æ¨å¥¨ãã¾ããããã®ããã±ã¼ã¸ã¯ãæ½å¨çãªã¿ã¹ã¯ã®ããã«ããè¨è¨ãããé¢æ°ãæä¾ããã
ãªãã¸ã§ã¯ããããããã§ããã
plot(cvfit)
ã¯ãã¹ããªãã¼ã·ã§ã³æ²ç·ï¼èµ¤ãç¹ç·ï¼ãã©ã ãé åã«æ²¿ã£ãä¸ä¸ã®æ¨æºåå·®æ²ç·ï¼ã¨ã©ã¼ãã¼ï¼ãå«ã¾ãããé¸æããã2ã¤ã®ã©ã ãã¯ç¸¦ã®ç¹ç·ã§ç¤ºããã¦ããï¼ä¸å³åç §ï¼ã
é¸æãããã©ã ãã¨å¯¾å¿ããä¿æ°ãè¦ããã¨ãã§ãããä¾ãã°ã
cvfit$lambda.min
[1] 0.001226463
lambda.minã¯ãã¯ãã¹ããªãã¼ã·ã§ã³ã®å¹³å誤差ãæå°ã«ããλã®å¤ã§ããããã1ã¤ã®ä¿åãããλã¯Î».1seã§ãããã¯èª¤å·®ãæå°ã®æ¨æºèª¤å·®ã®1ã¤ä»¥å ã«åã¾ããããªæãæ£ååãããã¢ãã«ãä¸ãããããã使ãã«ã¯ãä¸è¨ã®lambda.minãlambda.1seã«ç½®ãæããã ãã§ããã
coef1 = coef(cvfit, s = "lambda.min")
ä¿æ°ã¯ã¹ãã¼ã¹è¡åå½¢å¼ã§è¡¨ç¾ããã¦ãããã¨ã«æ³¨æããã®çç±ã¯ãæ£ååãã¹ã«æ²¿ã£ã解ã¯ã¹ãã¼ã¹ã§ãããã¨ãå¤ããããã¹ãã¼ã¹ãã©ã¼ãããã使ç¨ããæ¹ãæéçã«ã空éçã«ãå¹ççã ããã ãã¹ãã¼ã¹ã§ãªãå½¢å¼ã好ãå ´åã¯ãåºåãas.matrix()ã«ãã¤ããéãã¦åºåããã
äºæ¸¬ã¯ããã£ãããããcv.glmnetãªãã¸ã§ã¯ãã«åºã¥ãã¦è¡ããã¨ãã§ãããããã¡ãã®ä¾ãè¦ã¦ã¿ããã
predict(cvfit, newx = x[1:5,], s = "lambda.min")
lambda.min
[1,] 8.406305 [2,] 8.353781 [3,] 8.377383 [4,] 8.294958 [5,] 8.379072
newxã¯æ°ããå ¥åè¡åã表ããsã¯ååã¨åæ§ãäºæ¸¬ãè¡ãããλã®å¤ï¼è¤æ°å¯ï¼ã§ããã
adaptive lasso
ããã«ãã£ã»ãã¡ã¯ã¿ã¼ã®ä¾
[penalty.factor]å¼æ°ã«ãããåä¿æ°ã«å¥ã ã®ããã«ãã£ä¿æ°ãé©ç¨ãããã¨ãã§ãããããã©ã«ãã¯åãã©ã¡ã¼ã¿ã«å¯¾ãã¦1ã ããä»ã®å¤ãæå®ãããã¨ãã§ãããç¹ã«ã[penalty.factor]ã0ã«çããå¤æ°ã¯ãå ¨ãããã«ãã£ãåãã¾ããï¼v_jãjçªç®ã®å¤æ°ã®å¶ç´ã表ãã¨ããã
ããã«ãã£å¶ç´ã¯ãå é¨çã«nvarsã®åè¨ã«ãªãããã«åã¹ã±ã¼ãªã³ã°ããããã¨ã«æ³¨æã
ããã¯ãå¤æ°ã«å¯¾ããäºåç¥èã好ã¿ãããå ´åã«é常ã«ä¾¿å©ã ãå¤ãã®å ´åãããå¤æ°ãé常ã«éè¦ã§ãããã常ã«ä¿æãããå ´åããããããã¯å¯¾å¿ããå¶ç´ä¿æ°ã0ã«è¨å®ãããã¨ã§å®ç¾ã§ããï¼ v_j ã¯ãããã«ãã£ä¿æ°ã0ã«è¨å®ãããã¨ã§ãããã«ãã£ä¿æ°ã0ã«ãããã¨ãã§ããï¼
p.fac = rep(1, 120) p.fac[c(31, 74, 111)] = 0 pfit = glmnet(x, y, penalty.factor = p.fac) plot(pfit, xvar="lambda", label = TRUE)
ãã®ä»ã®ä¾¿å©ãªå¼æ°ãããã¤ãæããï¼ [exclude]ã¯ãç¹å®ã®å¤æ°ãã¢ãã«ã«ããªãããã«ãããã¨ãã§ããããã¡ãããåç´ã«xãããããã®å¤æ°ãé¤å¤ãããã¨ãã§ããããé¤å¤ãããå¤æ°ãã¼ãã«è¨å®ããã ãã§ãä¿æ°ã®å®å ¨ãªãã¯ãã«ãè¿ãã®ã§ãexcludeã®æ¹ã便å©ãªå ´åããããFALSEã®å ´åãåçã¯å¼·å¶çã«ã¼ãã«ãªãã
Adaptive lassoã®ä¾
adaptive lassoã¯ä¸è²«æ§ã®ãã第1段éãå¿ è¦ã¨ããã Zou (2006)ã¯OLSãridge第ä¸æ®µlassoãæ¨å¥¨ãã¦ããã
thelasso.cv<-cv.glmnet(x,y,family = "gaussian",alpha=1)
第1段éã®ä¿æ°ãã第2段éã®éã¿ãæ±ãã coef() ã¯ã¹ãã¼ã¹è¡å
bhat<-as.matrix(coef(thelasso.cv,s="lambda.1se"))[-1,1] if(all(bhat==0)){ bhat<-rep(.Machine$double.eps*2,length(bhat)) }
ããbhatããã¹ã¦ã¼ããªãããã¹ã¦ã«ã¼ãã«æ¥µãã¦è¿ãã¦ã§ã¤ããå²ãå½ã¦ããããã¯ã第2ã¹ãã¼ã¸ã®ãã¹ã¦ã«ã¼ãã®ããã«ãã£ã課ããã¨ã«çããã
adaptive lasso weight
adpen<-(1/pmax(abs(bhat),.Machine$double.eps))
第2段éã®lassoï¼adaptive lassoï¼
m_adlasso <- glmnet(x,y,family = "gaussian",alpha=1,exclude=which(bhat==0), penalty.factor=adpen) plot(m_adlasso)
ã¨ã©ã¹ãã£ãã¯ãããelastic-net
ã¨ã©ã¹ãã£ãã¯ã»ãããã®ä¾
glmnetã«ã¯ãã¦ã¼ã¶ã¼ããã£ãããã«ã¹ã¿ãã¤ãºããããã®æ§ã ãªãªãã·ã§ã³ãç¨æããã¦ãããããã§ã¯ãã使ããããªãã·ã§ã³ãããã¤ãç´¹ä»ãããããããã¯glmneté¢æ°ã§æå®ãããã¨ãã§ããã
[family="gaussian"]ã¯glmneté¢æ°ã®ããã©ã«ãã®familyãªãã·ã§ã³ã ã
[alpha]ã¯å¼¾æ§ãããã®æ··åãã©ã¡ã¼ã¿alphaã§ãalphaã®ç¯å²ã¯[0,1]ã§ããalpha=1ã¯lassoï¼ããã©ã«ãï¼ãalpha=0ã¯ãªãã¸ã«ãªãã
[nlambda] ã¯ã·ã¼ã±ã³ã¹ä¸ã®ã©ã ãå¤ã®æ°ã§ãããããã©ã«ãã¯100ã§ããã[0,1]ã®ç¯å²ãããã
ä¾ã¨ãã¦ãα=0.2ï¼ãããªãã¸å帰ã«è¿ãï¼ãè¨å®ãããªãã¶ãã¼ã·ã§ã³ã®å¾åã«2åã®éã¿ãä¸ããã ããã§ã®è¡¨ç¤ºãé·ããªããããã®ãé¿ããããã«ãnlambdaã20ã«è¨å®ããããããå®éã«ã¯ãλã®å¤ã®æ°ã¯100ï¼ããã©ã«ãï¼ä»¥ä¸ã«ãããã¨ãæ¨å¥¨ããããã»ã¨ãã©ã®å ´åãã¢ã«ã´ãªãºã ã§ä½¿ç¨ãããã¦ã©ã¼ã ã»ã¹ã¿ã¼ã warm-starts ã®ããã«ãä½åãªã³ã¹ãããããããéç·å½¢ã¢ãã«ã§ã¯ããããåæç¹æ§ã«ã¤ãªããã
fit = glmnet(x, y, alpha = 0.2, family="gaussian") plot(fit, xvar = "lambda", label = TRUE)
ã°ã«ã¼ãlasso
ã°ã«ã¼ãlassoã®ä¾
install.packages("gglasso", repos = "http://cran.us.r-project.org")
https://cran.r-project.org/web/packages/gglasso/index.html
group-lasso ããã«ãã£ä»ãæå°äºä¹æ³ããã¸ã¹ãã£ãã¯å帰ãHuberized SVMãäºä¹SVMã®è§£çµè·¯ãå¹ççã«è¨ç®ããããã®çµ±ä¸ã¢ã«ã´ãªãºã ãblockwise-majorization-descent (BMD)ã ãã®ããã±ã¼ã¸ã¯ãYang, Y. and Zou, H. (2015) DOI: <doi:10.1007/s11222-014-9498-5> ã®å®è£ ã ã
library(gglasso)
bardetãã¼ã¿ã»ããã®èªã¿è¾¼ã¿
data(bardet)
20ã®ã°ã«ã¼ããå®ç¾©ãã
group1 <- rep(1:20,each=5)
ããã«ãã£ä»ãæå°äºä¹"group lasso"ã«ãã£ãããããã
m1 <- gglasso(x=bardet$x,y=bardet$y,group=group1,loss="ls")
plot(m1)
ããã«ãã£ä»ãã°ã«ã¼ãLassoã§lså帰ãç¨ãã5-fold ã¯ãã¹ããªãã¼ã·ã§ã³
cv <- cv.gglasso(x=bardet$x, y=bardet$y, group=group1, loss="ls", pred.loss="L2", lambda.factor=0.05, nfolds=5)
plot(cv)
colon ãã¼ã¿ã»ãããèªã¿è¾¼ã
data(colon)
ã°ã«ã¼ãææ¨ãå®ç¾©ãã
group2 <- rep(1:20,each=5)
ã°ã«ã¼ãlassoããã«ãã£ä»ããã¸ã¹ãã£ãã¯å帰ã«ãã£ãã
m2 <- gglasso(x=colon$x,y=colon$y,group=group2,loss="logit")
plot(m2)
ã°ã«ã¼ãlassoããã«ãã£ä»ããã¸ã¹ãã£ãã¯å帰ãç¨ãã5-foldã¯ãã¹ããªãã¼ã·ã§ã³
cv2 <- cv.gglasso(x=colon$x, y=colon$y, group=group2, loss="logit", pred.loss="misclass", lambda.factor=0.05, nfolds=5)
plot(cv2)
λ=λ.1seã«ãããä¿æ°
pre = coef(cv$gglasso.fit, s = cv$lambda.1se)
ã·ãã¥ã¬ã¼ã·ã§ã³ã»ãã¢-1
ãã¸ã¹ãã£ãã¯å帰ã¨æå°äºä¹æ³ã«ãããlassoãadaptive lassoãscadãmcpã®æ¯è¼
Rã©ã¤ãã©ãªããã¼ã
glmnet: LASSOãadaptive LASSOãelastic net ããã«ãã£ä»ãæå°2ä¹æ³ããã³ãã¸ã¹ãã£ãã¯å帰 (ãã¹ã¦ãã¢ã½ã³ãå¤é
å¼ãã³ãã¯ã¹ã¢ãã«ããµãã¼ã)
ncvreg: SCAD ããã³ MCP ããã«ãã£åæå°2ä¹æ³ããã³ãã¸ã¹ãã£ãã¯å帰ç¨
library(glmnet) library(ncvreg) library(MASS)
PART I æå°äºä¹æ³
n=100 p=200
çã®ãã¼ã¿
truebeta <- c(4,4,4,-6*sqrt(2),4/3,rep(0,p-5))
誤差åæ£
sigma2 <- 0.3
Xjã¨Xkã®éã®å ±åæ£ã¯cov(X_j, X_k) = rho^|i-j|å ±åæ£è¡åã§ããã
covmat <- function(rho, p) { rho^(abs(outer(seq(p), seq(p), "-"))) }
rho = 0.1ãXã®å ±åæ£è¡åãçæããã
sigma <- covmat(0.1,p)
X ~ N(0, sigma)
epsilon ~ N(0, sigma2)
çã®ã¢ãã«ï¼ y = x*truebeta + epsilon
x <- mvrnorm(n,rep(0,p),sigma) epsilon <- rnorm(n,0,sd=sqrt(sigma2)) y <- x %*% truebeta + epsilon
lassoããã£ããããã5-fold CVã§ã©ã ããé¸æããã
cvfit <- cv.glmnet(x = x, y = y, alpha = 1, family = "gaussian") plot(cvfit)
CVã§é¸ã°ããã©ã ã
cvfit$lambda.min
[1] 0.0821079
解決ãã¹ããããããã
plot(cvfit$glmnet.fit,label=TRUE,xvar="lambda")
λ.minã®ãããã
abline(v=log(cvfit$lambda.min),lty=1)
λ.1seããããããã
abline(v=log(cvfit$lambda.1se),lty=2)
model_compare <- matrix(NA, nrow=5, ncol=p, dimnames=list(c("true model", "lasso","adaptive lasso","mcp","scad"), paste("V",seq(p),sep="")))
çã®ã¢ãã«ãä¿åãã
model_compare[1, ] <- truebeta
lassoã«ãã£ã¦æ¨å®ãããä¿æ°
cvfit <- cv.glmnet(x = x, y = y, alpha = 1, family = "gaussian") tmp <- cvfit$glmnet.fit$beta lasso_beta <- as.matrix(tmp[,cvfit$lambda==cvfit$lambda.min]) model_compare[2, ] <- lasso_beta
éã¿ãè¨ç®ããadaptive lassoã«ãã£ããããã
weight = 1/(lasso_beta)^2
æ¨å®ä¿æ°ãã¼ãã®å ´åã対å¿ããã¦ã§ã¤ããInfã¨ãªããæ°å¤èª¤å·®ãé²ããããInfã大ããªæ°å¤ï¼ä¾ãã°1e6ï¼ã«å¤æããã
weight[weight==Inf] = 1e6 cvfit <- cv.glmnet(x = x, y = y, alpha = 1, family = "gaussian", nfolds = 5, penalty.factor=weight)
Adaptive Lassoã«ãã£ã¦æ¨å®ãããä¿æ°
tmp <- cvfit$glmnet.fit$beta adaptive_lasso_beta <- as.matrix(tmp[,cvfit$lambda==cvfit$lambda.min]) model_compare[3, ] <- adaptive_lasso_beta
mcpã«ãã£ã¦æ¨å®ãããä¿æ°
cvfit <- cv.ncvreg(X = x, y = y, penalty = "MCP", family = "gaussian") mcp_beta <- cvfit$fit$beta[, cvfit$min] model_compare[4, ] <- mcp_beta[-1]
scadã«ãã£ã¦æ¨å®ãããä¿æ°
cvfit <- cv.ncvreg(X = x, y = y, penalty = "SCAD", family = "gaussian") scad_beta <- cvfit$fit$beta[, cvfit$min] model_compare[5, ] <- scad_beta[-1]
4ã¤ã®æ¹æ³ã§æ¨å®ãããä¿æ°ãæ¯è¼ããã¨ãlasso over-selectedãadaptive lassoãscadãmcpãåé¡ã解決ãã¦ãããã¨ããããã
model_compare
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 true model 4 4.000000000 4 -8.485281 1.333333 0 0 0 0 0 lasso 0 -0.022023796 0 0.000000 0.000000 0 0 0 0 0 adaptive lasso 0 0.000000000 0 0.000000 0.000000 0 0 0 0 0 mcp 0 0.000000000 0 0.000000 0.000000 0 0 0 0 0 scad 0 -0.004545409 0 0.000000 0.000000 0 0 0 0 0 V11 V12 V13 V14 V15 V16 true model 0.000000000 0.00000000 0.0000000 0.0000000 0.000000 0 lasso 0.006311609 0.00000000 0.0000000 0.0000000 0.000000 0 adaptive lasso 0.000000000 0.00000000 0.0000000 0.0000000 0.000000 0 mcp 0.000000000 -0.08207367 -0.1647326 0.2088095 -1.000567 0 scad 0.000000000 0.00000000 0.0000000 0.0000000 -1.033549 0 V17 V18 V19 V20 V21 V22 V23 true model 0.00000000 0.00000000 0 0 0 0.0000000000 0.00000000 lasso 0.00000000 -0.01762063 0 0 0 0.0001952964 -0.05328850 adaptive lasso 0.00000000 0.00000000 0 0 0 0.0000000000 0.00000000 mcp 0.03504008 0.00000000 0 0 0 0.0000000000 0.00000000 scad 0.00000000 0.00000000 0 0 0 0.0000000000 -0.08488739 V24 V25 V26 V27 V28 V29 V30 true model 0.0000000 0.0000000 0.00000000 0 0.0000000 0 0.0000000 lasso 0.0000000 -0.5648782 0.06002556 0 0.0000000 0 -0.3371098 adaptive lasso 0.0000000 -1.0114037 0.00000000 0 0.0000000 0 0.0000000 mcp -0.4379709 0.0000000 0.00000000 0 -0.1994319 0 0.0000000 scad 0.0000000 0.0000000 0.00000000 0 0.0000000 0 0.0000000 V31 V32 V33 V34 V35 V36 V37 V38 V39 V40 V41 true model 0.0000000 0 0.0000000 0 0 0.0000000 0 0 0 0 0 lasso -0.1165544 0 0.0000000 0 0 0.0482393 0 0 0 0 0 adaptive lasso 0.0000000 0 0.0000000 0 0 0.0000000 0 0 0 0 0 mcp -0.4561359 0 -0.1259705 0 0 0.1201394 0 0 0 0 0 scad 0.0000000 0 0.0000000 0 0 0.0000000 0 0 0 0 0 V42 V43 V44 V45 V46 V47 V48 V49 V50 true model 0 0 0.000000000 0 0.0000000 0.0000000 0 0 0.0000000 lasso 0 0 0.009982214 0 -0.2897772 0.0000000 0 0 0.0000000 adaptive lasso 0 0 0.000000000 0 -0.6616183 0.0000000 0 0 0.0000000 mcp 0 0 0.000000000 0 -0.4648836 0.1156758 0 0 -0.1438189 scad 0 0 0.000000000 0 -0.1163973 0.0000000 0 0 0.0000000 V51 V52 V53 V54 V55 V56 V57 V58 V59 true model 0.0000000 0 0.00000000 0.00000000 0 0 0 0.00000000 0 lasso 0.0000000 0 0.05634673 0.13775797 0 0 0 0.00000000 0 adaptive lasso 0.0000000 0 0.00000000 0.09460430 0 0 0 0.00000000 0 mcp 0.0000000 0 0.07499241 0.11837706 0 0 0 -0.05640483 0 scad -0.1008567 0 0.00000000 0.08972644 0 0 0 0.00000000 0 V60 V61 V62 V63 V64 V65 V66 V67 V68 V69 V70 true model 0 0 0 0.00000000 0 0.0000000 0.00000000 0 0 0 0 lasso 0 0 0 0.00000000 0 0.2563789 -0.12041928 0 0 0 0 adaptive lasso 0 0 0 0.00000000 0 0.2957797 0.00000000 0 0 0 0 mcp 0 0 0 0.02528918 0 0.3411462 0.00000000 0 0 0 0 scad 0 0 0 0.00000000 0 0.1248035 -0.03840615 0 0 0 0 V71 V72 V73 V74 V75 V76 V77 V78 V79 true model 0 0 0.00000000 0 0 0.00000000 0.0000000 0.00000000 0 lasso 0 0 0.05161909 0 0 0.00000000 0.0000000 0.04393271 0 adaptive lasso 0 0 0.00000000 0 0 0.00000000 0.0000000 0.00000000 0 mcp 0 0 0.07055282 0 0 0.00000000 0.0652188 0.12140394 0 scad 0 0 0.00000000 0 0 -0.06290252 0.0000000 0.00000000 0 V80 V81 V82 V83 V84 V85 V86 V87 V88 V89 true model 0 0 0 0 0 0 0.00000000 0.000000000 0 0.0000000 lasso 0 0 0 0 0 0 0.00000000 -0.001347216 0 0.2044193 adaptive lasso 0 0 0 0 0 0 0.00000000 0.000000000 0 0.1554728 mcp 0 0 0 0 0 0 0.04738824 0.000000000 0 0.4817615 scad 0 0 0 0 0 0 0.00000000 0.000000000 0 0.0000000 V90 V91 V92 V93 V94 V95 V96 V97 V98 V99 V100 V101 true model 0 0 0 0 0.00000000 0 0 0 0 0 0.00000000 0 lasso 0 0 0 0 0.07206646 0 0 0 0 0 0.06736159 0 adaptive lasso 0 0 0 0 0.00000000 0 0 0 0 0 0.00000000 0 mcp 0 0 0 0 0.44369829 0 0 0 0 0 0.14673570 0 scad 0 0 0 0 0.00000000 0 0 0 0 0 0.00000000 0 V102 V103 V104 V105 V106 V107 V108 V109 V110 V111 true model 0.000000000 0 0 0 0 0 0 0 0 0.000000000 lasso -0.022023796 0 0 0 0 0 0 0 0 0.006311609 adaptive lasso 0.000000000 0 0 0 0 0 0 0 0 0.000000000 mcp 0.000000000 0 0 0 0 0 0 0 0 0.000000000 scad -0.004545409 0 0 0 0 0 0 0 0 0.000000000 V112 V113 V114 V115 V116 V117 true model 0.00000000 0.0000000 0.0000000 0.000000 0 0.00000000 lasso 0.00000000 0.0000000 0.0000000 0.000000 0 0.00000000 adaptive lasso 0.00000000 0.0000000 0.0000000 0.000000 0 0.00000000 mcp -0.08207367 -0.1647326 0.2088095 -1.000567 0 0.03504008 scad 0.00000000 0.0000000 0.0000000 -1.033549 0 0.00000000 V118 V119 V120 V121 V122 V123 V124 true model 0.00000000 0 0 0 0.0000000000 0.00000000 0.0000000 lasso -0.01762063 0 0 0 0.0001952964 -0.05328850 0.0000000 adaptive lasso 0.00000000 0 0 0 0.0000000000 0.00000000 0.0000000 mcp 0.00000000 0 0 0 0.0000000000 0.00000000 -0.4379709 scad 0.00000000 0 0 0 0.0000000000 -0.08488739 0.0000000 V125 V126 V127 V128 V129 V130 V131 true model 0.0000000 0.00000000 0 0.0000000 0 0.0000000 0.0000000 lasso -0.5648782 0.06002556 0 0.0000000 0 -0.3371098 -0.1165544 adaptive lasso -1.0114037 0.00000000 0 0.0000000 0 0.0000000 0.0000000 mcp 0.0000000 0.00000000 0 -0.1994319 0 0.0000000 -0.4561359 scad 0.0000000 0.00000000 0 0.0000000 0 0.0000000 0.0000000 V132 V133 V134 V135 V136 V137 V138 V139 V140 V141 true model 0 0.0000000 0 0 0.0000000 0 0 0 0 0 lasso 0 0.0000000 0 0 0.0482393 0 0 0 0 0 adaptive lasso 0 0.0000000 0 0 0.0000000 0 0 0 0 0 mcp 0 -0.1259705 0 0 0.1201394 0 0 0 0 0 scad 0 0.0000000 0 0 0.0000000 0 0 0 0 0 V142 V143 V144 V145 V146 V147 V148 V149 true model 0 0 0.000000000 0 0.0000000 0.0000000 0 0 lasso 0 0 0.009982214 0 -0.2897772 0.0000000 0 0 adaptive lasso 0 0 0.000000000 0 -0.6616183 0.0000000 0 0 mcp 0 0 0.000000000 0 -0.4648836 0.1156758 0 0 scad 0 0 0.000000000 0 -0.1163973 0.0000000 0 0 V150 V151 V152 V153 V154 V155 V156 V157 true model 0.0000000 0.0000000 0 0.00000000 0.00000000 0 0 0 lasso 0.0000000 0.0000000 0 0.05634673 0.13775797 0 0 0 adaptive lasso 0.0000000 0.0000000 0 0.00000000 0.09460430 0 0 0 mcp -0.1438189 0.0000000 0 0.07499241 0.11837706 0 0 0 scad 0.0000000 -0.1008567 0 0.00000000 0.08972644 0 0 0 V158 V159 V160 V161 V162 V163 V164 V165 true model 0.00000000 0 0 0 0 0.00000000 0 0.0000000 lasso 0.00000000 0 0 0 0 0.00000000 0 0.2563789 adaptive lasso 0.00000000 0 0 0 0 0.00000000 0 0.2957797 mcp -0.05640483 0 0 0 0 0.02528918 0 0.3411462 scad 0.00000000 0 0 0 0 0.00000000 0 0.1248035 V166 V167 V168 V169 V170 V171 V172 V173 V174 V175 true model 0.00000000 0 0 0 0 0 0 0.00000000 0 0 lasso -0.12041928 0 0 0 0 0 0 0.05161909 0 0 adaptive lasso 0.00000000 0 0 0 0 0 0 0.00000000 0 0 mcp 0.00000000 0 0 0 0 0 0 0.07055282 0 0 scad -0.03840615 0 0 0 0 0 0 0.00000000 0 0 V176 V177 V178 V179 V180 V181 V182 V183 V184 true model 0.00000000 0.0000000 0.00000000 0 0 0 0 0 0 lasso 0.00000000 0.0000000 0.04393271 0 0 0 0 0 0 adaptive lasso 0.00000000 0.0000000 0.00000000 0 0 0 0 0 0 mcp 0.00000000 0.0652188 0.12140394 0 0 0 0 0 0 scad -0.06290252 0.0000000 0.00000000 0 0 0 0 0 0 V185 V186 V187 V188 V189 V190 V191 V192 V193 true model 0 0.00000000 0.000000000 0 0.0000000 0 0 0 0 lasso 0 0.00000000 -0.001347216 0 0.2044193 0 0 0 0 adaptive lasso 0 0.00000000 0.000000000 0 0.1554728 0 0 0 0 mcp 0 0.04738824 0.000000000 0 0.4817615 0 0 0 0 scad 0 0.00000000 0.000000000 0 0.0000000 0 0 0 0 V194 V195 V196 V197 V198 V199 V200 true model 0.00000000 0 0 0 0 0 0.00000000 lasso 0.07206646 0 0 0 0 0 0.06736159 adaptive lasso 0.00000000 0 0 0 0 0 0.00000000 mcp 0.44369829 0 0 0 0 0 0.14673570 scad 0.00000000 0 0 0 0 0 0.00000000
ã·ãã¥ã¬ã¼ã·ã§ã³ã»ãã¢-2
PART II ãã¸ã¹ãã£ãã¯å帰
ãã¼ã¿ãçæãã
n <- 200 p <- 8
çã®ãã¼ã¿
truebeta <- c(6,3.5,0,5,rep(0,p-4)) truebeta
çã®ã¢ãã«ããxã¨yãçæ çã®ã¢ãã«ï¼ P(y=1|x) = exp(xtruebeta)/(exp(xtruebeta)+1)
x <- matrix(rnorm(n*p), n, p) feta <- x %*% truebeta fprob <- ifelse(feta < 0, exp(feta)/(1+exp(feta)), 1/(1 + exp(-feta))) y <- rbinom(n, 1, fprob) model_compare <- matrix(NA, nrow=5, ncol=p, dimnames=list(c("true model","lasso", "adaptive lasso","mcp","scad"), paste("V",seq(p),sep="")))
çã®ã¢ãã«ãä¿åãã
model_compare[1, ] <- truebeta
lassoã®ã±ã¼ã¹
cv.glmfit ã©ãã½ã¢ãã«ããã£ããããã©ã ãã®é¸æã«ã¯ãã¹æ¤è¨¼ã使ç¨ããã
family = "binomial", ãã¸ã¹ãã£ãã¯å帰
family = "gaussian", æå°äºä¹æ³
alphaã¯L1ããã«ãã£é
ã®åº¦åããå¶å¾¡ããã
alpha = 1, lassoã
alpha = 0, ridgeã
alpha = (0,1), å¼¾æ§ããã
nfolds = 5, 5åã¯ãã¹ããªãã¼ã·ã§ã³(CV)
cvfit <- cv.glmnet(x = x, y = y, alpha = 1, family = "binomial", nfolds = 5)
CVçµæããããããã
å·¦ã®ç¸¦ç·(λ.min)ã¯ãæå°ã®åå·®ãä¸ããλã«å¯¾å¿ããã
å³ã®ç¸¦ç·(λ.1se)ã¯ã1æ¨æºåå·®ã«ã¼ã«ã®Î»ã«å¯¾å¿ããã
plot(cvfit)
解決ãã¹ããããããã
plot(cvfit$glmnet.fit,label=TRUE,xvar="lambda")
plot(cvfit$glmnet.fit,label=TRUE,xvar="lambda")
λ.minããããããã
abline(v=log(cvfit$lambda.min),lty=1)
λ.1seããããããã
abline(v=log(cvfit$lambda.1se),lty=2)
ååã¯ã©ã ãå¤ã®æ¨å®å¤ã表ãã
tmp <- cvfit$glmnet.fit$beta tmp
CVãé¸æããλ.minã«å¯¾å¿ãããã¼ã¿å¤
lasso_beta <- as.matrix(tmp[,cvfit$lambda==cvfit$lambda.min]) model_compare[2, ] <- lasso_beta
éã¿ãè¨ç®ããAdaptive Lassoããã£ããããã
weight = 1/(lasso_beta)^2
æ¨å®ä¿æ°ãã¼ãã®å ´åã対å¿ããã¦ã§ã¤ããInfã¨ãªããæ°å¤èª¤å·®ãé²ããããInfã大ããªæ°å¤ï¼ä¾ãã°1e6ï¼ã«å¤æããã
weight[weight==Inf] = 1e6 cvfit <- cv.glmnet(x = x, y = y, alpha = 1, family = "binomial", nfolds = 5, penalty.factor=weight)
Adaptive Lassoã«ãã£ã¦æ¨å®ãããä¿æ°
tmp <- cvfit$glmnet.fit$beta adaptive_lasso_beta <- as.matrix(tmp[,cvfit$lambda==cvfit$lambda.min]) model_compare[3, ] <- adaptive_lasso_beta
mcpã«ãã£ã¦æ¨å®ãããä¿æ°
cvfit <- cv.ncvreg(X = x, y = y, penalty = "MCP", family = "binomial") mcp_beta <- cvfit$fit$beta[, cvfit$min] model_compare[4, ] <- mcp_beta[-1]
scadã«ãã£ã¦æ¨å®ãããä¿æ°
cvfit <- cv.ncvreg(X = x, y = y, penalty = "SCAD", family = "binomial") scad_beta <- cvfit$fit$beta[, cvfit$min] model_compare[5, ] <- scad_beta[-1]
4ã¤ã®æ¹æ³ããæ¨å®ãããä¿æ°ãæ¯è¼ããã
model_compare
V1 V2 V3 V4 V5 V6 V7 true model NA NA NA NA NA NA NA lasso 4.467528 2.375300 0 3.096532 0 -0.07315415 -0.3499353 adaptive lasso 4.664295 2.480856 0 3.335227 0 0.00000000 0.0000000 mcp 4.459921 2.533341 0 3.366028 0 0.00000000 0.0000000 scad 4.808539 2.744814 0 3.615375 0 0.00000000 0.0000000 V8 true model NA lasso 0.3801377 adaptive lasso 0.0000000 mcp 0.0000000 scad 0.0000000