0

テーブルに 2 つのデータセットが保存されています。1 つは のセットで[a, b]、もう 1 つは です[x, Sx, y, Sy, rho]。を必要とする確率関数fがあり(a, b, x, Sx, y, Sy, rho)ます。[x, Sx, y, Sy, rho]最後に、最初の の確率結果の合計を見つけたいと思います[a, b][x, Sx, y, Sy, rho]次に、すべての秒などの合計を見つけます[a, b]...

ファイルに数百行、[x, Sx, y, Sy, rho]ファイルに数十万行が[a, b]必要です。

2 つのループを使用せずにこれを行う方法があるかどうか疑問に思っていますか? 私は次のことを試しましたが、思い通りに動作しませんが、遅すぎることはわかっています。

役立つかどうかはわかりませんが、コードに関数を追加しました。関数自体がめちゃくちゃで、適切にフォーマットされていないことをお詫びします。

# data  file with (a, b)
data            <- matrix( c(1, 0, 1, 1, 0.5, 0), nrow=3, ncol=2) 
colnames(data)  <- c("a", "b") 
Ndat            <- dim(data)
Ndata           <- Ndat[1]

# data2 file with (x, Sx, y, Sy, rho)
data2           <- matrix( c(1, 0.1, 1, 0.1, 0.002, 2, 0.1, 2, 0.1, 0.000001, 
                             2, 0.1, 1, 0.1, 0.002), nrow=3, ncol=5) 
colnames(data2) <- c("x", "Sx", "y", "Sy", "rho") 
Ndat2           <- dim(data)
Ndata2          <- Ndat[1]

# function requires variables (a, b, s, Sx, y, Sy, rho) 
Prob  <- function(a, b, Xi, sX, Yi, sY, rho) {sqrt(1 + a ^ 2) * (
  exp(-((b + a * Xi - Yi) ^ 2 / (
    2 * ((a ^ 2 * sX ^ 2) - 
         (2 * a * rho * sX * sY) + sY ^ 2)))) * sqrt((
           1 - rho ^ 2) / (
             a ^ 2 * sX ^ 2 - 2 * a * rho *sX *sY + sY ^ 2))/(
               sqrt(2 * pi) * sqrt(1 - rho ^ 2)))
    }

# Here is my weak attempt
Table <- NULL
Table <- for (j in 1:Ndata) { 
   sum (for (i in 1:Ndata2) {
   Datatable[i] = Prob(data[j, a], data[j, b], data2[i, x], 
                 data2[i, Sx], data2[i, y], data2[i, Sy], 
                 data2[i, rho])
   })
}

apply関数と、それらを使用できる/使用する必要がある場合に頭を悩ませています。私はおそらく十分な情報を追加していないことを知っているので、私を助けることができる提案は素晴らしいでしょう. 私は R だけでなくプログラミングにもかなり慣れていないので、不適切な語彙や書式設定をお許しください。

dataグローバルとして取得する数または行を定義するより良い方法がおそらくありますがNdata、これらは私が最初に遭遇したものです。

関数は再帰的であってはなりませんが、私が書いたとおりであることがわかりました。私は R の入門チュートリアルに何時間も費やしましたが、apply一連の関数をどのように実装するのが最適かを理解するのにまだ非常に苦労しています。

の最初の行からdata2使用して、この関数を各行に1回繰り返して適用したいと思います。次に、それらすべての確率。次に、次の反復では、のすべての行に適用された使用の行 2 のすべての確率を合計する必要があります。a, bdatasumdataa, bdata2

4

1 に答える 1

0

これを行う簡単な方法があると感じていますが、おそらくこのような方法でうまくいくでしょう。

f <- function(a,b,x,y,z) a+b+x+y+z
f.new <- function(p1,p2) {
  p1=as.list(p1); p2=as.list(p2)
  f(p1$a,p1$b,p2$x,p2$y,p2$z)
}

data1 <- data.frame(a=1:10,b=11:20)
data2 <- data.frame(x=1:5,y=21:25,z=31:35)
indx  <- expand.grid(indx2=seq(nrow(data2)),indx1=seq(nrow(data1)))
result <- with(indx,f.new(data1[indx1,],data2[indx2,]))
sums   <- aggregate(result,by=list(rep(seq(nrow(data1)),each=nrow(data2))),sum)

変数 の 2 つのセット ( のセット と(a,b)セット) のすべての組み合わせについて関数を評価し(x, Sx, y, Sy, rho)、最初のセットのすべてのインスタンスについて、2 番目のセットを合計する必要があるようです。

そのため、最初f(...)に、2 つのセットを表す 2 つの引数を取るように関数を再定義します。これはf.new(...)。おそらく、元の関数をそのように定義する必要があります-実行が高速になります。

次に、とindxの行番号のすべての組み合わせを表す 2 つの列を持つデータ フレームを作成し、usingとindexed usingを呼び出します。これにより、 とのすべての組み合わせで関数が評価されるようになりました。次に、それを集計して、指定した合計を取得します。data1data2f.new(...)data1data2indxresult(a,b)(x,y,z)

このアプローチはメモリを大量に消費します。result~ 10MM の要素が含まれますが、ループよりも高速に実行されます。

于 2014-12-19T20:51:57.023 に答える