Вложенная функция nlm внутри ddply/dlply
Мне нужно интерполировать по группам большой массив данных, используя nlm
функция. У меня нет проблем с использованием его на DF с одной группой:
#example data
df <- data.frame(var= cumsum(sort(rnorm(100, mean=20, sd=4))),
time= seq(from=0,to=550,length.out=100))
#create function
my_function <- function(Cini, time, theta,var){
fy <- (theta[1]-(theta[1]- Cini)*exp((-theta[2]/100000)*(time-theta[3])))
ssq<-sum((var-fy)^2)
return(ssq)
}
th.start <- c(77, 148, 5) #set starting parameters
#run nlm
my_fitt <- nlm(f=my_function, Cini=400, var = df$var,
time=df$time, p=th.start)
Затем я попытался применить функцию в DF с несколькими группами, используя dlply
функция:
#data with groups
df.2 <- data.frame(var= cumsum(sort(rnorm(300, mean=20, sd=4))),
time= rep(seq(from=0,to=1200,length.out=100),3),
groups=rep(c(1:3),each=100))
#run nlm
library(plyr)
my_fitt.2 <- dlply(df.2, .(groups),
nlm(f=my_function, Cini=400, var = df.2$var,time=df.2$time, p=th.start))
Однако я получаю сообщение: Error in fs[[i]](x, ...) : attempt to apply non-function
, Я также пытался удалить df.2$
, получение Error in time - theta[3] : non-numeric argument to binary operator
в этом примере и Error in f(x, ...) : object 'time.clos' not found
в моем оригинальном дф (time.clos
является одной из переменных).
Кроме того, я рекомендую использовать библиотеку dplyr
library(dplyr)
df.2 %>%
group_by(groups) %>%
nlm(f=my_function, Cini=400, v= var,
time=time, p=th.start)
получение Error in f(x, ...) : unused argument (.)
, В чем может быть проблема?
2 ответа
Я не могу помочь с tidyverse
окружающая среда, так как я больше в духе R. Я думаю, что проблема в вашем последнем звонке в том, что вы собираете группу data.frame
к функции, которая принимает function
объект в качестве первого аргумента. Это не может работать.
Позвольте мне предложить вам базовый способ R:
df.2 %>%
split(.$groups) %>%
lapply(function(xx) nlm(f=my_function, Cini=400, var = xx$var, time=xx$time, p=th.start))
Это производят list
длины 3 (для трех групп) с вашими тремя результатами.
Рассмотрим базу R by
(объектно-ориентированная оболочка tapply
), который может поднамерять фрейм данных с помощью фактора (ов) и передавать поднастроенные фреймы данных в метод, такой как ваш nlm
вызов, все, чтобы вернуть список объектов:
run_nlm <- function(sub_df) nlm(f=my_function, Cini=400, var=sub_df$var,
time=sub_df$time, p=th.start)
# LIST OF nlm OUTPUTS (EQUAL TO NUMBER OF DISTINCT df$groups)
my_fitt_list <- by(df, df$groups, run_nlm)