是否可以查询'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

$...