R 如何在进行优化时将数据输入ode
我是R的新手。我发现了非常有用的代码,我试着将其用于我的目的。但是,我得到一个错误: func中的错误(时间、状态、参数…):未找到对象“k4”,func中的错误(时间、状态、参数…):未找到对象“E” 我不知道问题出在哪里,因为我可以看到所有的参数和数据。frame也是正确的 谢谢大家花时间来看这个。我尝试将参数的数量减少到3(k10、k11、k12),并使用剩余参数的估计值(代码中嵌入的值)。但是,我仍然收到一条错误消息,data.frame中的E值没有传递到rxnrate函数中,因此ode无法使用它。我尝试过使用事件和强制函数,但似乎不起作用。谢谢你发现P4,这是一个打字错误,应该是P,我已经改正了 编者注:这是交叉发布到Rhelp的,该消息将此代码的源代码作为stackoverflow问题“r参数和初始条件使ODE模型与nls.lm相匹配”R 如何在进行优化时将数据输入ode,r,optimization,ode,R,Optimization,Ode,我是R的新手。我发现了非常有用的代码,我试着将其用于我的目的。但是,我得到一个错误: func中的错误(时间、状态、参数…):未找到对象“k4”,func中的错误(时间、状态、参数…):未找到对象“E” 我不知道问题出在哪里,因为我可以看到所有的参数和数据。frame也是正确的 谢谢大家花时间来看这个。我尝试将参数的数量减少到3(k10、k11、k12),并使用剩余参数的估计值(代码中嵌入的值)。但是,我仍然收到一条错误消息,data.frame中的E值没有传递到rxnrate函数中,因此ode
#设置工作目录
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))