R 数据帧列表的最佳拟合非线性

R 数据帧列表的最佳拟合非线性,r,lapply,R,Lapply,我有一个数据帧列表,我想计算列表中每个数据帧的非线性最佳拟合,并得到一个具有最佳拟合对象的列表。我正在尝试使用lapply,但参数有问题 # define a function for D fncTtr <- function(n,d) (d/n)*((sqrt(1+2*(n/d))-1)) # define a function for best fit bestFitD <- function(dat,fun) { res <- nls(dat$ttr~fun(n,d),

我有一个数据帧列表,我想计算列表中每个数据帧的非线性最佳拟合,并得到一个具有最佳拟合对象的列表。我正在尝试使用lapply,但参数有问题

# define a function for D
fncTtr <- function(n,d) (d/n)*((sqrt(1+2*(n/d))-1))
# define a function for best fit
bestFitD <- function(dat,fun) {
 res <- nls(dat$ttr~fun(n,d),data=dat,start=list(d=25),trace=T)
 return(res)
}

resL <- lapply(dData2,bestFitD,dat=dData2,fun=fncTtr)
下面的代码似乎没有问题:

res <- bestFitD(dData2[[1]],fncTtr)
为什么??两者都是数据帧!
但第二个组件似乎有些奇怪

只需去掉
nls
函数调用中的
dat$
。我相信它正在寻找
dat$dat$ttr
,这显然会被破坏。也就是说,您的
bestFitD
功能应该是:

bestFitD <- function(dat,fun) {
    res <- nls(ttr~fun(n,d),data=dat,start=list(d=25),trace=T)
    return(res)
}
这应该起作用:

resL <- lapply(dData2, function(x,fun){
                 bestFitD(x,fun)
               },fun='fncTtr')
编辑

我的解决方案可以简化为(与Anthony解决方案类似,但不完全相同)


你能在nls工作时添加data.frame的示例吗?根据你提供的,我唯一的建议是尝试
resL我尝试了你的建议,但我得到了以下错误:model.frame.default中的错误(公式=~dat+ttr+n,data=dat):无效类型(列表)对于变量“dat”@user963386是的,这不再是
lappy
的错误。请尝试
bestFitD(dData2[[2]],fun=fncTtr)
——同样的错误我同意在这种情况下lapply没有问题。但奇怪的是,它可以与dData[[1]]一起工作,但我在运行dData[[2]]时遇到了错误,谢谢Anthony。你的解决方案是有效的,它有一个很好的解释,它是类似于我所做的!谢谢你的学习。您的解决方案可行,但有点复杂。
Error in model.frame.default(formula = ~dat + ttr + n, data = dat) : 
  invalid type (list) for variable 'dat'
bestFitD <- function(dat,fun) {
    res <- nls(ttr~fun(n,d),data=dat,start=list(d=25),trace=T)
    return(res)
}
resL <- lapply(dData2, bestFitD, fun = fncTtr)
resL <- lapply(dData2, function(x,fun){
                 bestFitD(x,fun)
               },fun='fncTtr')
bestFitD <- function(dat,fun){
  nls(ttr~do.call(fun,list(n,d)), data=dat,
      start=list(d=25),trace=T)
  res
}

0.003237457 :  25 
0.0009393089 :  26.77943 
0.0009362902 :  26.84895 
0.0009362902 :  26.84898 
0.001282807 :  25 
4.771935e-05 :  27.64267 
4.389588e-05 :  27.80729 
4.389584e-05 :  27.80781 
lapply(dData2, bestFitD, fun = 'fncTtr')