r - 如何从多个绘图输出中选择单个图

标签 r plot glmnet

我正在尝试使用 R 中的“glmnet”函数(尤其是弹性网)从多个绘图输出中选择单个 grpah。

我目前正在处理多项式案例;响应变量有 3 个或更多类别。因此,我将模型与解释变量 X 和响应变量 y 拟合为 3 种类别。假设我们已经使用 cv.glmnet 进行交叉验证获得了 alpha 和 lambda 值。我没有使用参数 type.multinomial = "grouped"

fit <- glmnet(X, y, alpha = alpha, lambda = lambda, standardize = TRUE, family = "multinomial")
plot(fit, xvar = "lambda")

fit 就是弹性网络模型。我知道 plot(fit, xvar = "lambda") 显示的系数路径如下所示:

Elastic net coefficients

但是,当是多项式情况时,R 同时生成多个系数图:例如,当 y 具有三个类别时,则 R 显示 3 个系数图。但我只需要从中选择一张图表。我尝试在google上寻找方法,但失败了。有什么办法可以尝试吗?

最佳答案

我们可以为此修改 glmnet:::plot.multnet 方法,并添加一个 which= 选项,类似于 stats:::plot 中的选项。 lm.

plot.multnet <- function(x, xvar=c("norm", "lambda", "dev"), label=FALSE, 
          type.coef=c("coef", "2norm"), which=x$classnames, ...) {
  xvar <- match.arg(xvar)
  type.coef <- match.arg(type.coef)
  if (!all(which %in% x$classnames)) {
    warning(sprintf('`which="%s"` not in classnames, defaulting to all', which))
    which <- x$classnames
  }
  beta <- x$beta
  if (xvar == "norm") {
    cnorm1 <- function(beta) {
      whichnz <- nonzeroCoef(beta)
      beta <- as.matrix(beta[whichnz, ])
      apply(abs(beta), 2, sum)
    }
    norm <- apply(sapply(x$beta, cnorm1), 1, sum)
  } else {
    norm <- NULL
  }
  dfmat <- x$dfmat
  if (type.coef == "coef") {
    ncl <- nrow(dfmat)
    clnames <- rownames(dfmat)
    lapply(which, function(z) glmnet:::plotCoef(beta[[z]], norm, x$lambda, dfmat[z, ], x$dev.ratio, 
                                label=label, xvar=xvar, ylab=paste("Coefficients: Response", 
                                                                   grep(z, clnames, value=TRUE))))
  } else {
    dfseq <- round(apply(dfmat, 2, mean), 1)
    glmnet:::plotCoef(coefnorm(beta, 2), norm, x$lambda, dfseq, x$dev.ratio, 
             label=label, xvar=xvar, ylab="Coefficient 2Norms", 
             ...)
  }
}

用法

fit1 <- glmnet::glmnet(x, y, family="multinomial")

plot(fit1, xvar='lambda', which='c')

enter image description here

如果某个图层不存在,我会发出警告,然后默认情况下所有图层都会像以前一样绘制。

plot(fit1, xvar='lambda', which='foo')
# Warning message:
# In plot.multnet(fit1, xvar = "lambda", which = 1) :
#   `which="foo"` not in classnames, defaulting to all

数据:

set.seed(42)
x <- matrix(rnorm(100 * 20), 100, 20)
y <- sample(letters[1:3], 100, replace=TRUE)

关于r - 如何从多个绘图输出中选择单个图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74847235/

相关文章:

r - 当应用程序繁忙时如何防止用户在 Shiny 的应用程序上做任何事情

舍入数字并保留足够的有效数字以将它们与邻居区分开来

r - 根据列中每个元素的条件计算出现次数

R:for 循环或 lapply 到命名列表的某些元素

r - 如何获得 glmnet 多项逻辑回归的混淆矩阵?

r - 带星号的条形图

python - 如何在绘图上添加 x 轴?

r - R 中的平行坐标图 (ggparcoord)

r - 在使用 tidymodels 时如何取消缩放并理解 glmnet 系数?

`glmnet` 的岭回归给出的系数与我通过 "textbook definition"计算的系数不同?