uniroot() 是否混淆了 R 中的输入值?
Is uniroot() confusing the input values in R?
我在下面想知道,为什么我直接提供 q
的值(见 f2
),uniroot()
工作得很好但是当我提供 q
作为其他输入值的函数时 uniroot()
(see f1
) fails?
在代码中,所有具有 ...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
在ncp1
你有 q = peta
然后传递给 f1
但实际上并没有被使用,因为 pf
将 q
作为 (peta / df1) / ((1 - peta)/df2)
。
在ncp2
你有 q = peta
,然后传递给 f2
,然后传递给 pf
。
所以底线是您在 pf
中为 q
使用了不同的值。如果您重新激活警告,您将看到 f1
作为 ncp1
的一部分无法达到收敛。
我在下面想知道,为什么我直接提供 q
的值(见 f2
),uniroot()
工作得很好但是当我提供 q
作为其他输入值的函数时 uniroot()
(see f1
) fails?
在代码中,所有具有 ...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
在ncp1
你有 q = peta
然后传递给 f1
但实际上并没有被使用,因为 pf
将 q
作为 (peta / df1) / ((1 - peta)/df2)
。
在ncp2
你有 q = peta
,然后传递给 f2
,然后传递给 pf
。
所以底线是您在 pf
中为 q
使用了不同的值。如果您重新激活警告,您将看到 f1
作为 ncp1
的一部分无法达到收敛。