【问题标题】:uniroot() in vectorized R functions矢量化 R 函数中的 uniroot()
【发布时间】:2018-06-17 15:58:24
【问题描述】:

在下面的函数中,我想知道为什么当我使用一个向量作为参数d 时,该函数可以正常工作,但是当我使用一个向量作为参数t,函数(来自uniroot)抛出错误 f() values at end points not of opposite sign

cii <- function(d, t = NA, n1, n2 = NA, conf.level = .95){

  ci <- Vectorize(function(d, t, n1, n2, conf.level){

    options(warn = -1)  
    alpha = (1 - conf.level)/2
    N = ifelse(is.na(n2), n1, (n1 * n2)/(n1 + n2))
    df = ifelse(is.na(n2), n1 - 1, (n1 + n2) - 2)
    d.SE = 1/sqrt(N)
    q = ifelse(is.na(t), d/d.SE, t)

    f <- function(ncp, alpha, q, df){
     alpha - suppressWarnings(pt(q, df, ncp, lower.tail = FALSE))
    }

    CI <- sapply(c(alpha, 1-alpha),
      function(x) uniroot(f, interval = c(0, q+2e2), alpha = x, q = q, df = df)[[1]]*d.SE)
    CI
  })

  d <- if(missing(d)) NA else d

  data.frame(t(ci(d = d, t = t, n1 = n1, n2 = n2, conf.level = conf.level)))
}

# EXAMPLES OF USE:
cii(d = c(2, 3), n1 = 30)  # Works perfectly fine!
cii(t = c(2, 3), n1 = 30)  # Throws error: `f() values at end points not of opposite sign`

【问题讨论】:

    标签: r function optimization linear-algebra


    【解决方案1】:

    它与矢量化无关,但qt 的值为2。端点(,0 和202)都是负数,所以uniroot() 假设它没有'不要过零。

    > f(ncp=  0, alpha=0.025, q=2, df=29 )
    [1] -0.002471819
    > f(ncp=202, alpha=0.025, q=2, df=29 )
    [1] -0.975
    

    t 为 3 时,它确实过零。

    > f(ncp=  0, alpha=0.025, q=3, df=29 )
    [1] 0.0222504
    > f(ncp=202, alpha=0.025, q=3, df=29 )
    [1] -0.975
    

    此图表明它从零以下开始,并且永远不会接近。

    curve(f(ncp=x, alpha=0.025, q=2, df=29 ), 0, 202)
    

    【讨论】:

    • 我认为他们在回答两个不同的问题。 optimize() - alpha 正在寻找最大值(确实存在),而 uniroot() 正在寻找 f=0 的位置(不存在)。你的目标是什么?
    • 这听起来更像是一个统计/交叉验证问题,而不是编程/stackoverflow 问题。我认为算法和函数正在返回正确的答案。我假设它正在寻找一个 ncp
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多