uniroot()是否会混淆R中的输入值?

时间:2018-07-12 00:45:11

标签: r function math optimization linear-algebra

我在想以下问题,为什么当我直接提供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

1 个答案:

答案 0 :(得分:0)

ncp1

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

ncp2

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

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