nls2具有嵌套函数

时间:2018-05-07 21:51:04

标签: r nls nested-function

我正在尝试使用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")

目前,这会引发错误

  

错误:类型&#39;关闭的对象&#39;不是子集表格

我发现此错误here,但是当我将值分配给bd时,这有效:

 a()*x/(b+x)

我认为问题在于我尝试使用内置函数找到bd

最好的方法是什么?它是否可能,或者我是否需要在nls2中定义整个复杂公式?

1 个答案:

答案 0 :(得分:1)

此处f1a都没有任何参数,因此在理解您希望优化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")

由于没有为start提供x值,并且因为它的实际值可以在环境中找到,所以它不会优于x,只有{{1} }和b