【问题标题】:bestfit nonlinear to a list of dataframes最佳拟合非线性数据帧列表
【发布时间】:2013-03-03 09:13:14
【问题描述】:

我有一个数据框列表,我想计算列表中每个数据框的非线性最佳拟合,并获得一个包含最佳拟合对象的列表。我正在尝试使用 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)

当我执行此代码时,我收到以下错误:

FUN(X[[1L]], ...) 中的错误:未使用的参数 (X[[1]])

我希望 lapply 遍历 dData2 中的每个数据帧并执行 bestFitD 函数。我应该如何在 lapply 中定义函数的参数。 dData2 对象是一个列表。我将它用作 bestFitD 的参数,但此函数需要一个数据帧作为参数。我该如何定义这个参数?当我使用一个数据帧自行执行函数 bestFitD 时,它运行正常。具有数据框组件的 dData2 列表示例:

$`1`
    n    ttr      d id
1  35 0.6951 27.739  1
2  36 0.6925 28.072  1
3  37 0.6905 28.507  1
4  38 0.6887 28.946  1
5  39 0.6790 28.003  1
6  40 0.6703 27.247  1
7  41 0.6566 25.735  1
8  42 0.6605 26.981  1
9  43 0.6567 27.016  1
10 44 0.6466 26.026  1
11 45 0.6531 27.667  1
12 46 0.6461 27.128  1
13 47 0.6336 25.751  1
14 48 0.6225 24.636  1
15 49 0.6214 24.992  1
16 50 0.6248 26.011  1

$`2`
    n    ttr      d id
17 35 0.6951 27.739  2
18 36 0.6925 28.072  2
19 37 0.6905 28.507  2
20 42 0.6605 26.981  2

下面的代码好像没问题:

res <- bestFitD(dData2[[1]],fncTtr)

但是当我执行以下操作时:

res <- bestFitD(dData2[[2]],fncTtr)

我收到以下错误:

Error in model.frame.default(formula = ~dat + ttr + n, data = dat) : 
  invalid type (list) for variable 'dat'

为什么?两者都是数据框! 但似乎第二个组件有些奇怪!

【问题讨论】:

  • 可以在 nls 工作时添加一个 data.frame 的示例吗?
  • 根据您提供的信息,我唯一的建议是尝试resL &lt;- lapply(dData2, function(x) bestFitD(dat = x,fun = fncTtr) 看看它是否有效。
  • 我尝试了您的建议,但出现以下错误:model.frame.default(formula = ~dat + ttr + n, data = dat) 中的错误:变量 'dat 的类型(列表)无效'
  • @user963386 是的,这不再是lapply 的错。试试bestFitD( dData2[[2]] , fun = fncTtr )——同样的错误
  • 我同意在这种情况下 lapply 不是问题。但奇怪的是它可以与 dData[[1]] 一起使用,但是当我运行 dData[[2]] 时出现错误

标签: r lapply


【解决方案1】:

只需在您的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)
}

现在,使用lapply 拨打电话:

resL <- lapply(dData2, bestFitD, fun = fncTtr)

【讨论】:

  • 谢谢安东尼。您的解决方案正在运行,并且有很好的解释,并且与我所做的类似!
【解决方案2】:

这应该可行:

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

我重写的地方,bestFitD 使用do.call

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 

编辑

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

lapply(dData2, bestFitD, fun = 'fncTtr')

【讨论】:

  • 感谢 agstudy。您的解决方案有效,但有点复杂。
猜你喜欢
  • 2019-03-15
  • 2011-07-18
  • 2021-12-22
  • 2014-09-07
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2016-03-09
  • 2015-11-03
相关资源
最近更新 更多