首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ddply/dlply中嵌套nlm函数

在ddply/dlply中嵌套nlm函数
EN

Stack Overflow用户
提问于 2018-07-31 19:18:32
回答 2查看 121关注 0票数 1

我需要使用nlm函数对大数据帧进行分组插值。我在只有一个组的df上使用它没有任何问题:

代码语言:javascript
复制
#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)

然后,我尝试使用dlply函数在具有多个组的df中应用该函数:

代码语言:javascript
复制
#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,并在原始df中获取Error in f(x, ...) : object 'time.clos' not found(time.clos是其中一个变量)。

此外,我还考虑使用dplyr库

代码语言:javascript
复制
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 (.)。可能的问题是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-31 20:56:52

我对tidyverse环境帮不了太多忙,因为我更像是一个base类型的人。我认为你最后一个调用中的问题是,你通过管道将一个组data.frame传递给一个以function对象作为第一个参数的函数。这是行不通的。

让我向你推荐一种基本的R方法:

代码语言:javascript
复制
df.2 %>% 
  split(.$groups) %>% 
  lapply(function(xx) nlm(f=my_function, Cini=400, var = xx$var, time=xx$time, p=th.start))

这将生成一个长度为3的list (针对三个组),其中包含您的三个结果。

票数 1
EN

Stack Overflow用户

发布于 2018-07-31 23:33:28

考虑base R的by (tapply的面向对象的包装器),它可以通过因子对dataframe进行子集,并将子集后的dataframe传递到nlm调用等方法中,所有这些都是为了返回一个对象列表:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51612165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档