2

データ フレームのリストがあり、リスト内の各データ フレームに対する非線形の最適を計算し、最適なオブジェクトのリストを取得したいと考えています。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 のパラメーターとして使用していますが、この関数は 1 つのデータフレームをパラメーターとして想定しています。このパラメータを定義するにはどうすればよいですか? 1 つのデータフレームで関数 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'

なんで?どちらもデータフレームです!しかし、どうやら 2 番目のコンポーネントには奇妙な点があるようです。

4

2 に答える 2

4

関数呼び出しdat$でを取り除くだけです。明らかに壊れるものをnls探していると思います。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)
于 2013-03-03T10:46:12.247 に答える
1

これはうまくいくはずです:

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')
于 2013-03-03T10:46:20.713 に答える