在大多数情况下,函数参数的默认值在文档中给出.但是,在某些情况下,默认值是从其他参数(包括数据本身)计算的,因此无法在文档中指定.
例如,我如何发现库中lambda函数使用的默认网格?根据该文件,默认是基于计算的,默认为,和,这似乎是一个数据导出的值.glmnetglmnetlambdanlambda100lambda.min.ratio
当我使用给定的数据集运行此函数时,我想知道lambda它使用的值.这在使用时特别有用cv.glmnet,因为我想知道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)
Run Code Online (Sandbox Code Playgroud)
样本输出(注意它们非常不同):
0.3619167
0.04037017
Run Code Online (Sandbox Code Playgroud)
如果默认值取决于其他参数的值,那么除了在调用函数时以调试模式进入该函数之外,我看不到其他解决方案。您可以使用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
>
Run Code Online (Sandbox Code Playgroud)
因此,对于第一个调用,lambda是NULL. 但是,如果您在第二次调用 时重复该方法cv.glmnet,您将看到在这种情况下lambda是一个长度为 100 的数值向量。