2017-01-26 2 views
1

Я использую пакет pracma, в частности алгоритм поиска корней Brent-Dekker, для поиска корней функции, задающей коэффициент вариации наблюдений (CV obs), равный симуляциям (CV сим).Интервалы Brent-Dekker (pracma)

В то время как на индивидуальной основе я могу обеспечить хорошую оценку первоначального интервала (например, [a, b] в brent(f, a, b)) для алгоритма, я имею дело с большим количеством лет/регионов/и т. Д. для которого я нахожу корень, и диапазон интервалов не так прощает - он должен быть довольно узким, насколько я встречал. Вот общая суть моего кода:

library(pracma) 
CV <- function(x){ #coefficient of variation 
    sd(x)/mean(x) 
} 
fb <- function(b){ #this is my function 
    CV(obs)-CV(sim^b) 
} 
for (i in ...) { #regions 
    for (j in ...) { #years... etc. 
     obs <- some.dataframe 
     sim <- some.df.2 
     z1 <- brent(fb, 0.5,2) #where z1$root is the solution 
    } 
} 

мне интересно, если есть связанные пакеты или методы для определения начального интервала в моем цикл, или, если есть изменения, так что я могу оставить этот интервал пустого (Я не использую Python, но здесь, например, https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.brent.html интервалы являются необязательными).

Я надеюсь, что это имеет смысл, с удовольствием предоставит больше контекста.

ответ

0

Я не знаю, если это делает то, что вы хотите, но stats::uniroot применения (некоторые форма) метод Брента: archive pointed to by ?stats::uniroot говорит:

Этот файл содержит одномерный Minimizer Брента и нулевой искатель.
C реализация (с адаптацией) алгоритма
G.Forsythe, M.Malcolm, C.Moler, Компьютерные методы для
математические вычисления.

uniroot() имеет extendInt аргумент, который по умолчанию «нет», но может быть установлен на «да»:

extendInt: строка символов с указанием, если интервал «с (нижний, верхний)» должен быть расширенным или напрямую вызывать ошибку, когда «f()» не имеет отличительных знаков на конечных точках.

Таким образом, вы не можете оставить интервал пустым, но алгоритм попытается отрегулировать грамотно на «плохие» варианты.

+0

Бен, извините, у меня недостаточно репутации, чтобы поддержать ваш ответ, но это было очень хорошее решение. Это также было проблемой, когда мое резюме было NA для начала (например, для моделирования нуля), поэтому мне также пришлось добавить дополнительную инструкцию if с помощью. Is.na, чтобы обойти проблематичные значения, которые делали интервал недействительным. Спасибо. – suntwist

Смежные вопросы