R: ограничения параметров подгонки Optim()

Я хочу ограничить выходные параметры из optim(). Это бесполезно сближает тысячи фаз вне фазы для моей синусоидальной функции (где «designL» — моя независимая переменная, а «отношение» — мои данные зависимой переменной, dfm — мой фрейм данных):

lo_0 = 2e-6
kc_0 = 80000
min.RSS <- function(data, par) {
  with(data, sum( (sin(par[2] *(par[1] + designL))^2 - ratio)^2) )
}
resultt <- optim(par = c(lo_0, kc_0), min.RSS, data = dfm)

Я хочу ограничить lo_0 (фазовый сдвиг) от 0:2e-5. Я нашел некоторую документацию по этому вопросу, но в ней не содержится подробного описания того, как это сделать: https://ubuntuforums.org/showthread.php?t=1420061


person Entropy    schedule 06.02.2018    source источник
comment
Ваш вопрос можно улучшить, предоставив пример набора данных. Непонятно, что такое designL2 и ind_1. optim имеет возможность указать верхний и нижний пределы в зависимости от используемого вами method.   -  person Suren    schedule 06.02.2018
comment
вам, вероятно, следует опубликовать свой ответ как ответ (неважно, что он похож на мой), а не как часть вопроса ...   -  person Ben Bolker    schedule 06.02.2018


Ответы (2)


Наверное

resultt <- optim(par = c(lo_0, kc_0), min.RSS, data = dfm[ind_1,],
     method="L-BFGS-B", lower=c(0,-Inf), upper=c(2e-5,Inf))

Я настоятельно рекомендую дополнительно использовать аргумент control=list(parscale=c(lo_0,kc_0)); optim() предполагает, что параметры будут масштабироваться аналогичным образом и (при использовании конечно-разностных аппроксимаций для вычисления производных) будут иметь порядок 1.

person Ben Bolker    schedule 06.02.2018
comment
Аргумент контроля имел решающее значение. Спасибо, Бен, ты спасаешь жизни! - person Entropy; 06.02.2018

Я отредактировал исправление, чтобы показать здесь ниже. Примечание. Я использовал конечные значения для верхней и нижней границ, потому что бесконечные параметры давали мне ошибку.

lo_0 = 2e-6
kc_0 = 80000
min.RSS <- function(data, par) {
  with(data, sum( (sin(par[2] *(par[1] + designL))^2 - ratio)^2) )
}
resultt <- optim(par = c(lo_0, kc_0), min.RSS,   
     data = dfm, method="L-BFGS-B", 
     lower=c(0,50000), upper=c(2e-5,100000), 
     control=list(parscale=c(lo_0,kc_0)))
person Entropy    schedule 07.02.2018