想象我有一个名为 a_vector 的向量:
a_vector<-seq(1:10)
我写了一个函数来估计一些参数。假设函数如下,我用它来估计 b_vector 中的值(请注意,我使用的实际函数更复杂,如果没有一些大量的代码行,我无法讨论它)。
my_function<-function(a){
a*sqrt(5)
}
b_vector<-my_function(a_vector)
b_vector
这是结果:
2.236068 4.472136 6.708204 8.944272 11.180340 13.416408 15.652476 17.888544 20.124612 22.360680
现在,假设 b_vector 中有我没有使用该函数估计的值(例如 14.99 或 112.85)。但是,我有兴趣知道 a_vector 中的哪些值可能会产生这些值,即使 a_vector 目前不包含这些值。
我可以根据函数产生的 b_vector 的值轻松找到 a_vector 的值(例如,4.472136 是在函数中输入 2 的结果),但我找不到问题的解决方案。我非常感谢对此的任何帮助。
我没有尝试任何具体的事情,因为我不知道该怎么做。
我想您可能正在寻找的是
uniroot
。
uniroot
将搜索函数第一个参数的解,其中当给定所有其他参数时,该函数返回 0。就您而言,您正在处理
b = sqrt(5) * a
这意味着
0 = b - sqrt(5) * a
。
现在你可以做
solve_fn <- function(a, b){
b - a * sqrt(5)
}
uniroot(f = solve_fn,
interval = c(-1e8, 1e8), # search interval, a numeric range.
b = 10)
$root
[1] 4.472136
$f.root
[1] -1.354202e-08
$iter
[1] 2
$init.it
[1] NA
$estim.prec
[1] 6.103516e-05
这告诉我们
a = 4.472136
是返回 b = 10
的值。
理想情况下,限制搜索间隔可能会更有效,但如果我不确定预期的搜索间隔可能是多少,我经常将间隔设置得很宽。特别是当我概括一个函数时。
optim
反转(某些)函数,例如,如果我们定义此函数:
reverse_fun <- function(fun, output) {
unlist(lapply(output, function(x) {
suppressWarnings(optim(x, \(y) abs(x - fun(y)))$par)
}))
}
然后我们应该能够给它我们想要反转的函数以及我们想要找到输入的输出向量。它将返回给出给定函数输出的输入:
b_vector <- c(2.236068, 4.472136, 6.708204, 8.944272, 11.180340,
13.416408, 15.652476, 17.888544, 20.124612, 22.360680)
my_function <- function(a) {
a * sqrt(5)
}
reverse_fun(my_function, b_vector)
#> [1] 1 2 3 4 5 6 7 8 9 10