【问题标题】:Is uniroot() confusing the input values in R?uniroot() 是否混淆了 R 中的输入值?
【发布时间】:2018-12-20 02:38:18
【问题描述】:

我想知道,为什么当我直接提供 q 的值时( f2),uniroot() 工作得非常好,但是当我提供 q作为其他输入值的函数uniroot()参见f1)失败?

在代码中,所有带有...1 后缀(例如f1)的内容都与我间接提供q 的时间有关。并且所有带有...2 后缀(例如f2)的东西都与我直接提供q 时有关。

我的目标是求解df2 使得y = .15(正确答案是~ 336.3956)。 (请运行下面的整个代码。)

alpha = c(.025, .975); df1 = 3; q = 48.05649 ; peta = .3 # input values

f1 <- function(alpha, q, df1, df2, ncp){    # Objective function (`q` indirectly)
  alpha - suppressWarnings(pf(q = (peta / df1) / ((1 - peta)/df2), df1, df2, 
  ncp, lower.tail = FALSE))
}

f2 <- function(alpha, q, df1, df2, ncp){    # Objective function (`q` directly)
  alpha - suppressWarnings(pf(q = q, df1, df2, ncp, lower.tail = FALSE))
}

ncp1 <- function(df2){                    # root finding
 b <- sapply(c(alpha[1], alpha[2]),     
          function(x) uniroot(f1, c(0, 1e7), alpha = x, q = peta, df1 = df1, df2 = df2)[[1]])

  b / (b + (df2 + 4))
}

ncp2 <- function(df2){                    # root finding
  b <- sapply(c(alpha[1], alpha[2]),     
          function(x) uniroot(f2, c(0, 1e7), alpha = x, q = q, df1 = df1, df2 = df2)[[1]])

 b / (b + (df2 + 4))
}


m1 <- function(df2, y){              # A Utility function
  abs(abs(diff(ncp1(df2))) - y)
}

m2 <- function(df2, y){              # A Utility function
 abs(abs(diff(ncp2(df2))) - y)
}

optimize(m1, c(1, 1e7), y = .15)[[1]] # Incorrect answer: 1e+07

optimize(m2, c(1, 1e7), y = .15)[[1]] # Correct answer: 336.3956

【问题讨论】:

    标签: r function math optimization linear-algebra


    【解决方案1】:

    ncp1

    你有q = peta,然后它被传递给f1,但实际上并没有被使用,因为pfq作为(peta / df1) / ((1 - peta)/df2)

    ncp2

    您拥有q = peta,然后将其传递给f2,然后再传递给pf

    所以底线是您在pf 中为q 使用不同的值。如果您重新激活警告,您将看到f1 作为ncp1 的一部分无法达到收敛。

    【讨论】:

    • @rnorouzian 正如我所说,问题似乎是 q 在求解 df2 时导致收敛(方法 2)或不收敛(方法 1)的不同值。据我所知(很少),我看不出这两种方法有什么本质上的错误。 uniroot 只是无法收敛到方法 1。所以并不是你得到两个 不同 结果;方法 2 会产生结果,而方法 1 不会。 uniroot 也使用了一种相当粗糙的方法(与 optimize 相比),所以如果解决方案不如 optimize 的强大,我也不会感到惊讶。
    • @rnorouzian 嗯。我不确定我是否跟随。我不知道你在用optimize 做什么,也不知道你指的是什么interval。在f2 q 中是固定的(因为它是从ncp2 传递下来的); f1 q 是(如您所说)其他参数的函数,包括您要解决的 df2 。所以看起来这些实际上是两个不同的函数(一个收敛而另一个不收敛)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2022-01-07
    • 1970-01-01
    • 2018-08-23
    • 2019-10-06
    • 2015-03-13
    相关资源
    最近更新 更多