nls2 с вложенными функциями - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь найти параметры, используя пакет nls2. Поскольку формула, для которой я пытаюсь оптимизировать параметры, довольно сложна, я пытаюсь использовать функции, которые я вызываю в формуле, которую я оптимизирую с помощью команды nls2:

library(nls2)

set.seed(20160227)
x <- seq(0,50,1)
y <- ((runif(1,10,20)*x)/(runif(1,0,10)+x))+rnorm(51,0,1)

a <- function(){
d+1
}

f1 <- function(){
y <- a()*x/(b+x)
}

st <- data.frame(d = c(-100,100),
                 b = c(-100,100))

nls2(f1,start = st, algorithm = "brute-force")

В настоящее время выдается ошибка

Ошибка: объект типа 'замыкание' не может быть подмножеством

Я нашел эту ошибку здесь , однако, когда я присваиваю значения b и d, это работает:

 a()*x/(b+x)

Полагаю, проблема в том, что я пытаюсь найти b и d, используя функции, которые уже имеют их внутри?

Каков наилучший способ сделать это? Это вообще возможно или мне нужно определить всю сложную формулу в пределах nls2?

1 Ответ

0 голосов
/ 08 мая 2018

Ни f1, ни a здесь не имеют каких-либо параметров, поэтому неудивительно, что ему сложно понять, как вы хотите оптимизировать f1.

nls2::nls2 (например, stats::nls) ожидает formula в качестве первого параметра. Эта формула может быть построена из любой функции, которую вы хотите, и не должна быть записана полностью в вызове. Вы можете сделать следующее:

a <- function(d){
  d+1
}

f1 <- function(b,d,x){
  y <- a(d)*x/(b+x)
}

А затем подгоните модель так:

nls2(y~f1(b,d,x), start = st, algorithm = "brute-force")

Поскольку для x значение start не задано и его фактическое значение можно найти в среде, оно не будет оптимизировано для x, только b и d.

...