R 如何在进行优化时将数据输入ode

R 如何在进行优化时将数据输入ode,r,optimization,ode,R,Optimization,Ode,我是R的新手。我发现了非常有用的代码,我试着将其用于我的目的。但是,我得到一个错误: func中的错误(时间、状态、参数…):未找到对象“k4”,func中的错误(时间、状态、参数…):未找到对象“E” 我不知道问题出在哪里,因为我可以看到所有的参数和数据。frame也是正确的 谢谢大家花时间来看这个。我尝试将参数的数量减少到3(k10、k11、k12),并使用剩余参数的估计值(代码中嵌入的值)。但是,我仍然收到一条错误消息,data.frame中的E值没有传递到rxnrate函数中,因此ode

我是R的新手。我发现了非常有用的代码,我试着将其用于我的目的。但是,我得到一个错误:

func中的错误(时间、状态、参数…):未找到对象“k4”,func中的错误(时间、状态、参数…):未找到对象“E”

我不知道问题出在哪里,因为我可以看到所有的参数和数据。frame也是正确的

谢谢大家花时间来看这个。我尝试将参数的数量减少到3(k10、k11、k12),并使用剩余参数的估计值(代码中嵌入的值)。但是,我仍然收到一条错误消息,data.frame中的E值没有传递到rxnrate函数中,因此ode无法使用它。我尝试过使用事件和强制函数,但似乎不起作用。谢谢你发现P4,这是一个打字错误,应该是P,我已经改正了

编者注:这是交叉发布到Rhelp的,该消息将此代码的源代码作为stackoverflow问题“r参数和初始条件使ODE模型与nls.lm相匹配”

#设置工作目录
setwd(“~/R/wkspace”)
#加载库
图书馆(GG2)
图书馆(E2)
图书馆(deSolve)
库(minpack.lm)
时间=c(22,23,24,46,47,48)
cE=c(15.92,24.01,25.29,15.92,24.01,25.29)
cP=c(0.3,0.14,0.29,0.3,0.14,0.29)
cL=c(6.13,3.91,38.4,6.13,3.91,38.4)

这不是好代码。如果它有效,请务必使用它,但不要认为一次只列出一个列表或向量项是一种糟糕的方式,而不是糟糕的做法。我得到的错误是func(time,state,parms,…)中的
错误:找不到对象“P4”
,而且我在任何地方都看不到P4的任何定义。如果我用
P[4]替换它,
nls.lm`调用运行时不会出错,尽管有很多警告,输出看起来不太乐观。在一个只有6个数据点的非线性模型中尝试估计12个参数也有点乐观(甚至可能是鲁莽)。@42-:难道“不可能”不是更接近目标了吗?对于OP:即使您要解决表面问题以使代码正常工作,这也根本不起作用。除非采用某些特殊情况下的折叠冗余参数的高级技术,否则无法拟合比数据点更多的参数(即使拟合几乎与数据点一样多的参数也是困难和不可取的)。@BenBolker我希望留下更多数据点的可能性。这确实让我想知道,当要估计的参数数量超过数据点的数量时,是否至少应该产生一个警告。
         #set working directory
         setwd("~/R/wkspace")
         #load libraries
          library(ggplot2)
         library(reshape2)
         library(deSolve)
         library(minpack.lm)
         time=c(22,23,24,46,47,48)
         cE=c(15.92,24.01,25.29,15.92,24.01,25.29)
         cP=c(0.3,0.14,0.29,0.3,0.14,0.29)
         cL=c(6.13,3.91,38.4,6.13,3.91,38.4)
         df<-data.frame(time,cE,cP,cL)
         df
         names(df)=c("time","cE","cP","cL")

         #rate function
         rxnrate=function(t,c,parms){

            #rate constant passed through a list called
         k1=parms$k1
         k2=parms$k2
         k3=parms$k3
         k4=parms$k4
          k5=parms$k5
         k6=parms$k6
         k7=parms$k7
         k8=parms$k8
         k9=parms$k9
         k10=parms$k10
         #c is the concentration of species
         #derivatives dc/dt are computed below
         r=rep(0,length(c))
         r[1]=(k1+(k2*E^k10)/(k3^k10+E^k10))/(1+P/k6)-k4*         ((1+k5*P)/(1+k7*E))*c["pLH"]; #dRP_LH/dt
         r[2]=(1/k8)*k4*((1+k5*P)/(1+k7*E))*c["p"]-k9*c["L"] #dL/dt
         return(list(r))
          }


ssq=function(myparms){
     #initial concentration
     cinit=c(pLH=unname(myparms[11]),LH=unname(myparms[12]))
     print(cinit)
     #time points for which conc is reported
     #include the points where data is available
     t=c(seq(0,46,2),df$time)
     t=sort(unique(t))
    #parameters from the parameters estimation
    k1=myparms[1]
    k2=myparms[2]
    k3=myparms[3]
    k4=myparms[4]
     k5=myparms[5]
     k6=myparms[6]
     k7=myparms[7]
    k8=myparms[8]
    k9=myparms[9]
    k10=myparms[10]
#solve ODE for a given set of parameters
  out=ode(y=cinit,times=t,func=rxnrate,parms=list(k1=k1,k2=k2,k3=k3,k4=k4,k5=k5,k6=k6,k7=k7,k8=k8,k9=k9,k10=k10,E=cE,P=cP))

    #Filter data that contains time points
     outdf=data.frame(out)
     outdf=outdf[outdf$time%in% df$time,]
    #Evaluate predicted vs experimental residual
     preddf=melt(outdf,id.var="time",variable.name="species",value.name="conc")
     expdf=melt(df,id.var="time",variable.name="species",value.name="conc")
     ssqres=preddf$conc-expdf$conc
    return(ssqres)
}
# parameter fitting using levenberg marquart
#initial guess for parameters
myparms=c(k1=500, k2=4500, k3=200,k4=2.42, k5=0.26,k6=12.2,k7=0.004,k8=55,k9=24,k10=8,pLH=14.5,LH=3.55)


#fitting
fitval=nls.lm(par=myparms,fn=ssq)
#summary of fit
summary(fitval)
#estimated parameter
parest=as.list(coef(fitval))