r - 带有嵌套函数的 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")
目前,这会引发错误
错误:“闭包”类型的对象不是子集
我在这里发现了这个错误,但是当我给它赋值时b
,d
这有效:
a()*x/(b+x)
我认为问题是我试图找到b
并d
使用已经在里面的函数?
做这个的最好方式是什么?甚至有可能还是我需要在其中定义整个复杂公式nls2
?
解决方案
这里也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
,只是b
和d
。
推荐阅读
- java - Android Studio 移除 ActionBar
- java - 如何使同一域内的所有Android项目都以相同的结构创建?
- android - 相机意图打开相机但单击图像时不显示刻度和跨页
- reactjs - 在 React 中使用 HTML 解析包(如 html-react-parser vs dangerouslySetInnerHtml)的优缺点是什么
- c# - 在 C# 中结合泛型函数和泛型。转换类型时出现问题
- java - 读取/写入未定义的 unicode 字符到文件
- unity3d - Unity 2D - 将播放器对象保持在其父面板的边界内
- c# - .NET 5 AspNetCore 包罗万象的路由取代了定义的路由
- sql - 如何使用管道分隔的 SQL 选择查询获取列标题
- android - Firebase中云存储的带宽是多少?