更新2 @G.格洛腾迪克发布了两种方法.第二个是改变函数内的函数环境.这解决了我的编码重复过多的问题.在将脚本编写成包时,我不确定这是否是通过CRAN检查的好方法.当我得出一些结论时,我会再次更新.
更新
我试图传递很多输入参数变量,f2并且不想索引函数内的每个变量env$c, env$d, env$calls,这就是我尝试使用within f5和f6(修改过f2)的原因.但是,assign不能在with里面工作{},移动assign到外面with会做的工作,但在我的实际情况下,我有几个assigns在with表达式内,我不知道如何with轻松地将它们移出功能.
这是一个例子:
## In the <environment: R_GlobalEnv>
a <- 1
b <- 2
f1 <- function(){
c <- 3
d <- 4
f2 <- function(P){
assign("calls", calls+1, inherits=TRUE)
print(calls)
return(P+c+d)
}
calls <- 0
v <- vector()
for(i in 1:10){
v[i] <- f2(P=0)
c <- c+1
d …Run Code Online (Sandbox Code Playgroud) 我刚才问了这个问题.我不确定是否应将此作为答案或新问题发布.我没有答案但是我通过nls.lm在R中应用Levenberg-Marquardt算法"解决"了这个问题,当解决方案在边界时,我运行信任区域反射算法(TRR,在R中实现)来执行远离它.现在我有了新的问题.
根据我的经验,以这种方式,程序达到最佳状态,并且对起始值不那么敏感.但这只是一种实用的方法,可以解决我遇到的问题nls.lm以及R中的其他优化函数.我想知道为什么nls.lm这种方式对于边界约束的优化问题以及如何nls.lm在实践中使用时处理边界约束.
下面我举例说明使用的两个问题nls.lm.
library(devtools)
install_github("KineticEval","zhenglei-gao")
library(KineticEval)
data(FOCUS2006D)
km <- mkinmod.full(parent=list(type="SFO",M0 = list(ini = 0.1,fixed = 0,lower = 0.0,upper =Inf),to="m1"),m1=list(type="SFO"),data=FOCUS2006D)
system.time(Fit.TRR <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'TRR'))
system.time(Fit.LM <- KinEval(km,evalMethod = 'NLLS',optimMethod = 'LM',ctr=kingui.control(runTRR=FALSE)))
compare_multi_kinmod(km,rbind(Fit.TRR$par,Fit.LM$par))
dev.print(jpeg,"LMvsTRR.jpeg",width=480)
Run Code Online (Sandbox Code Playgroud)

描述模型/系统的微分方程是:
"d_parent = - k_parent * parent"
"d_m1 = - k_m1 * m1 + k_parent * f_parent_to_m1 * parent"
Run Code Online (Sandbox Code Playgroud)
在左边的图中是带有初始值的模型,中间是使用"TRR"的拟合模型(类似于Matlab lsqnonlin函数中的算法),右边是使用"LM"的拟合模型nls.lm.查看拟合参数(Fit.LM$par),您会发现一个拟合参数(f_parent_to_m1)位于边界处1.如果我将一个参数的起始值 …
我最初的问题是“在 R 中实现信任区域反射优化算法”。但是,在生成可重现示例的过程中(感谢 @Ben 的建议),我意识到我的问题是在 Matlab 中,一个函数lsqnonlin很好(意味着不需要选择一个好的起始值,速度快)对于我拥有的大多数情况来说已经足够了,而在 R 中,没有这样一个一应俱全的功能。不同的优化算法在不同的情况下效果很好。不同的算法达到不同的解决方案。这背后的原因可能不是R中的优化算法不如Matlab中的信任区域反射算法,也可能与R如何处理自动微分有关。这个问题其实来自两年前的工作中断。当时,包optimx的作者之一 John C Nash 教授 已经建议 Matlab 进行了大量的自动微分工作,这可能是 Matlab lsqnonlin 比 R 中的优化函数/算法执行得更好的原因。我无法用我的知识弄清楚。
下面的示例显示了我遇到的一些问题(更多可重现的示例即将推出)。要运行示例,首先运行install_github("KineticEval","zhenglei-gao"). 您需要安装包mkin及其依赖项,并且可能还需要为不同的优化算法安装一堆其他包。
基本上我试图解决非线性最小二乘曲线拟合问题,如 Matlab 函数lsqnonlin的文档 ( http://www.mathworks.de/de/help/optim/ug/lsqnonlin.html ) 中所述。在我的例子中,曲线是由一组微分方程建模的。我将通过示例进行更多解释。我尝试过的优化算法包括:
nls.lm, the Levenburg-Marquardtnlm.inboptimoptimxsolnp包Rsolnp我也尝试了其他一些,但没有在这里显示。
lsqnonlin在 Matlab 中可以解决我的非线性最小二乘问题类型?(我找不到一个。)lsqnonlin比 R 中的函数更胜一筹?信任区域反射算法或其他原因?我先给出R代码,稍后解释。

ex1 <- mkinmod.full(
Parent = …Run Code Online (Sandbox Code Playgroud) 注意:我在这里交叉发布了这个问题:https : //github.com/hadley/devtools/issues/245
更新:@hadley 刚刚关闭了这个问题,因为他现在可以安装了。我刚刚测试过它,也install_github适用于 Windows。显然我需要等待一些时间让 Github 存档包含新提交的更改。对于遇到同样问题的人,@hadley 指出我在 R/ 中有 .R 和 .r 文件,并且DESCRIPTION collate 中的所有文件都有.r 扩展名。
我正在编写一个 R 包并将其放在 Github 上。我可以在我自己的计算机上构建和加载。但是,运行后install_github("KineticEval",username="zhenglei-gao"),出现以下错误:
* installing *source* package 'KineticEval' ...
** R
Error in .install_package_code_files(".", instdir) :
files in 'Collate' field missing from 'C:/Users/z.gao/AppData/Local/Temp/RtmpUzWWYn /R.INSTALLd3c17515a0/KineticEval/R':
kingraph.r
kinplot.r
FOCUS2006A.r
FOCUS2006B.r
FOCUS2006C.r
FOCUS2006D.r
modFit1.r
IRLSkinfit.full.r
mkinfit.full.r
ERROR: unable to collate and parse R files for package 'KineticEval'
* removing 'C:/Users/z.gao/R-dev/KineticEval'
Run Code Online (Sandbox Code Playgroud)
一个相关的问题在这里:从不正确的 .Rbuildignore 文件构建后,包中缺少整理字段中的文件
但我无法弄清楚错误是否也与我的 .Rbuildignore 文件有关。
更新:最初的问题是:是否有一个R函数使用在matlab中的"lsqnonlin"函数中实现的相同算法?但是,答案更多与在R中搜索函数有关.我认为答案通常对R用户非常有用.所以我编辑了标题,但在这里再次问了原始问题:在R中,如何进行非线性最小二乘优化,包括求解微分方程?
我做的非线性最小二乘优化和发现功能的MATLAB lsqnonlin进行比所有的优化算法我R中试图更好(包括函数算法optimx,nlm,nlminb,solnp在这个意义上,等等),这是更快,找到了"更正确的"解决方案
但是,我没有找到在Matlab中使用的R中的"信任区域反射"算法的实现.有人知道是否已经实施了吗?此外,"信任区域反射"算法是否更适合这种优化算法?
这是一个可重复的例子,与基础箱图相比,最后一个治疗组还有一个异常值.

```
dta <- structure(list(Treatment = c("A", "A", "A", "A", "A", "A", "A",
"A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B",
"B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C",
"C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C", "C",
"C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D",
"D", "D", "D", "D", "D", "A", "A", "A", "A", "A", "A", "A", "A",
"A", "A", …Run Code Online (Sandbox Code Playgroud)