';未找到对象';在R中使用DEoptim和GenSA进行优化时出错
我是新手,在这里完全即兴发挥(最好的学习方式) 我有一个系统的耦合常微分方程,18个参数,和真实世界的数据超过13年 ODE,y是初始条件的向量,t是时间步长,PARM是参数:';未找到对象';在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 +
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