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



我在下面想知道,为什么当我直接提供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

> Inncp1

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

ncp2

你有q = peta,然后传递给f2,然后传递给pf

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

相关内容

  • 没有找到相关文章

最新更新