plot.glmnet увеличава размера на етикетите на променливите

В момента използвам пакета glmnet, за да стартирам регресия с ласо (която в примера по-долу се записва в променливата "fits". След това, когато начертая променливата за fits, тя се появява правилно, но етикетите на коефициента са много малки. Някакви идеи как Мога ли да увелича размера на тези?

Пример за възпроизвеждане по-долу...

require(glmnet)

#setup sample DF with 5 variables
set.seed(123)
sampleDF <- data.frame("V1"=rnorm(100,mean=0,sd=.10),"V2"=rnorm(100,mean=0,sd=.10),"V3"=rnorm(100,mean=0,sd=.10),"V4"=rnorm(100,mean=0,sd=.10),"V5"=rnorm(100,mean=0,sd=.10))

#break data into yVector & xMatrix to put into glmnet
yVector <- sampleDF[,1]
xMatrix <- as.matrix(sampleDF[,2:ncol(sampleDF)])

#use k-fold cross validation to find the min lambda
cv.glmmod <- cv.glmnet(xMatrix,yVector,alpha=1,nfolds=nrow(xMatrix),grouped=FALSE)
best_lambda <- cv.glmmod$lambda.min

#run glmnet
fits <- glmnet(xMatrix, yVector, family="gaussian", alpha=1, nlambda=100)

#plot results
plot(fits,label=TRUE,xvar="lambda")

person Trevor Nederlof    schedule 26.05.2015    source източник
comment
Погледнете в `cex.axis, cex.lab' Те са просто базови R графични параметри.   -  person Vlo    schedule 26.05.2015
comment
Те променят текста на оста, но етикетите на коефициентните линии изглежда не се променят. Предполагам, че те са поставени там от glmnet пакета по различен начин?   -  person Trevor Nederlof    schedule 26.05.2015
comment
ако погледнете plot.glmnet и след това plotCoef (3-ти последен ред), изглежда, че размерът на етикета е кодиран   -  person user2957945    schedule 26.05.2015
comment
А, намерих го, изглежда, че е твърдо кодирано в командата plotCoef. Благодаря за вашата помощ.   -  person Trevor Nederlof    schedule 26.05.2015


Отговори (1)


Тъй като изглежда, че размерът на етикета е твърдо кодиран (и глобалните промени на cex ще променят другите характеристики на графиката), можете да промените plot.glmnet

# copy the plot function
myPlot <- plotCoef

# replace relevant part
body(myPlot)[[14]] <- quote(if (label) {
  nnz = length(which)
  xpos = max(index)
  pos = 4
  if (xvar == "lambda") {
    xpos = min(index)
    pos = 2
  }
  xpos = rep(xpos, nnz)
  ypos = beta[, ncol(beta)]
  text(xpos, ypos, paste(which), pos = pos, ...) # only changed this with ...
})

# copy first level of plot and replace plotCoef  with myPlot
newplotter <- plot.glmnet

body(newplotter)[[3]] <- quote(myPlot(x$beta, lambda = x$lambda, 
                                     df = x$df, dev = x$dev.ratio, 
                                        label = label, xvar = xvar, ...))

Това трябва да увеличи текста (имайте предвид, че сюжетът трябва да е достатъчно широк)

newplotter(fits,label=TRUE,xvar="lambda", cex=1.2)

въведете описание на изображението тук

person user2957945    schedule 26.05.2015
comment
Страхотен пример и сюжет, който показва разликата. Също така ми помогна да видя как да погледна вътре в съществуваща функция и да заменя твърдо кодираните части. Благодаря ти. - person Trevor Nederlof; 26.05.2015
comment
заповядайте. (Използвах as.list(body(myPlot)), за да получа [[14]]) - person user2957945; 26.05.2015
comment
@TrevorNederlof; преосмисли това - вероятно е по-лесно да се дефинира нова функция за изчертаване на етикетите stackoverflow.com/questions/30560689/ - person user2957945; 01.06.2015