是否可以查询'R'函数的参数默认值?
在大多数情况下,文档中给出了函数参数的默认值。 但是,在某些情况下,默认值是根据其他参数(包括数据本身)计算的,因此无法在文档中指定 例如,如何查找库是否可以查询'R'函数的参数默认值?,r,R,在大多数情况下,文档中给出了函数参数的默认值。 但是,在某些情况下,默认值是根据其他参数(包括数据本身)计算的,因此无法在文档中指定 例如,如何查找库glmnet中用于函数glmnet的默认lambda网格? 根据文档,默认的lambda是基于nlambda(默认为100)和lambda.min.ratio(似乎是数据衍生值)计算的 当我使用给定的数据集运行此函数时,我想知道它使用的lambda的值。这在使用cv.glmnet时特别有用,因为我想知道当我不提供lambda时,它会选择哪个lamb
glmnet
中用于函数glmnet
的默认lambda
网格?
根据文档,默认的lambda
是基于nlambda
(默认为100
)和lambda.min.ratio
(似乎是数据衍生值)计算的
当我使用给定的数据集运行此函数时,我想知道它使用的lambda
的值。这在使用cv.glmnet
时特别有用,因为我想知道当我不提供lambda时,它会选择哪个lambda
样本输入:
library(glmnet)
set.seed(1)
x=rnorm(100)
eps=rnorm(100)
y = 1 + x + x^2 + x^3 + eps
xmat=model.matrix(y~poly(x,10,raw=T),data=data.frame(x=x))
cv.out=cv.glmnet(xmat, y,alpha=0) # What is the lambda used here?
bestlam=cv.out$lambda.min
print(bestlam)
# When a grid is specified, the result is very different and sometimes worse.
grid=10^seq(10,-2,length=100)
cv.out=cv.glmnet(xmat, y,alpha=0, lambda=grid)
bestlam=cv.out$lambda.min
print(bestlam)
示例输出(请注意,它们非常不同):
您总是可以键入函数名并按enter键来获取函数的源代码。在给定的示例中,lambda默认为NULL
cv.glmnet
## function (x, y, weights, offset = NULL, lambda = NULL, type.measure = c("mse",
## "deviance", "class", "auc", "mae"), nfolds = 10, foldid,
## grouped = TRUE, keep = FALSE, parallel = FALSE, ...)
## {
## if (missing(type.measure))
## type.measure = "default"
## else type.measure = match.arg(type.measure)
## if (!is.null(lambda) && length(lambda) < 2)
## stop("Need more than one value of lambda for cv.glmnet")
## N = nrow(x)
## if (missing(weights))
## weights = rep(1, N)
## else weights = as.double(weights)
## y = drop(y)
## glmnet.call = match.call(expand.dots = TRUE)
## which = match(c("type.measure", "nfolds", "foldid", "grouped",
## "keep"), names(glmnet.call), F)
## if (any(which))
## glmnet.call = glmnet.call[-which]
## glmnet.call[[1]] = as.name("glmnet")
## glmnet.object = glmnet(x, y, weights = weights, offset = offset,
## lambda = lambda, ...)
## glmnet.object$call = glmnet.call
## is.offset = glmnet.object$offset
## lambda = glmnet.object$lambda
## if (inherits(glmnet.object, "multnet")) {
## nz = predict(glmnet.object, type = "nonzero")
## nz = sapply(nz, function(x) sapply(x, length))
## nz = ceiling(apply(nz, 1, median))
## }
## else nz = sapply(predict(glmnet.object, type = "nonzero"),
## length)
## if (missing(foldid))
## foldid = sample(rep(seq(nfolds), length = N))
## else nfolds = max(foldid)
## if (nfolds < 3)
## stop("nfolds must be bigger than 3; nfolds=10 recommended")
## outlist = as.list(seq(nfolds))
## if (parallel && require(foreach)) {
## outlist = foreach(i = seq(nfolds), .packages = c("glmnet")) %dopar%
## {
## which = foldid == i
## if (is.matrix(y))
## y_sub = y[!which, ]
## else y_sub = y[!which]
## if (is.offset)
## offset_sub = as.matrix(offset)[!which, ]
## else offset_sub = NULL
## glmnet(x[!which, , drop = FALSE], y_sub, lambda = lambda,
## offset = offset_sub, weights = weights[!which],
## ...)
## }
## }
## else {
## for (i in seq(nfolds)) {
## which = foldid == i
## if (is.matrix(y))
## y_sub = y[!which, ]
## else y_sub = y[!which]
## if (is.offset)
## offset_sub = as.matrix(offset)[!which, ]
## else offset_sub = NULL
## outlist[[i]] = glmnet(x[!which, , drop = FALSE],
## y_sub, lambda = lambda, offset = offset_sub,
## weights = weights[!which], ...)
## }
## }
## fun = paste("cv", class(glmnet.object)[[1]], sep = ".")
## cvstuff = do.call(fun, list(outlist, lambda, x, y, weights,
## offset, foldid, type.measure, grouped, keep))
## cvm = cvstuff$cvm
## cvsd = cvstuff$cvsd
## cvname = cvstuff$name
## out = list(lambda = lambda, cvm = cvm, cvsd = cvsd, cvup = cvm +
## cvsd, cvlo = cvm - cvsd, nzero = nz, name = cvname, glmnet.fit = glmnet.object)
## if (keep)
## out = c(out, list(fit.preval = cvstuff$fit.preval, foldid = foldid))
## lamin = if (type.measure == "auc")
## getmin(lambda, -cvm, cvsd)
## else getmin(lambda, cvm, cvsd)
## obj = c(out, as.list(lamin))
## class(obj) = "cv.glmnet"
## obj
## }
## <environment: namespace:glmnet>
cv.glmnet
##函数(x,y,权重,偏移量=NULL,λ=NULL,type.measure=c(“mse”),
##“偏差”、“等级”、“auc”、“mae”),nfolds=10,foldid,
##分组=真,保持=假,并行=假,…)
## {
##如果(缺失(类型测量))
##type.measure=“默认值”
##else type.measure=match.arg(type.measure)
##如果(!is.null(lambda)和长度(lambda)<2)
##停止(“cv.glmnet需要一个以上的lambda值”)
##N=nrow(x)
##如果(缺少(重量))
##权重=代表(1,N)
##else权重=as.double(权重)
##y=下降(y)
##glmnet.call=match.call(expand.dots=TRUE)
##其中=匹配(c(“type.measure”、“nfolds”、“foldid”、“grouped”,
##“保留”),姓名(glmnet.call),F)
##(如有的话)
##glmnet.call=glmnet.call[-which]
##glmnet.call[[1]]=as.name(“glmnet”)
##glmnet.object=glmnet(x,y,权重=权重,偏移=偏移,
##λ=λ,…)
##glmnet.object$call=glmnet.call
##is.offset=glmnet.object$offset
##lambda=glmnet.object$lambda
##if(继承(glmnet.object,“multnet”)){
##nz=预测(glmnet.object,type=“非零”)
##nz=sapply(nz,函数(x)sapply(x,长度))
##nz=上限(适用(新西兰,1,中间值))
## }
##else nz=sapply(predict(glmnet.object,type=“非零”),
##长度)
##如果(丢失(foldid))
##foldid=样本(代表(序号(nfolds),长度=N))
##else nfolds=max(foldid)
##if(nfolds<3)
##停止(“Nfold必须大于3;建议Nfold=10”)
##大纲视图=原始列表(序号(nfolds))
##if(并行和需要(foreach)){
##大纲视图=foreach(i=seq(nfolds),.packages=c(“glmnet”))%dopar%
## {
##which=foldid==i
##如果(是矩阵(y))
##y_sub=y[!哪个,]
##否则y_sub=y[!哪个]
##如果(是偏移量)
##offset_sub=as.matrix(offset)[!其中,]
##else offset_sub=NULL
##glmnet(x[!which,drop=FALSE],y_sub,lambda=lambda,
##偏移量=偏移量,权重=权重[!其中],
## ...)
## }
## }
##否则{
##(i在下文(nfolds)中){
##which=foldid==i
##如果(是矩阵(y))
##y_sub=y[!哪个,]
##否则y_sub=y[!哪个]
##如果(是偏移量)
##offset_sub=as.matrix(offset)[!其中,]
##else offset_sub=NULL
##大纲视图[[i]]=glmnet(x[!which,drop=FALSE],
##y_sub,lambda=lambda,offset=offset_sub,
##权重=权重[!哪个],…)
## }
## }
##fun=粘贴(“cv”,类(glmnet.object)[[1]],sep=“.”)
##cvstuff=do.call(乐趣,列表(大纲图,lambda,x,y,权重,
##偏移量、折叠、类型、度量、分组、保留)
##cvm=cvm$cvm
##cvsd=cvstuff$cvsd
##cvname=cvstuff$name
##out=list(lambda=lambda,cvm=cvm,cvsd=cvsd,cvup=cvm+
##cvsd,cvlo=cvm-cvsd,nzero=nz,name=cvname,glmnet.fit=glmnet.object)
##如果(保留)
##out=c(out,list(fit.preval=cvstuff$fit.preval,foldid=foldid))
##lamin=if(type.measure==“auc”)
##getmin(λ,-cvm,cvsd)
##else getmin(lambda、cvm、cvsd)
##obj=c(输出,如列表(lamin))
##类别(obj)=“cv.glmnet”
##obj
## }
##
如果默认值取决于其他参数的值,那么我看不到其他解决方案,只有在调用该函数时以调试模式输入该函数。您可以使用debugonce
,例如:
> debugonce(cv.glmnet)
>
> cv.out=cv.glmnet(xmat, y,alpha=0) # What is the lambda used here?
debugging in: cv.glmnet(xmat, y, alpha = 0)
[...]
Browse[2]> ls()
# [1] "foldid" "grouped" "keep" "lambda" "nfolds" "offset"
# [7] "parallel" "type.measure" "weights" "x" "y"
Browse[2]> lambda
NULL
Browse[2]> c
>
所以对于第一个调用,
lambda
是NULL
。但是,如果在第二次调用cv.glmnet
时重复该方法,您将看到在这种情况下lambda
是长度为100的数字向量 我很惊讶这两个都还没有发布,但明显的功能是args
和formals
:
args
只显示函数的“顶部”,没有正文,这与调用cv.glmnet
不同:
> args(cv.glmnet)
function (x, y, weights, offset = NULL, lambda = NULL, type.measure = c("mse",
"deviance", "class", "auc", "mae"), nfolds = 10, foldid,
grouped = TRUE, keep = FALSE, parallel = FALSE, ...)
NULL
formals
以列表的形式给出这些参数:
> formals(cv.glmnet)
$x
$y
$weights
$offset
NULL
$lambda
NULL
$type.measure
c("mse", "deviance", "class", "auc", "mae")
$nfolds
[1] 10
$foldid
$grouped
[1] TRUE
$keep
[1] FALSE
$parallel
[1] FALSE
$...
您应该能够在函数本身中找到它。如果键入
glmnet
没有返回该函数,您可以尝试getAnywhere('glmnet')
。看起来您需要查看其中一个函数glmnet
调用,以找出lambda
设置为NULL
时实际使用的值(这只是“执行默认操作”的代码).我甚至没有意识到,R
> formals(cv.glmnet)
$x
$y
$weights
$offset
NULL
$lambda
NULL
$type.measure
c("mse", "deviance", "class", "auc", "mae")
$nfolds
[1] 10
$foldid
$grouped
[1] TRUE
$keep
[1] FALSE
$parallel
[1] FALSE
$...