使用ODE在动态模型中共享参数

时间:2018-01-02 19:43:30

标签: r ode

我是R编程的新手,在R中使用动态模型,但是 面对一个我现在无法弄清楚的问题。感谢任何帮助或 建议。我的数据是这样的:

data <- data.frame(time=c(60,75,90,105,120, 135, 
          150,165,180, 195,210,225,240,255,270,300), 
       A=c(1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0),  
       B=c(3,4,5,6,7,8,9,10,8,7,6,5,4,3,2,1),
       C=c(6,7,9,11,13,14,15,16,15,14,13,12,11,10,9,8),
       D=c(5,6,7,8,11,12,14,13,12,10,6,5,3,3,2,1),
       E=c(3,4,5,6,7,8,8,6,5,4,4,3,2,2,1,1))

for(n in c(1:5) ){
  IR <- data[,1+n]
  time <- data[,1]
  d<-data.frame(time, IR)
  Mod<-function(t, parms){
  derivs<-function(t, state, parms){
    with(as.list(c(state, parms)),{
      I <- if(t>60 & t<165 ){I} else{0}
      dQ=k1+I-k*Q2
return(list(c(dQ)),IR=Q/2)
state<-c(Q=1)
return(ode(y=state, times=time, func=derivs, parms=parms, method ="rk4"))
pars<-c( k1=0.1,k=0.1)
Objective<-function(x, parset=names(x)){
    pars[parset]<-x
tout<-d$time
out<-Mod(tout,pars)
return(modCost(obs=d, model=out, weight="mean", method="Marq"))
  }
  lower = c(k1=0, k=0)
  upper=c( k1=10, k=10)
  m1<-modFit(p=pars, f=Objective,lower=lower, upper=upper)
  out1 <- data.frame(summary(m1)$par)
  out1$ID <- k
if(k==1){
    coefficients <- out1
  } else {
    coefficients <- rbind(coefficients, out1)
  }
}

我的数据比上面的数据更复杂,我不适合他们 一个,这就是我添加for循环的原因。通过这种方式,我可以适应参数 每个数据集A,B,C,D E的k1和k但是现在我想拟合参数 k只交叉数据A,B,C,D,E。我有什么办法可以做到的 这个动态模型?

1 个答案:

答案 0 :(得分:0)

您始终可以通过其参数&#34; cost&#34;将新值附加到modCost返回的现有对象,例如如果你想要适合几个数据集A和B,这就是我要做的(在伪代码中)

Objective <- function (x, ) {

....

out  <- Mod(tout,pars)  # pars applying to dataset A
Cost <- modCost(obs=A, model=out, weight="mean")

pars2 <- pars          # pars2 applies to dataset B, but same k
pars2["k1"] <- ...
out2 <- Mod(tout,pars2)  
Cost <- modCost(obs=B, model=out2, weight="mean", cost = Cost)   # Appends to existing object Cost

# and so on... for data sets C and D

return(Cost)
}

这样你就不需要总体循环;您只需在Objective函数中多次运行模型,每次使用特定于不同数据集的参数并更新模型成本。

希望它有所帮助,

Karline