ビッグデータ / ゼロ分散による自動列削除こんにちは
列に少なくとも約 2000 個のパラメーターがある非常に大規模なデータセットを分析しています。 私のサンプルには、約 250,000 行のこれらのパラメーター値が含まれています。 私の問題は、行ではなく列にあります。
すべてのサンプルに対して離散分類が定義されており、2 つの離散値、たとえばクラス A と B があります。
別のソフトウェアでデータをさらに分析していますが、分散がゼロ(またはそれに非常に近い)のパラメーターが検出されると失敗します。
(2000 列から想像できるように) この作業を手動で実行したくありません。
クラス A または B のいずれかで分散がゼロの (または定義された非常に小さなしきい値を下回る) 列を削除する、できるだけ自動化された方法を探しています。 作業を完了するための手順を実行しますが、削除を行う列を手動で選択することはしたくありません。
助けていただければ幸いです。前もって感謝します。
Re: ビッグデータ / ゼロ分散による列の自動削除ブレイディ
以下のスクリプトは、あなたのものからわずかに変更されており、開始点となるはずです(しきい値と比較される標準偏差に若干の変更が加えられています)。 ご存知のとおり、この削除はスクリプトによって自動的に行われるため、さらに作業を進めるには実際のスクリプトが必要です。 次のフェーズの内部コード (JMP データ選択後) では、分散がゼロになった場合に特に問題が発生します。 以前のバージョン (つまり、以下) は、これらが取り出せることを証明しました。私は、平均差はあるが分散がゼロのパラメーターの削除を避けようとしています。
実際のパラメータの平均と分布に依存するしきい値を使用できません。例えば 実際の違いを特定することはできません。これには 2000 個のパラメータすべてを詳細に調べる必要があり、現実的ではありません。 言及したかどうかはわかりませんが、2000 年は氷山の一角にすぎず、さらに多くのことが起こるでしょう。 ただし、1 つのデータセットには約 2000 個のパラメーターが含まれています。
p_value を使用すると、内部コードでエラーを引き起こすパラメータに応じてパラメータをフィルタリングしたりフィルタリングしたりできます。 その観点からすると、t検定の方が良いのではないかと思います。 ただし、t 検定を挿入して p_value を抽出する方法がわかりません。追加のフィルターとして追加できます。
選択肢が2つあるような気がするんですが…
1) 2 サンプル平均値の比較を行わずに、以下のコードをそのまま使用します。 たとえ手段が異なっていても、そのようなケースはすべて削除されます。 次に、削除された列の名前を記録する必要があります (そのための助けが必要です)。これにより、研究全体の終了時に、それらに注意を向けて jmp で分析し、平均値の違いがあれば検出できるようになります。 これは、パーセンテージの点で、はるかに小さいパラメーター分析のセットになるため、ゼロ分散のケースはデータセットの非常に最小限の部分になると予想されます。
2) または、私の 2 番目のオプションは、有意差の母集団を微調整するために正規化されたしきい値を提供する t 検定またはその他の検定を追加することです。 例えば。 p_value を使用して重要性を確認または拒否できます。
どう思いますか ?
ありがとう
-------------------------------------------------- -------------------------------------------------- -------------
名前のデフォルトは Here( 1 );
dt = 現在のデータテーブル();
dtcol1 = 列(dt, 1);
dt1 = dt << subset(rows(dt< dt2 = dt << subset(rows(dt<
// すべての連続データ列を取得します
ColList = dt << 列名を取得(数値、連続);
// すべての列をループし、分散のない列を見つけます
For( i = N Items(collist)、i >= 1、i--、
If( (Col Std Dev( Column( dt1,colList[i] ) ) ) >= 0.01 & Col Std Dev( Column( dt2,colList[i] ) ) >= 0.01、
ColList = 削除(colList, i, 1 )
)
);
// 差異のない列を削除します
dt<<列を削除(colList);
閉じる(dt1、nosave);
閉じる(dt2、nosave);
注: 標準デバイスのしきい値は確定していません。 0.01 は一例にすぎません。 それを微調整します。
Re: ビッグデータ / ゼロ分散による列の自動削除<<列数である ~2,000 ではなく、~250,000 行であることを反映するために編集されました。>>
Altug さん、明確にしておきたいことがあります。2 つのグループに約 250,000 行のデータがあり、(デフォルトでは) ほぼ同じサイズであると想定しています。 そうであれば、各グループの 125,000 サンプルを使用した t 検定の検出力 = 0.9 で、1/50 シグマ未満の差を検出できます。 一方または両方のシグマ レベルが非常に低い場合にのみこの点 (テスト手段) に到達することを考えると、(シグマと比較して) それほど小さい差は実用上重要だと感じられますか? つまり、シグマがおおよそ 1 単位である 2 つのプロセスがある場合、平均値の 0.018 単位の差は問題になりますか? これは、各グループに 125,000 個の項目がある場合の t 検定の感度を表します。
設定においてそのような小さな差が重要ではない場合は、差がどの程度大きいかを指定できる同等性検定 (最も単純な形式 2、同時片側 t 検定) を使用した方がよいでしょう。意味があります。 この量未満の差がある平均は、実質的に同等であるとみなされます。 このアプローチを使用すると、平均が実質的に同等であり、グループ標準偏差の少なくとも 1 つがしきい値を下回っている限り、特定の列が削除されます。
以下にいくつかの情報と例を示します。
http://www.jmp.com/support/help/Equivalence_Test.shtml
Re: ビッグデータ / ゼロ分散による列の自動削除ありがとうデュアン。
パラメーターがクラス A とクラス B で異なるかどうかを、特定の出力と比較を介してスクリプト内で判断しようとしています。 私は結果の中間表を分析して決定を下そうとしているわけではありません。
特定のデータセットに 2000 のパラメーター列があり、同等のサイズのデータセットが多数あります。
このプロシージャでは、指定されたパラメーターについて、2 つのクラス A と B の間でほぼ同じであると検出された関連列を自動削除する必要があります。
私は最初、これをゼロ分散探索ロジックとして書き留めましたが、問題は、分散がゼロであるが平均値が異なる 2 つのパラメーターを削除すべきではないということです。 そのとき、私は 2 つのサンプルの平均検定を比較する検定を含めるようにロジックを変更し始めました。
私の問題は、私がスクリプト作成に非常に初心者であり、特定のプラットフォームの結果からパラメーターを呼び出す方法がわからないことです。
私たちのデータに関するもう 1 つの問題は、スクリプト内ですべてのパラメーターを指定しており、このようなことを行うと、非常に時間がかかることが判明する可能性さえあるということです (十分に簡単な方法があるかもしれません)。
実際、Brady のスクリプトはほぼ完璧ですが、平均値の 2 サンプル テストを追加し、その出力を追加のフィルターとして使用する方法を知る必要があります。
ご協力いただきありがとうございます。
Re: ビッグデータ / ゼロ分散による列の自動削除正確なテストの計算には非常に長い時間がかかる可能性があり、データ テーブルに 250,000 行があることを考えると、この状況ではテストは計算されないと思います。代わりに、
Summarize YByX()
すべての Fit Y By X の組み合わせを計算し、各 y/x 組み合わせの p 値と LogWorth 値のデータ テーブルを生成するコマンド。その後、さらに調査するための正しい列を決定できます。別のステップでゼロ分散をテストする必要があります。
Re: ビッグデータ / ゼロ分散による列の自動削除ブレイディ
メカニズムを理解するために、サンプル データセット (まだ巨大ではありません) でこれをテストしました。 st にしきい値を設定するように変更することができました。開発者。 0を求めるのではなく。 私の残りの問題は、次のような場合にデータを削除したくないことです。
stdev<=threshold (つまり、0 に近い) かつ (クラス A と B に対するパラメータの) データの平均が異なります。
したがって、さらに追加の制約として、A と B の平均を比較するテストを追加する必要があります。
私はコルモゴロフ・スミルノフ検定を考えていました...その場合は、単に「KS <= しきい値(実際には0に近い)の場合にパラメーターを削除する」と述べることができます。
実際、私がやろうとしているのは、次のステップで異なるパラメータを選択することです。 そこで私は、KS を適用するだけが最善の方法かもしれないと考え始めました (stdev は必要ありません)。
JMP ヘルプが提供する
名前のデフォルトは Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Oneway( Y( :身長 ), X( :性別 ) );
obj << コルモゴロフ・スミルノフの正確検定( 1 );
これを私の場合に(現在のループ内で)次のように翻訳できますか
obj=Oneway( Y(:Column( dt1,colList[i] ), X( Column( dt2,colList[i] ) ) );
obj << コルモゴロフ・スミルノフの正確検定( 1 );
しかし、このobjオブジェクトからKS値を抽出する方法がわかりません。
ちなみに、私はデータへの手動操作を避けるためなら何でもするつもりなので、2000 列の CPU 時間は気にならないと思います。
とても。
Re: ビッグデータ / ゼロ分散による列の自動削除ジム、
ここでのご指導に感謝します。 試してみます。またまたね。
Re: ビッグデータ / ゼロ分散による列の自動削除ブレイディさんの理解は正しいです。強調すべき点は、250,000 行の場合、これは 2000 x 250,000 の行列になることです。
Re: ビッグデータ / ゼロ分散による列の自動削除そして、このチャンクと前のチャンクの比較では、選択の反転と 2 回の選択により、さらに 10 分の 1 秒の時間がかかります。 大きなテーブルほど大きな利益が得られます。
dtcol1 = column(dt, 1);
dt << select where(ascolumn(dtcol1) == dtcol1[1]);
dt1 = dt << subset(selected rows(1), invisible, selected columns(0));
dt << Invert Row Selection;
dt2 = dt << subset(selected rows(1), invisible, selected columns(0));
Re: ビッグデータ / ゼロ分散による列の自動削除Altug さん、コードを少しテストしました。明示的なループは避けられますが、これは良いことですが、<< すべての値を行列として取得する関数は、テーブルが大きくなるとコストが高くなり、(もしあれば)利益が得られます。 vstd() とテーブル操作の違いは、これを相殺するには小さすぎます。
あなたの規模のテーブルの場合、(グループを許可するために) Jim のコードを変更すると、より高速になります。 これの中心となるのは、JMP テーブルの操作が非常に高速であるという事実です。 行列演算も非常に高速ですが、列関数よりも高速であるということさえ確信できません。
行のサブセットを何度も取得するのはコストがかかるため、最初にテーブルをサブセット化して 2 つのサブテーブル (グループごとに 1 つ) を作成することは、十分な効果があります (3 つのテーブルすべてを格納するのに十分なメモリがあると仮定します)。
以下のコード (これも、2 つのグループを考慮して Jim のコードを少し変更したものです) は、100K 行、1K 列に対して約 2.5 秒で実行されましたが、最初に送信したルーチンは 6 秒以上かかりました。
あなたくらいのサイズのテーブルでは、これはまだ少し遅いように見えます...うまくいけば、他の誰かがより良いアイデアを持っています。
Names Default To Here( 1 );
dt = current datatable();
dtcol1 = column(dt, 1);
dt1 = dt << subset(rows(dt<<GET rows="" where="">= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) != 0 & Col Std Dev( Column( dt2, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE></GET>
Re: ビッグデータ / ゼロ分散による列の自動削除アルトゥグ
私があなたの問題を正しく理解していれば:
- 2 つの値 (たとえば、「A」と「B」) を含む列 (たとえば、Group という名前) があるとします。
- 数値データを含む列が 2000 個あります。
- 「A」グループに属する行、または「B」グループに属する行の標準偏差が一定のしきい値(またはその両方)を下回っている列を削除したいと考えています。
このサイズのテーブルでは、パフォーマンス (およびメモリ使用量) が問題になります。 あなたが持っているサイズのテーブルで以下が機能するかどうか、またはすぐに機能するかどうかはわかりませんが、試してみてください。
まず、「a/b」列が最初の列で、残りの列が対象のパラメーター列であるテーブルを作成します。
それならこれを試してみてください。<BR />
乾杯、
ブレイディ
dt = Current Data Table();
mat = dt << Get All Columns As Matrix(); //this get the A/B column as 1s and 2s. which is which not important.
//create subtables... note A & B will be reversed if B occurs first in dt; the result is unaffected.
matA = mat[loc(mat[0,1]==1), 0];
matB = mat[loc(mat[0,1]==2), 0];
//compute stddevs for each column in each subtable
stdvA = vstd(matA);
stdvB = vstd(matB);
//locate columns of sufficiently low variance
cols = loc(stdvA == 0 | stdvB == 0);
//delete them. Ignore row (1) of the cols vector; it is 1 (corresponding to column 1 in dt).
try(dt << delete columns((dt << get column names)[cols[2::nrow(cols)]]));
Re: ビッグデータ / ゼロ分散による列の自動削除これは、必要なことを実行する簡単なスクリプトの例です。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// Get all continuous data columns
colList = dt << get column names( numeric, continuous );
// Loop across all columns and find those with no variance
For( i = N Items( collist ), i >= 1, i--,
If( Col Std Dev( Column( dt, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE>