Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';未找到对象';在R中使用DEoptim和GenSA进行优化时出错_R_Optimization - Fatal编程技术网

';未找到对象';在R中使用DEoptim和GenSA进行优化时出错

';未找到对象';在R中使用DEoptim和GenSA进行优化时出错,r,optimization,R,Optimization,我是新手,在这里完全即兴发挥(最好的学习方式) 我有一个系统的耦合常微分方程,18个参数,和真实世界的数据超过13年 ODE,y是初始条件的向量,t是时间步长,PARM是参数: Pdot <- function(t, y, parms){ with(as.list(c(parms, y)), { dS <- ro*N + z1*phi1*I1 + z4*phi4*I4 - q*t1*lambda*S*I1/N - q*t4*lambda*S*I4/N - mu0*S +

我是新手,在这里完全即兴发挥(最好的学习方式)

我有一个系统的耦合常微分方程,18个参数,和真实世界的数据超过13年

ODE,y是初始条件的向量,t是时间步长,PARM是参数:

    Pdot <- function(t, y, parms){
  with(as.list(c(parms, y)), {

dS <- ro*N + z1*phi1*I1 + z4*phi4*I4 - q*t1*lambda*S*I1/N - q*t4*lambda*S*I4/N - mu0*S + (1-l)*alpha*N 
dE1 <- (1-p)*q*t1*lambda*S*I1/N - vL*E1 + (1-y1)*(1-z1)*phi1*I1 - mu0*E1 + (1-r4)*l*alpha*N
dI1 <- p*q*t1*lambda*S*I1/N + vL*E1 - phi1*I1 - mu*I1 - mu0*I1
dE4 <- (1-p)*q*t4*lambda*S*I4/N - vL*E4 + (1-z4)*phi4*I4 - mu0*E4 + r4*l*alpha*N + y1*(1-z1)*phi1*I1
dI4 <- p*q*t4*lambda*S*I4/N + vL*E4 - phi4*I4 - mu*I4 - mu0*I4
dN <- ro*N + alpha*N - mu*(I1 + I4) - mu0*N
dD <- mu*(I1 + I4)

return (list(c(dD, dN, dE1, dE4, dI1, dI4, dS)))
})}
我制作了一个目标函数,将lsoda结果与真实数据进行比较,并返回差异;通过改变参数,我希望将这种差异最小化

objective <- function(parms){
s <- lsoda(initial.cond, 1:13, Pdot, parms)
for (i in 2:13){
diffs <-  diffs + abs(s[i,2] - TBDeaths[i]) + abs(s[i,3] - USPopulation[i]) + abs(s[i,6] + s[i,7] - TBCases[i]) + abs(+ s[i,6] - MDRCases[i])}
return(diffs)}
ro是Pdot中使用的第一个参数。出于某种原因,我可以将任何参数集传递到objective中,获得良好的结果,但这两个包都无法将其参数集传递到objective中


bound1、bound2和parm具有相同的长度、包含相同的参数等。如有任何帮助,将不胜感激

优化例程不会创建命名向量并将其传递给目标函数,因此您的
with
语句不起作用

R> with(list(ro=1, b=3), ro + b)
[1] 4
R> with(list(1, 3), ro + b)
Error in eval(expr, envir, enclos) : object 'ro' not found
一个简单但效率较低的解决方案是使用
setNames
向参数向量添加名称:

R> with(setNames(list(1, 3), c("ro", "b")), ro + b)
[1] 4

更有效的解决方案是直接引用参数向量的元素(例如,将
ro
的所有实例替换为
params[1]
在你的函数体中。

你知道,我刚刚被介绍到这个网站,然后像你这样的人来了,非常快地回答了我的超级具体问题,让我的生活更轻松,现在我可以观看DEoptim最小化我的函数,同时找到正确的参数。非常感谢。也许你愿意再次帮助我。我将函数最小化,但DEoptim报告的“bestval”与我手动将参数放入目标函数时得到的值无关。
Gen.out$optim$bestval[1]0.2887569
目标(Gen.out$optim$bestmem)[1]278.3751
 Error in eval(expr, envir, enclos) : object 'ro' not found
R> with(list(ro=1, b=3), ro + b)
[1] 4
R> with(list(1, 3), ro + b)
Error in eval(expr, envir, enclos) : object 'ro' not found
R> with(setNames(list(1, 3), c("ro", "b")), ro + b)
[1] 4