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

В настоящее время я использую пакет glmnet для запуска регрессии лассо (которая в приведенном ниже примере сохраняется в переменной «подходит». Затем, когда я рисую переменную подгонки, она появляется правильно, но метки коэффициентов очень маленькие. Любые идеи, как Я могу увеличить размер этих?

Воспроизводимый пример ниже...

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
@ТреворНедерлоф; переосмыслил это - вероятно, проще определить новую функцию для рисования меток stackoverflow.com/questions/30560689/ - person user2957945; 01.06.2015