R 数据帧列表的最佳拟合非线性
我有一个数据帧列表,我想计算列表中每个数据帧的非线性最佳拟合,并得到一个具有最佳拟合对象的列表。我正在尝试使用lapply,但参数有问题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),
# 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')