2015-09-02 3 views
0

У меня есть различные наборы данных, как этотОдновременная согласуется с общими параметрами

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) 
} 

Параметры par1, par2, par3 нужно быть одинаковой для всех наборов данных. Может кто-нибудь мне помочь?

ответ

0

Я использую подход dplyr, который должен объединить (rbind) ваши наборы данных, предоставив им уникальный идентификатор (идентификатор). Затем он группируется по этому идентификатору и выполняет ваш процесс/функцию для каждого набора данных. Я создал свои собственные данные, чтобы иметь два набора данных.

Кроме того, я немного изменил вашу функцию, чтобы указать параметры вне функции и рассмотреть уникальные значения 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)

Смежные вопросы