我正在尝试使用 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")
显示的系数路径如下所示:
但是,当是多项式情况时,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')
如果某个图层不存在,我会发出警告,然后默认情况下所有图层都会像以前一样绘制。
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/