Rで可能なすべての組み合わせのいくつかを取得するにはどうすればよいですか?


8

場合によっては、データの可能なすべての組み合わせを調べて、平均間の観察された差異をテストできる経験的分布を構築することにより、正確なテストを実行したい場合があります。可能な組み合わせを見つけるには、通常、combin関数を使用します。選択機能により、可能な組み合わせの数がわかります。組み合わせの数が非常に大きくなるのは非常に簡単で、combin関数の結果を保存することは不可能です。そこで、架空の「スタック」から一度に1つずつ値を提供するために、combin関数と同じロジックを実行するオブジェクトを作成してみました。ただし、この方法(私がインスタンス化したもの)は、妥当な組み合わせサイズでのCombnよりも50倍も遅くなります。

Combnで使用されるアルゴリズムよりもこのようなことを行うためのより良いアルゴリズムはありますか?


StackOverflow Rにあるべき質問の数が最近ここで急増したことに気付いた人はいますか?
John

1
ランダムサンプリングをしてみませんか?

4
@John:その方法でmeta.stats.stackexchange.com/questions/248/…で問題について話し合ったと感じた場合は、うんざりする必要はありません。
russellpierce 2010

@mbq:ランダムサンプリングは、特に適切に動作するデータを使用して、適切な概算をすばやく提供します。しかし、私は自分の目標が正確なテストであることを明示しました。
russellpierce 2010

@drknexusそれがコメントではなく回答だった理由です。

回答:


6

メモリと処理速度をトレードオフしたい場合は(そうだと思います)、次のアルゴリズムをお勧めします。

  • 1からNまでのループを設定します
  • 各iはCombinadicへのインデックスと考えることができ、そのようにデコードします
  • 組み合わせを使用してテスト統計を実行し、結果を保存し、組み合わせを破棄します
  • 繰り返す

これにより、明示的に作成しなくても、N Choose Kの可能な組み合わせがすべて得られます。必要に応じて、Rでこれを行うコードがあります(mark dot m period fredrickson at-symbol gmail dot comで私にメールを送ることができます)。


1
ここでは、コードといくつかのイラストのポストは次のとおりです。 markmfredrickson.com/thoughts/2010-08-06-combinadics-in-r.html
マーク・M・フレドリクソン

私がこの答えを受け入れるのは、それが解決策(私が思うこと)が解決策を探していた問題の中でより難しいためです-前の値を計算せずに特定の組み合わせを選択します。残念ながら、それはまだ非常に遅いです。おそらくここや他の場所で述べたように、バイナリ検索は物事をスピードアップするのに役立ちます。おそらく、最良のアプローチは、mbqの回答のように1つのスレッドが組み合わせを段階的に生成し、別のスレッドがそれらを読み取ってテストすることです。
russellpierce 2010

1

組み合わせの生成は非常に簡単です。たとえば、これを参照してください。このコードをRで記述し、各組み合わせを表示されると同時に処理します。


しかし、これは非常に大きな組み合わせに対処しますか?
csgillespie 2010

@csgillespieまあ、私はそう信じています-それはその場で機能するので、一度に1つの組み合わせのみがメモリに保存され、シミュレーションの結果を集約してそれらを保存する必要をなくすこともできます。もちろん、これはひどく長く機能しますが、通常、徹底的な検索で十分です。速度については、Cで記述することもできますが、シミュレーションの部分と一緒に作成すると、おそらくジェネレーターのステップよりもかなり遅くなります。

2
これは、RのCombn関数が既に実行している方法とほとんど同じです。スタックから一度に1つの組み合わせを削除するバージョンのCombnを書きました。mbqが言うように、一度に1つの組み合わせしかメモリに格納しないため、非常に大きな組み合わせを処理できます。Rでそれを行う際の問題は、関数で段階的なアプローチを行うことは、通常、状態変数を関数に読み込み、それらを操作し、それらをグローバルに格納して戻すことです。ダウン。
russellpierce 2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.