首页 > 解决方案 > 带有嵌套函数的 nls2

问题描述

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

目前,这会引发错误

错误:“闭包”类型的对象不是子集

我在这里发现了这个错误,但是当我给它赋值时bd这有效:

 a()*x/(b+x)

我认为问题是我试图找到bd使用已经在里面的函数?

做这个的最好方式是什么?甚至有可能还是我需要在其中定义整个复杂公式nls2

标签: rnlsnested-function

解决方案


这里也f1没有a任何参数,因此理解您想要优化的方式有一些困难也就不足为奇了f1

nls2::nls2(like stats::nls) 期望 aformula作为第一个参数。该公式可以从您想要的任何函数构建,并且不必在调用中完全写下来。您可以执行以下操作:

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,只是bd


推荐阅读