これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?私が期待していることは次のとおりです。
配信プラットフォームで「すべてにフィット」をクリックすると、たくさんのフィットが表示されます

ただし、最適適合の AICc が正規分布の 5 以内であれば、正規適合を使用する方がよいでしょう。では、すでに最適適合が実行されている一連の列を調べ、選択された適合 (非正規であると想定) が正規分布に対して AICc の 5 以内であれば正規に調整するスクリプトを作成する方法はありますか? 許容できる AICc のデルタを入力するための入力ボックスを使用できるとボーナス ポイントになります。ダブル ボーナスは、これらの分布ではプロセス能力を計算できないため、選択オプションから Students t、Cauchy、および ExGaussian を削除することです (これは、このクリーンアップ スクリプトを実行した後の次のステップになります)。
試してみましたがうまくいきませんでした。ご協力いただければ幸いです。
スティーブ
自動化とスクリプトRe: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?
すでに最適なフィットが実行されている列の束を調べるスクリプトを作成する方法があれば
配布プラットフォームはまだ開いていて、すべての結果が含まれていますか、それとも結果はどこに保存されていますか? 比較配布を開いたままにしておく必要がありますか、それとも 1 つの配布が適合されていれば十分ですか?
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?こんにちは@jthi !
はい、プラットフォームは引き続きオープンで、最適な比較はすべて引き続き利用できます。比較ボックスが引き続き存在するのが理想的だと思いますが、最適な比較ボックスだけの方がずっと簡単なら、それで我慢できます。
ここから始めましょう

このようなフィットの場合、通常が選ばれるでしょうが、通常がリストのかなり下の方にあるとしたら、SHASHが選ばれるでしょう

ここでは、Johnson Sb の AICc 値の 5 以内であるため、正常が選択されます。

これがお役に立てば幸いです。ご覧いただきありがとうございます。
スティーブ
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?これには関連する 2 つの難しい点があります。JSL ではテーブル ボックスをデフォルトで並べ替えることができません (私の知る限り、多くのプラットフォームでこれが問題を引き起こします)。これにより、チェック ボックスを正しく設定することが難しくなります (チェック ボックスは他の値と同じ順序ではなく、常に並べ替えられるとは限らない可能性があります)。
このため、これがすべてのケースで機能するかどうかはわかりません (For なしで試してみましたが、順序が大きく変わりました)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
dt << Distribution(
Continuous Distribution(Column(:"pop- m"n), Process Capability(0)),
Continuous Distribution(Column(:POP), Process Capability(0)),
Continuous Distribution(Column(:Max deg. F Jan), Process Capability(0)),
Continuous Distribution(Column(:OZONE), Process Capability(0)),
Continuous Distribution(Column(:CO), Process Capability(0)),
Continuous Distribution(Column(:SO2), Process Capability(0)),
Continuous Distribution(Column(:NO), Process Capability(0)),
Continuous Distribution(Column(:PM10), Process Capability(0)),
Continuous Distribution(Column(:Lead), Process Capability(0)),
Continuous Distribution(Column(:X), Process Capability(0)),
Continuous Distribution(Column(:Y), Process Capability(0)),
Fit All
);
// Script basically starts from here
Names Default To Here(1);
obs = Current Report() << XPath("//OutlineBox[@helpKey='Distrib']");
If(N Items(obs) > 0,
dist = obs[1] << Get Scriptable Object;
);
obs = Report(dist) << XPath("//OutlineBox[text()='Compare Distributions']");
For Each({ob}, obs,
tb = ob[TableBox(1)];
vals = tb << get;
// Order might be incorrect in these
dists = vals["Distribution"];
normal_idx = Contains(dists, "Normal");
normal_aic = vals["AICc"][normal_idx];
m_aic = Matrix(vals["AICc"]);
// This comparison might require some fixes
ifs = (ob << parent) << XPath("//IfBox");
Remove From(ifs, 1, 2); // might require more robust method
fit_titles = (ifs << child) << get title;
If(Min(m_aic) >= normal_aic - 20 & normal_idx > 1,
For(i = 1, i <= N Items(dists), i++,
tb[1] << Set All(0);
tb[1] << Set(i);
idx = Contains(ifs << get, 1);
If(fit_titles[idx] == "Fitted Normal Distribution",
break();
);
);
);
);
Write();
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?スクリプトをありがとう@jthi !
実行してみたらこのエラーが発生しました

ログから:
/*:
'fit_titles[ /*###*/idx]'、fit_titles[/*###*/idx] のアクセスまたは評価における下付き文字の範囲
C:\Users\steve.hampton\OneDrive の 54 行目 - Precision Castparts Corp\Documents\Script 3.jsl
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?デバッグ プリントを追加して、どこで問題が発生しているかを確認する必要があります。ループを N Items(dists) から N Items(fit_titles) などに変更する必要があるかもしれません。
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?私は Jarmo のソリューションに似たアプローチを試みましたが、違いました。違いは、私が [分布の比較] アウトライン ボックスの下の [テーブル ボックス] のチェック ボックスを使用することを選択したことです。私の推論 (正しい) では、正規 AICc が実際に選択された分布の 5 以内であれば、JSL で行う必要があるのは、JMP が選択した分布のチェック ボックスの選択を解除し、正規分布のチェック ボックスを選択することだけです。JSL でこの選択解除と選択を行うと、ヒストグラムに正しい分布が表示されます。ただし、JSL 内からチェック ボックスを操作するために使用される通常のメッセージは、チェック ボックスを正しく返したり設定したりしないようです... テーブル ボックスに表示されるチェック ボックスを完全に理解していない限りは。
私が見つけたものについては以下をご覧ください
names default to here(1);
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/semiconductor capability.jmp" );
dist = dt << Distribution(
Continuous Distribution(
Column( :INM2 ),
Process Capability(0),
fit all(1)
)
);
// From the current report, find all of the Compare Distribution boxes
//dist =( current report() << xpath( "//OutlineBox[text()='Compare Distributions']" ));
// There is a bug in JMP where the check boxes return a standard order, not the order displayed
checkBoxOrder = {
"Normal",
"Cauchy",
"Student's t",
"Lognormal",
"Exponential",
"Gamma",
"Johnson Sb",
"SHASH",
"ExGaussian",
"Normal 2 Mixture",
"Normal 3 Mixture",
"Weibull"
};
distr = dist<<REPORT></REPORT>
<P>誰かが私のロジックまたは使用法の誤りを指摘してくれることを期待しています。そのような指摘が得られない場合は、JMP サポートに引き渡します。</P>Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?私の推測では、チェックボックスは実際にはテーブル ボックスに関連付けられていないため、テーブル ボックスを並べ替えても、チェックボックスは適切に並べ替えられません。また、デフォルトでは、テーブル ボックスは既に「デフォルト」とは異なる方法で並べ替えられています。そのため、インデックスが揃っていないため、どのインデックスがどの項目を設定するのかがわからないという非常に奇妙な状況に陥ります。そのため、非常に複雑な For ループを使用して、どのディストリビューションの Ifbox が有効になっているかを確認しました。
「デフォルト」の順序(JSLでは設定できず、プロセススクリーニングなどの他のプラットフォームでも問題が発生する)を使用すると、次のようになります。

これらはほとんどの場合「正しい」インデックスです。
現在の並べ替え順序 (または並べ替えに使用された列がわかっている場合) に基づいて、どのインデックスがどのインデックスであるかを計算できるかどうかはまだ試していません。
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?こんにちは@jthi 、
これに挑戦してくださって、改めて感謝します(と@txnelson )。コードをいじってみましたが、ほとんどの場合、かなりうまく機能しています。問題は、分布の比較が順序付けでどのように動作するかにあるようなので、すべての分布が残っていることを気にしないのであれば、次のような方法が機能すると思います。分布プラットフォームを実行してすべてを適合させ、次に比較分布出力の結合データ テーブルを作成し、新しいテーブルで、工程能力に使用できない 3 つの分布を削除します。次に、分布について、最適合の AICc と正規分布が着地する場所を比較します。次に、各変数について最適合または正規分布の適合を取り、残りをすべて削除します (したがって、このテーブルは分布プロパティ テーブルになります)。次に、制限管理プラットフォームを使用して、これらの分布をメイン テーブルの列プロパティとして適用し、最後に分布プラットフォームを再起動します。今週末に試してみて、うまくいくかどうかを確認したいと思います。
スティーブ
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?それが私の当初のアイデアであり、Compare Distributions を維持したいかどうかを尋ねた理由であり、それに従いました。異なるプラットフォーム間で名前を同じに保つことができれば、問題なく動作するはずです。
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?はい、できました!あまりうまく説明できていないと思いますが、他の人の役に立つかもしれないので、ここに投稿しました。
最初のステップは、分布を適合させるデータ テーブルの列を選択することです。
//rev 8-24-24
names default to here(1);
dt=current data table();
colnames=dt<<GET selected="" columns=""> expr(var1),
1
)
)
)
)));
dt1<< New Column( "Column 14 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
If( Is Missing( Col Maximum( :Column 13, :Y ) ) & :Column 10 == 2,
1
)
),
Set Selected
);
dt1 << New Column( "Column 14",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Sum( :Column 12, :Column 13,:Column 14 2 ) ),
Set Selected
);
wait(0);
// Delete column formula: Column 10
dt1:Column 10 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 11 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 12 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 13 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 14 << Delete Formula;
//Delete non-Normal fits that are wihtin our criteria
// Delete selected rows
dt1 << Select Where( :Column 14 == 1 ) <<
Invert Row Selection << Delete Rows;
//Puts all the Y's and distributiosn into lists
col={};
dist={};
for each row(dt1,
insertinto(col,:Y);
insertinto(dist,:Distribution);
);
close(dt1, nosave);
//bring back up the distribution platform but only with the Y's that we could fit a distribution to
rpt=new window("Best Distribution",
obj=dt<<DISTRIBUTION></DISTRIBUTION></GET>Thanks for the inspiration <A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> and <A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/2687" target="_blank">翻訳者</A> (I used a bunch of your other posts to help me get here)
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?よくやった。
あなたのスクリプトを読んで、いくつか変更を加えました。
- 列 10 の作成構文を、列 11 - 列 14 に使用される構文と同じになるように変更しました。使用している名前を変更することをお勧めします。現在の名前である列 10 などは、JMP が列を作成するときに使用する名前であり、デフォルトの列名が必要です。したがって、スクリプトを実行するデータ テーブルには、使用している名前のいずれかの列が含まれている可能性があります。この問題を回避するには、列 10 などを _列 10_ などに変更することをお勧めします。
- 新しい列のコードを、数式の指定から各値の設定を使用するように変更しました。数式は作成されないため、コードで削除する必要がなくなりますが、同じ機能が提供されます。
- リスト、col、Distを作成するために使用しているFor Each Rowを削除しました。これは単一のステートメントで実行できるため、データテーブルをループする必要がなくなります。
- また、コードの先頭にチェックを入れて、実際に選択されている列があるかどうかを確認し、選択されていない場合は、ユーザーに列を選択してスクリプトを再度実行するように指示するメッセージを表示することをお勧めします。
以下の変更をご覧ください
//rev 8-24-24
names default to here(1);
dt=current data table();
colnames=dt<<GET selected="" columns=""> expr(var1),
1
)
)
)
)));
dt1<< New Column( "Column 14 2",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Each Value( //Formula(
If( Is Missing( Col Maximum( :Column 13, :Y ) ) & :Column 10 == 2,
1
)
),
Set Selected
);
dt1 << New Column( "Column 14",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Each Value( //Formula(
Sum( :Column 12, :Column 13,:Column 14 2 ) ),
Set Selected
);
wait(0);
/*
// Delete column formula: Column 10
dt1:Column 10 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 11 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 12 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 13 << Delete Formula;
// Delete column formula: Column 11
dt1:Column 14 << Delete Formula;*/
//Delete non-Normal fits that are wihtin our criteria
// Delete selected rows
/*dt1 << Select Where( :Column 14 == 1 ) <<
Invert Row Selection << Delete Rows;*/
dt1 << delete rows( dt1 << get rows where( :Column 14 != 1) );
//Puts all the Y's and distributiosn into lists
/*col={};
dist={};
for each row(dt1,
insertinto(col,:Y);
insertinto(dist,:Distribution);
);*/
col = dt1:Y << get values;
dist = dt1:Distribution << get values;
close(dt1, nosave);
//bring back up the distribution platform but only with the Y's that we could fit a distribution to
rpt=new window("Best Distribution",
obj=dt<<DISTRIBUTION></DISTRIBUTION></GET>
<P> </P>
<P> </P>Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?@txnelsonありがとう!
これらの変更は素晴らしく、さらに学ぶことができました。お時間を割いてご協力いただき、誠にありがとうございます。
スティーブ
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?
これがあなたのスクリプトに基づいた私のアプローチです
Names Default To Here(1);
/*
dt = Open("$SAMPLE_DATA/Cities.jmp");
*/
NON_VALID_DIST = {"Cauchy", "ExGaussian", "Student's t"};
If(N Table() == 0,
Throw("No tables open");
);
dt = Current Data Table();
colnames = dt << Get selected Columns(continuous, "string");
If(N Items(colnames) == 0,
Throw("No continuous columns selected");
);
nw = New Window("What AICc is comparable?", Show Menu(0), Show Toolbars(0), <<MODAL> 1, // Normal isn't the only distribution
If(dt_fits[yrows[2], "AICc"] - same_limit <= dt_fits[yrows[1], "AICc"],
aa_y[ycol] = "Normal";
,
aa_y[ycol] = dt_fits[yrows[1], "Distribution"];
);
,
aa_y[ycol] = "Normal";
);
);
Close(dt_fits, No save);
dist = dt << Distribution(
Column(Eval(aa_y << get keys)),
Process Capability(0),
Invisible
);
For Each({{col, best_dist}, idx}, aa_y,
Eval(Substitute(
Expr(dist[idx] << _fit_),
Expr(_fit_), Parse("Fit " || best_dist); // I hate using Evil Parse, but in this case it might work as long as you "fix" Johnson fits
));
);
dist << Show Window(1);
Caption(Remove);
Write();</MODAL>
また、一度に 1 列ずつ、最適なフィットの最初の分布を作成することも検討します。最適なフィットの計算には長い時間がかかる可能性があるため、この方法では各列の後にキャプションを更新できます (進行状況バーの更新も検討できます)。
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?@jthi さん、ありがとうございます。ここでも学ぶべき良いことがたくさんあります! ご協力に感謝します!
スティーブ
Re: これは大きな質問かもしれませんが、最も適合した分布にかなり近い場合に正規分布を選択するためのスクリプトを誰か手伝ってくれませんか?また、複数の if ステートメントを if-elseif または Match に置き換えることもできます。私はこれらをテストしていませんが、アイデアは得られるはずです。
複数の if 文がある場合、常にすべてをチェックしますが、一致するのは 1 つだけです。if-elseif を使用すると、最初に見つかった一致 ( If() ) で停止します。
For(i = 1, i <= N Items(col), i++,
If(
dist[i] == "Normal", obj[i]<< Fit Normal,
dist[i] == "Exponential", obj[i]<< Fit Exponential,
dist[i] == "Gamma", obj[i]<< Fit Gamma,
dist[i] == "Johnson Su", obj[i]<< Fit Johnson,
dist[i] == "Lognormal", obj[i]<< Fit Lognormal,
dist[i] == "Normal 2 Mixture", obj[i]<<FIT normal="" 2="" mixture=""></FIT>
<P> </P>
<P> </P>
<P>そして<A href="https://www.jmp.com/support/help/en/18.0/#page/jmp/match-function.shtml#ww246655" target="_blank" rel="noopener noreferrer">Match()は</A>一般的に読みやすくなり、私の記憶が正しければ少し高速化もします。</P>
<P> </P>
<CODE class=" language-jsl">For(i = 1, i <= N Items(col), i++,
Match(dist[i],
"Normal", obj[i]<< Fit Normal,
"Exponential", obj[i]<< Fit Exponential,
"Gamma", obj[i]<< Fit Gamma,
"Johnson Su", obj[i]<< Fit Johnson,
"Lognormal", obj[i]<< Fit Lognormal,
"Normal 2 Mixture", obj[i]<<FIT normal="" 2="" mixture=""></FIT>
<P> </P>
<P> </P>