私にとっては形式主義と出版を意味するので、アルゴリズムは強すぎる言葉かもしれませんが、正確な比率でサブセットを選択する方法があり(パーセンテージがサンプル宇宙からの被験者の整数をもたらすと仮定します)、他の方法よりもはるかに簡単です提案されたソリューション。私は1つを構築し、それをテストしました。
ところで、ここで応答が遅くなって申し訳ありませんが、最近は時間が限られています。ハードコーディングされたソリューションをかなり迅速に作成し、それ以来、適切な汎用実装にリファクタリングしてきました。忙しくてまだ終わっていませんが、これ以上返事を遅らせたくありませんでした。
メソッド:
基本的に、各行を個別に検討し、条件によって各列の値を選択する余地があるかどうかに基づいて、選択可能かどうかを判断します。
そのために、各列ルール (例: 男性 40%、女性 60%) を個別のターゲットと見なします (例: 希望するサブセット サイズが 100 の場合、男性 40 人、女性 60 人を探します)。女性)。それぞれカウンターを作ります。
次に、サブセットを作成するか、一致するものが見つからずにサンプル ユニバースのすべての行を調べるまで、ループします (その後の動作については以下を参照してください)。これは疑似コードのループです。
- Randomly select a row.
- Mark the row examined.
- For each column constraint:
* Get the value for the relevant column from the row
* Test for selectability:
If there's a value target for the value,
and if we haven't already selected our target number of incidences of this value,
then the row is selectable with respect to this column
* Else: the row fails.
- If the row didn't fail, select it: add it to the subset
それが核心です。ルールに一致するサブセットを提供するか、そうしないか...一致が見つからない場合に何が起こるかを教えてくれます。
満足できない:
他の人が指摘したように、任意のサンプル ユニバースの任意のルール セットを満たすことが常に可能であるとは限りません。ルールが有効であり (各値のパーセンテージの合計が 100 になる)、サブセットのサイズがユニバースのサイズよりも小さく、ユニバースに、選択された各値を持つ十分な数の個人が含まれており、ターゲットに到達する場合でも、失敗する可能性があります。値は実際には独立して配布されません。
サンプル ユニバースのすべての男性がオーストラリア人である場合を考えてみましょう。この場合、オーストラリア人を選択できる数だけ男性を選択でき、その逆も同様です。したがって、選択したすべてのオーストラリア人が男性であったとしても、一連の制約 (サブセット サイズ: 100; 男性: 40%; オーストラリア人 10%) は、そのようなユニバースからはまったく満たすことができません。
制約を変更すると (サブセット サイズ: 100; 男性: 40%; オーストラリア人 40%)、一致するサブセットを作成できる可能性がありますが、選択するオーストラリア人はすべて男性でなければなりません。制約を再度変更すると (サブセット サイズ: 100; 男性: 20%; オーストラリア人 40%)、一致するサブセットを作成できる可能性があります。この場合)。
この後者の場合、選択順序が重要になります。ランダム シードによっては、成功する場合もあれば、失敗する場合もあります。
このため、アルゴリズムは再試行する準備ができている必要があります (そして私の実装はそうしています)。私はこれを忍耐力テストと考えています。問題は、制約がサンプル母集団と互換性がないと判断する前に、何回失敗しても構わないと思っているかということです。
適合性
この方法は、説明したように、OP のタスク (特定の基準に一致するランダムなサブセットを選択する) に適しています。「与えられた基準でサブセットを形成する ことは可能ですか」というわずかに異なる質問への回答には適していません。
これについての私の理由は単純です。アルゴリズムがサブセットを見つけられない状況は、データに未知の連鎖が含まれている場合、または基準がサンプル ユニバースから非常に限られた数のサブセットを許可している場合です。このような場合、サブセットの使用は統計分析にとって疑わしいものであり、少なくともさらに考えなければなりません。
しかし、部分集合を形成できるかどうかという質問に答えるためには、この方法は非決定論的で非効率的です。他の人が提案した、より複雑なシャッフル アンド ソート アルゴリズムのいずれかを使用することをお勧めします。
事前検証:
すべてのサブセットが満たされるわけではないことを発見したときの当面の考えは、いくつかの初期検証を実行し、おそらくデータを分析して、回答可能か、条件付きでのみ回答可能かを確認することです。
私の立場は、各列ルールが有効であること (つまり、列のパーセンテージの合計が 100 になるか、十分に近いこと) と、サブセット サイズがユニバース サイズよりも小さいことを最初に検証する以外に、価値のある事前の検証は他にないということです。やっています。選択した値ごとに宇宙に十分な数の個人が含まれていることを確認する必要があるかもしれない (たとえば、宇宙には実際に 40 人の男性と 60 人の女性がいる) という議論をすることができますが、私はそれを実装していません。
それ以外では、母集団の関連性を特定するための分析自体に時間がかかるため、再試行回数を増やして実行するだけで十分な結果が得られる可能性があります。多分それは、統計の背景について話す私の不足です。
部分和の問題ではない
この問題は部分集合問題に似ていると考えられています。これは微妙ではあるが、かなり異なると私は主張する. 私の推論は次のとおりです: 部分集合和の問題では、部分集合がルールを満たしているかどうかの質問に答えるために、部分集合を形成してテストする必要があります: 追加する前に個々の要素をテストすることは (特定のエッジ条件を除いて) 不可能ですそれをサブセットにします。
ただし、OPの質問については可能です。後で説明するように、行をランダムに選択して個別にテストできます。これは、それぞれの重みが 1 であるためです。