gpt4 book ai didi

r - sapply 在交叉验证中的使用

转载 作者:行者123 更新时间:2023-12-01 02:24:20 26 4
gpt4 key购买 nike

我有一个关于 sapply 的问题在 R 中。在我的示例中,我将其用于留一法交叉验证

 ##' Calculates the LOO CV score for given data and regression prediction function
##'
##' @param reg.data: regression data; data.frame with columns 'x', 'y'
##' @param reg.fcn: regr.prediction function; arguments:
##' reg.x: regression x-values
##' reg.y: regression y-values
##' x: x-value(s) of evaluation point(s)
##' value: prediction at point(s) x
##' @return LOOCV score
loocv <- function(reg.data, reg.fcn)
{
## Help function to calculate leave-one-out regression values
loo.reg.value <- function(i, reg.data, reg.fcn)
return(reg.fcn(reg.data$x[-i],reg.data$y[-i], reg.data$x[i]))

## Calculate LOO regression values using the help function above
n <- nrow(reg.data)
loo.values <- sapply(seq(1,n), loo.reg.value, reg.data, reg.fcn)

## Calculate and return MSE
return(???)
}

我的问题 sapply如下:
  • 我可以使用多个参数和函数吗,即 sapply(X1,FUN1,X2,FUN2,..) ,其中 X1X2是我的函数参数 FUN1FUN2分别。
  • 在上面的代码中,我申请了 1:n到函数 loo.reg.value .但是,这个函数有多个参数,实际上是3:整数i ,回归数据reg.data和回归函数 reg.fcn .如果 sapply 中的函数有多个参数,我的 X仅涵盖其中一个参数,sapply 是否将其用作“第一个参数”?所以它与 sapply(c(1:n,reg.data,reg.fcn),loo.reg.value, reg.data, reg.fcn) 相同?

  • 感谢您的帮助

    最佳答案

    回答第一个问题,是的,您可以使用多个函数,但是需要将第二个和后续函数传递给第一个函数,然后传递给下一个函数等。因此,需要对函数进行编码以获取额外的参数和传递它们。

    例如

    foo <- function(x, f1, ...) f1(x, ...)
    bar <- function(y, f2, ...) f2(y, ...)
    foobar <- function(z, f3, ...) f3(z)

    sapply(1:10, foo, f1 = bar, y = 2, f2 = foobar, z = 4, f3 = seq_len)

    > sapply(1:10, foo, f1 = bar, y = 2, f2 = foobar, z = 4, f3 = seq_len)
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,] 1 1 1 1 1 1 1 1 1 1
    [2,] 2 2 2 2 2 2 2 2 2 2
    [3,] 3 3 3 3 3 3 3 3 3 3
    [4,] 4 4 4 4 4 4 4 4 4 4

    这是一个愚蠢的例子,但它展示了如何将额外的参数传递给 foo() ,最初,作为 ... 的一部分 sapply() 的论据.它还展示了如何拥有 foo()和后续函数需要传递额外的参数,只需使用 ...在函数定义中以及如何调用下一个函数,例如 f2(y, ...) .注意我还避免了位置匹配的问题,并命名了提供给 foo() 的所有附加参数。 .

    关于问题2,我认为你解释的方式过于复杂。例如,您复制了 reg.datareg.fcn R 用 sapply() 迭代的位,这是不正确的(这意味着您迭代向量中的 3 个事物 c(1:n,reg.data,reg.fcn) ,而不是迭代 1:n )。
    sapply(1:n, fun, arg1, arg2)相当于
    fun(1, arg1, arg2)
    fun(2, arg1, arg2)
    ....
    fun(10, arg1, arg2)

    同时 sapply(1:n, fun, arg1 = bar, arg2 = foobar)相当于
    fun(1, arg1 = bar, arg2 = foobar)
    fun(2, arg1 = bar, arg2 = foobar)
    ....
    fun(10, arg1 = bar, arg2 = foobar)

    关于r - sapply 在交叉验证中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814121/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com