【问题标题】:shared parameters in dynamic model with ODE动态模型中的共享参数与 ODE
【发布时间】:2018-01-12 15:17:40
【问题描述】:

我是 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 一次。有什么办法可以做到 这个动态模型?

【问题讨论】:

    标签: r ode


    【解决方案1】:

    您始终可以通过其参数“cost”将新值附加到 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)
    }
    

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

    希望对你有帮助,

    卡琳

    【讨论】:

    • 这很有帮助。我还有一个问题。那么如何使用 modFit() 函数来拟合所有参数。我尝试了 modFit(p=pars, f=Objective,lower=lower, upper=upper),但它只返回第一个数据集 A 的 2 个参数。你有这方面的经验吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    相关资源
    最近更新 更多