【问题标题】:nls2 with nested functions带有嵌套函数的 nls2
【发布时间】:2018-10-17 18:38:39
【问题描述】:

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

目前,这会引发错误

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

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

 a()*x/(b+x)

我认为问题是我尝试使用已经包含在其中的函数来查找 bd

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

【问题讨论】:

    标签: r nls nested-function


    【解决方案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")
    

    因为没有为x提供start值,并且因为它的实际值可以在环境中找到,所以它不会优化超过x,只有bd

    【讨论】:

    • 完美,你减轻了很多痛苦,当然,当我看到它在我面前时,答案现在似乎一清二楚。非常感谢!
    猜你喜欢
    • 2020-07-01
    • 2019-12-27
    • 2019-11-27
    • 2021-03-21
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2017-01-31
    相关资源
    最近更新 更多