Когда вы говорите, что не уверены в нижнем пределе, я подозреваю, что это означает, что параметр, который вы пытаетесь оценить, не ограничен ниже.
Если это случай, один трюк состоит в том, чтобы преобразовать функцию так, чтобы была указана нижняя граница параметра.
Эта тривиальная функция имеет минимум при х = 4:
fun <- function(x) -exp(-(x - 4)^2) + 8
который можно найти с помощью:
optimize(f=fun,interval=c(0,8))
#> $minimum
#> [1] 4
, но давайте представим на минуту, что мы не уверены, если есть нижний предел или нет, и что мы знаем, что верхний предел равен 8. R, если мы попробуем:
optimize(f=fun,interval=c(-Inf,8))
т.к. границы должны быть конечными. В этом случае мы можем использовать экспоненциальное преобразование (exp()
), которая отображает действительные числа с положительными числами, например, так:
optimize(f=function(x)fun(log(x)),
interval=exp(c(-Inf,8)))
#> $minimum
#> [1] 54.59815
, а затем, чтобы получить корень, нужно просто поддержать преобразование над решение с помощью:
log(54.59815)
#> 4
Если вы не знаете, как верхняя или нижняя граница основного параметра, то вы можете использовать преобразование рубленые шансов вместо log()
:
function(x) log(x/(1-x))
и это обратное вместо exp()
:
function(y) exp(y)/(1 + exp(y))
Заметим, что преобразование лог-коэффициенты отображает действительные числа на единичный интервал, поэтому интервал параметра становится 0:1
.
Эти решения имеют некоторые числовые ограничения (например, если бы мы установили interval=exp(c(-Inf,16))
в первом решении, мы получили бы ошибку). Подсказка, вы можете изменить масштаб этих преобразований в центр вокруг заданной точки a
, что может уменьшить числовые ограничения.
Как насчет 'my_optimize = function (f, a) {optimize (f = f, interval = c (a - 100, a + 100))}' – Gregor