同时适合共享参数

时间:2015-09-02 10:17:10

标签: r curve-fitting

我有这样的不同数据集

   t    y        a1    a2     a3           a4       a5         a6
1  0.00 19.404   20    0.6    19.404       22       0.06       3
2  0.05 19.398   20    0.6    19.404       22       0.06       3
3  0.10 19.391   20    0.6    19.404       22       0.06       3
4  0.15 19.386   20    0.6    19.404       22       0.06       3
5  0.20 19.381   20    0.6    19.404       22       0.06       3
6  0.25 19.377   20    0.6    19.404       22       0.06       3
7  0.30 19.372   20    0.6    19.404       22       0.06       3
8  0.35 19.368   20    0.6    19.404       22       0.06       3
9  0.40 19.363   20    0.6    19.404       22       0.06       3
10 0.45 19.359   20    0.6    19.404       22       0.06       3

其中a1,a2,a3,a4,a5,a6对于每个数据集都是常量,但对不同的数据集进行了更改。

我想要做的是同时将此功能适用于所有数据集

f <- function(data,pars) {
  par1 <- pars[1]
  par2  <- pars[2]
  par3  <-  pars[3]
  t  <- data[,1]
  y  <- data[,2]
  a1 <- data[,3]
  a2 <- data[,4]
  a3 <- data[,5]
  a4 <- data[,6]
  a5 <- data[,7]
  a6 <- data[,8]  

  Tinf <- a2 - (par2*(1-a3)*a4)/(1+par2*a5*a4)
  kC <-par1*sqrt(a6)
  V <- par1 + par3
  tau <- 1/(V*(1+par2*a5*a4))

  y <- a1 -(a1-Tinf)*(1-exp(-t/tau))
  return(y)
}

所有数据集的参数par1par2par3必须相同。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

我正在使用dplyr方法,需要在为数据集提供唯一ID(标识符)后合并(rbind)数据集。然后它按该id分组,并对每个数据集执行您的过程/功能。我创建了自己的数据,以便有两个数据集可供使用。

另外,我稍微修改了你的函数来指定函数外的参数,并考虑每个数据集的唯一a1,...,a6值。如果您对此不满意,我可以尽可能少地更改您的功能来更新我的流程。

dt1 = 
read.table(text="
t    y        a1    a2     a3           a4       a5         a6
1  0.00 19.404   20    0.6    19.404       22       0.06       3
2  0.05 19.398   20    0.6    19.404       22       0.06       3
3  0.10 19.391   20    0.6    19.404       22       0.06       3
4  0.15 19.386   20    0.6    19.404       22       0.06       3
5  0.20 19.381   20    0.6    19.404       22       0.06       3
6  0.25 19.377   20    0.6    19.404       22       0.06       3
7  0.30 19.372   20    0.6    19.404       22       0.06       3
8  0.35 19.368   20    0.6    19.404       22       0.06       3
9  0.40 19.363   20    0.6    19.404       22       0.06       3
10 0.45 19.359   20    0.6    19.404       22       0.06       3", header=T)

dt2 = 
  read.table(text="
t    y        a1    a2     a3           a4       a5         a6
1  0.00 21.409   20    0.8    19.409       20       0.07      5
2  0.05 21.398   20    0.8    19.409       20       0.07       5
3  0.10 21.397   20    0.8    19.409       20       0.07       5
4  0.15 21.386   20    0.8    19.409       20       0.07       5
5  0.20 21.381   20    0.8    19.409       20       0.07       5
6  0.25 21.377   20    0.8    19.409       20       0.07       5
7  0.30 21.371   20    0.8    19.409       20       0.07       5
8  0.35 21.368   20    0.8    19.409       20       0.07       5
9  0.40 21.363   20    0.8    19.409       20       0.07       5
10 0.45 21.351   20    0.8    19.409       20       0.07       5", header=T)


# create an id for each dataset
dt1$id = 1
dt2$id = 2

# bind datasets
dt = rbind(dt1,dt2)

# input parameters
par1 = 2
par2 = 3
par3 = 4


library(dplyr)

dt %>% 
  group_by(id) %>%
  do({ Tinf <- unique(.$a2) - (par2*(1-unique(.$a3))*unique(.$a4))/(1+par2*unique(.$a5)*unique(.$a4))
       kC <-par1*sqrt(unique(.$a6))
       V <- par1 + par3
       tau <- 1/(V*(1+par2*unique(.$a5)*unique(.$a4)))
       y <- unique(.$a1) -(unique(.$a1)-Tinf)*(1-exp(-.$t/tau))

       data.frame(y) })


#    id        y
# 1   1  20.0000
# 2   1 194.5705
# 3   1 233.9927
# 4   1 242.8951
# 5   1 244.9055
# 6   1 245.3595
# 7   1 245.4620
# 8   1 245.4852
# 9   1 245.4904
# 10  1 245.4916
# 11  2  20.0000
# 12  2 172.6108
# 13  2 204.6799
# 14  2 211.4187
# 15  2 212.8348
# 16  2 213.1324
# 17  2 213.1949
# 18  2 213.2080
# 19  2 213.2108
# 20  2 213.2114

如果您希望将函数结果连接回初始(组合)数据集,请最后使用此结果:data.frame(dt,y_res=y)