数千の特徴に対するウィルコクソン順位和テストのスクリプトを作成する方法

専門家の皆様、こんにちは。私は JMP のユーザーです。 私は、何千もの特徴に対するウィルコクソンの順位和テストの結果を計算するスクリプトの書き方を学ぶために書いています。 グループ化と機能 (feature_1 から feature_n まで) のテーブルは上図のように添付されます。 ここで私がやろうとしていることは次のとおりです。
1) 「」のウィルコソン順位和検定治療 A と治療なし」 feature_1 から feature_2000 まで。 「fit Y by X」関数を使用する必要があることを理解しています。 X はグループ化 (治療) である必要があります。 Y は、feature_1、2....n に対応する値である必要があります。
2) 私はそれを男らしく行う方法を理解しています。 各機能のコードは次のようになります。
フィットグループ(
Oneway( Y( :Feature_1 )、X( :Treatment )、ウィルコクソン テスト( 1 ) )、
しかし、「処理なし」と「処理 A」のみを持つ列項目を選択させるスクリプトの書き方がわかりません。そして、機能 1 を終了し、次に機能 2 を終了し、機能 2000 までループとして実行する方法を説明します。
私はスクリプト ガイドを読むために最善を尽くしました。 しかし、基本的な概念を理解することしかできず、実際に解決することはできません。 ここにいる誰かが少なくともここで手を貸してくれれば、私は本当に感謝します。
どうもありがとう..
最高、
ウィンダミア
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法はい...あなたは正しいです。 $を使用すべきではありません。
ありがとう
あなたとジムの解決策は両方とも今はうまくいくと思います
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法ついに、それは機能します...
それは良い学びの経験です。
ありがとう
ウィンダミア
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法開こうとしているファイルのファイル名の先頭に「C」(「$C」ではありません)が必要なだけだと考えてください。
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法こんにちは、ジム。SAMPLE_DATA ではなく、ウィンドウの下のどこかにあるデータセットを開こうとすると、たとえば次のようになります。「C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp」
こう書けばいいのでしょうか?
dt= Open("$C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp");
ありがとう
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法dt = Open( "$C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp" );
colList = dt << Get Column Names( Continuous );
dt2 = dt << Stack(
columns( colList ),
source Label Column( "Feature" ),
Stacked Data Column( "Data" ),
Output Table( (dt << getName) || "Stacked" )
);
Close( dt, NoSave );
ow = dt2 << Oneway(
Y( :Data ),
X( :Treatment ),
wilcoxon Test( 1 ),
By( :Feature )
);
firstOwRep = Report( ow[1] );
dt3 = firstOwRep[Table Box( 3 )] << makeCombinedDataTable;
dt3 << setName( "One Way Chisquare Results By Feature" );
これは、最新の提案に基づいて私が書いたものです。
まだ機能していません... 
実行してみると。 まったく反応がありません...
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法ここでは、やりたいことを実行する例を示します。多数の連続変数を含むサンプル データ テーブルを使用しています。連続列の 1 つの名前を「Feature_1」に変更して、ターゲットとしている列の名前を模倣します。次に、「Feature_1」列の前に表示されるすべての連続列をcolListから削除し、残りのすべての列に対して分析を実行します。
Names Default To Here( 1 );
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// For illustration, change the name of one of the columns to "Feature_1"
Column( dt, 10 ) << set name( "Feature_1" );
/* Obtain a list of numeric/continuous column names */
colList = dt << Get Column Names( Continuous );
// Remove from the list of columns, all columns before the column called
// "Feature_1"
If( Contains( colList, Parse( "Feature_1" ) ) > 1,
colList = Remove( colList, 1, Contains( colList, Parse( "Feature_1" ) ) - 1 )
);
// Run the analysis
Fit Group(
Oneway( Y( Eval( colList ) ), X( :Wafer ), Wilcoxon Test( 1 ) ),
// If you want all of the outputs in a single row and you don't
// know how many there will be, a simple way to handle this is
// to just specify a large number
<<{Arrange in Rows( 200 )}
);
時間をかけてスクリプト ガイドを読んで、スクリプトとは何かを学んでください。
ヘルプ==>書籍==>スクリプトガイド
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法ごめんなさい。 まだ機能しません。
特定のケースについて誰かが手伝ってくれるのではないかと思います。 申し訳ありませんが、Feature_1 という列から最後までのループの書き方がわかりません。 それに関するスクリプトの書き方を誰が説明できるかを本当に願っています。
ありがとう
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法考慮すべきもう 1 つのオプションは、JMP 応答スクリーニング機能です。 順位和検定は行わず、t 検定またはロバスト検定 (外れ値を軽減するため) を実行します。 高速に実行され、p 値の表、有意性と効果の大きさのグラフが提供されます。そして何よりも「選択したものに適合」オプションがあるため、最も関心のある特徴の Y 個を X 個に簡単に適合させることができます。 2000 個の特徴のサブセットに対して Wilcoxon テストを実行できます。
https://www.jmp.com/support/help/14/response-screening.shtml
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法ジムはすでにあなたに素晴らしい助けと指導を与えてくれています。
私の理解が正しければ、2,000 を超える機能がある可能性があるため、それらのループを回避する方がわずかに効率的である可能性があります。 また、2,000 件のレポートを見るのは大変なことなので、何らかの方法で結果を要約する必要があるでしょう。
この場合、確かにループを回避できるので、JSL をさらに進めるために、以下のコードがどのように機能するかを理解するとよいでしょう。 一般に、データをスタックし、「By」変数を使用することは、注意すべき良いコーディング パターンです。 もちろん、この例には 2 つの「特徴」(高さと重さ) しかありません。
// Open a sample data table
dt = Open( "$SAMPLE_DATA\big class.jmp" );
// Obtain a list of column names containing the 'features'
colList = dt << Get Column Names( Continuous );
// Stack the data
dt2 = dt << Stack(
columns( colList ),
Source Label Column( "Feature" ),
Stacked Data Column( "Data" ),
Output Table( (dt << getName)||" Stacked" )
);
Close(dt, NoSave);
// Do the Wilcoxon tests all at the same time (this will be a list, due to the use of the 'By' variable)
ow = dt2 << Oneway( Y( :Data ), X( :sex ), Wilcoxon Test( 1 ), By(:Feature) );
// Get a link to the first report
firstOwRep = Report(ow[1]);
// Get the one way ChiSq results from ALL reports (features) into a single table
dt3 = firstOwRep[TableBox(3)] << makeCombinedDataTable;
dt3 << setName("One Way ChiSquare Results By Feature");
もちろん、統計テストを何千回も適用する場合、誤報率が必然的に高くなるということを考慮する必要があります。
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法ありがとう。私がスクリプトライティングのトレーニングや経験を持っていないというのは、まったくもって正しいことです。
もう一度試してみます、また読む必要があります。 理解できないことがあれば、ここに投稿しても構いません...
ご不便をおかけして誠にありがとうございます。
最高、
ウィンダミア
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法以下は、必要なものを提供する注釈付きのスクリプトです。
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\big class.jmp" );
/* Obtain a list of numeric/continuous column names */
colList = dt << Get Column Names( Continuous );
// If you run a Oneway analysis, and specify to Arrange in Rows
// and then save the script, it generates
/*
Fit Group(
Oneway( Y( :height ), X( :sex ) ),
Oneway( Y( :weight ), X( :sex ) ),
<<{Arrange in Rows( 200 )}
)
*/
// A little modification to include all of the columns that
// were extracted using the << Get Columns Names message, and
// the script below will give you what you want
Fit Group(
Oneway( Y( Eval( colList ) ), X( :sex ) ),
// If you want all of the outputs in a single row and you don't
// know how many there will be, a simple way to handle this is
// to just specify a large number
<<{Arrange in Rows( 200 )}
);
上記のスクリプト内のすべての関数とメッセージは、スクリプト インデックスの例とともに文書化されています。
ヘルプ==>スクリプトインデックス
JSL の構造とメソッドは、スクリプト ガイドに記載されています。
ヘルプ==>書籍==>スクリプトガイド
ただし、現時点ではプログラミングの知識と経験が限られているようです。プログラミング入門に関する数多くの書籍の中から一冊を手に取ることを強くお勧めします。「JMP スクリプト言語のプログラミング入門」に関する本は見つかりませんが、本当に必要なのはプログラミングの概念を学ぶことです。それが理解されれば、プログラミングの世界で言語を切り替えるのは、新しい言語の新しい構文を学ぶだけの簡単な作業になります。
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法
/* Open a sample data table */
dt = Open( "$Sheet1.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Feature_1( Continuous, String );
For( i = 2, i <= N Items( colList ), i++, );
Oneway(
Y( :colList ),
X( :Treatment ),
Wilcoxon Test( 1 )
);
<<{Arrange in Rows( 1 )};
これは私が使用したスクリプトです。
残念ながら、
まったく機能しません..
応答がありません。
理由を知っている人はいますか?
ありがとう
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法こんにちは、txnelson さん
助けてくれてありがとう。 以下のことを正しく理解していることを確認したいだけです。
1.
<SPAN class="token comment">/* Obtain a list of numeric/continuous column names as strings */</SPAN>
colList <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get Column Names</SPAN><SPAN class="token punctuation">(</SPAN> Continuous<SPAN class="token punctuation">,</SPAN> String <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
私のテーブルでは、次のように書く必要があります
colList <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> "Feature_1"</SPAN><SPAN class="token punctuation">(</SPAN> Continuous<SPAN class="token punctuation">,</SPAN> String <SPAN class="token punctuation">); <BR /></SPAN>
それが正しいか?
2.
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> <SPAN class="token function">Nitems</SPAN><SPAN class="token punctuation">(</SPAN> colList <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,</SPAN>
私の場合、次のように書く必要があります
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">0</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> feature_2000<SPAN class="token punctuation">(</SPAN> colList <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,)</SPAN>
あれは正しいですか?
i=0、i=1、i=2 の意味がよくわかりません。 説明してもらえますか?
「Nitems」を最後の列 (feature_2000) の列名に変更する必要があります。 私の理解は正しいでしょうか?
また、このループを停止するには「)」が必要ですか? 以下に示したテンプレートには「)」がありませんでした。
ありがとう。
明日スクリプトを試してフィードバックをお送りします。
ウィンダミア
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法列間をループしてプラットフォームの 1 つを実行することは、ディスカッション フォーラムで処理される最も一般的な項目の 1 つです。「ループ」で検索すると、複数の選択肢が表示されます。以下は、列間でループし、グラフ ビルダー プラットフォームを実行する例から抜粋したループの例です。一方向プラットフォームのループは非常に似ています。
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\Fitness.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Get Column Names( Continuous, String );
/* Loop through the list to generate the desired Graph Builder
and save the report as a JPEG file */
For( i = 2, i <= Nitems( colList ), i++,
gb = dt << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :Age ),
Y( Column( dt, colList[i] ) ),
Color( :Age )
),
Elements(
Points(
X,
Y,
Legend( 3 ),
Summary Statistic( "Mean" ),
Error Bars( "Confidence Interval" )
)
),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 5 )}
)
),
Invisible
);
gb << Save Picture( "E:\Trash\Graph Builder_" || colList[i] ||".jpg", JPEG );
);
/* Close table and all invisible reports */
Close( dt, No Save );Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法こんにちは、
グループ情報を選択するための解決策をありがとうございます。
しかし、feature_1 から feature_2000 までのテストをループとして実行するにはどうすればよいでしょうか? その解決策も教えていただけませんか?
ありがとう
ウィンダミア
Re: 数千の特徴量に対する Wilcoxon 順位和テストのスクリプトを作成する方法すぐにわかる 2 つの解決策は、「処理なし」または「処理 A」を持たないすべての行の行状態を「非表示および除外」に設定してから、Fit Y by X 分析を実行することです。
names default to here(1);
dt=current data table();
dt << select where(:treatment !="No Treatment" & :treatment !="Treatment A");
<BR />dt << Hide and Exclude;
dt << Fit Group(
Oneway(………………………..));
または、「治療なし」行と「治療 A」行のみを含む新しいテーブルにデータのサブセットを作成し、分析を実行します。
names default to here(1);
dt=current data table();
dt << select where(:treatment =="No Treatment" | :treatment !=="Treatment A");
dt2=dt<<SUBSET></SUBSET>