6

ほとんどの場合、関数パラメーターのデフォルト値はドキュメントに記載されています。ただし、場合によっては、既定値が他のパラメーター (データ自体を含む) から計算されるため、ドキュメントで指定できない可能性があります。

たとえば、ライブラリ内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)

サンプル出力 (非常に異なることに注意してください):

0.3619167
0.04037017
4

3 に答える 3

4

デフォルト値が他の引数の値に依存する場合、関数が呼び出されたときに関数をデバッグ モードにする以外に解決策はありません。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。ただし、 への 2 回目の呼び出しでそのアプローチを繰り返すと、その場合、 は長さ 100 の数値ベクトルであるcv.glmnetことがわかります。lambda

于 2013-11-06T03:16:16.940 に答える
3

これらのどちらもまだ投稿されていないことに驚いていますが、明らかな機能はargsandformalsです。

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

$...
于 2013-11-06T06:52:14.657 に答える
0

関数名を入力して Enter キーを押すだけで、いつでも関数のソース コードを取得できます。あなたの例では、ラムダはデフォルトで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>
于 2013-11-06T03:05:25.110 に答える