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