這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?所以這就是我所希望的:
當您在分銷平台中單擊“全部適合”時,您會得到很多適合

但是,如果最佳擬合的 AICc 在常態分佈的 5 以內,您也可以使用常態擬合。 Sooooooo,如果有一種方法可以編寫腳本,通過一堆已經運行了最佳擬合的列,然後將選定的擬合(假設它是非正常的)調整為正常(如果它在AICc 為5 的範圍內)常態分佈?獎勵積分是能夠有一個輸入框來輸入您願意接受的 AICc 的增量。雙重好處是從選擇選項中刪除 Students t、Cauchy 和 ExGaussian,因為您無法計算這些分佈的處理能力(這將是執行此清理腳本後要執行的下一步)。
我已經嘗試過但無法讓它工作,任何幫助將不勝感激!
史蒂夫
自動化和腳本編寫回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?
是否有一種方法可以編寫一些腳本來遍歷一堆已經運行了最適合的列
分發平台是否仍然開放並且擁有所有結果或結果儲存在哪裡?您是否需要保留比較分佈,或擬合一個分佈就足夠了?
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?嘿@jthi !
是的,平台仍然是開放的,所有最合適的比較仍然存在。我認為理想情況下,比較框仍然存在,但如果更容易的話,我可以選擇最合適的。
所以從這裡開始

對於這樣的擬合,會選擇正常,但是假設正常在列表中很靠後,那麼會選擇 SHASH

這裡選擇正常值,因為它在 Johnson Sb 的 AICc 值的 5 以內。

希望這會有所幫助,並感謝您查看此內容!
史蒂夫
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?與此相關的有兩個困難的事情:您不能使用 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();
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?感謝您的腳本@jthi !
我嘗試運行它並收到此錯誤

從日誌中:
/*:
訪問或評估 'fit_titles[ /*###*/idx]' 、 fit_titles[/*###*/idx] 時的下標範圍
位於 C:\Users\steve.hampton\OneDrive 中的第 54 行 - Precision Castparts Corp\Documents\Script 3.jsl
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?您必須開始添加調試列印並檢查哪裡出了問題。您可能必須將循環從 N Items(dists) 更改為 N Items(fit_titles) 或其他內容。
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?我嘗試採用類似 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>回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?我的猜測是,複選框並未真正與表格框相關聯 -> 當您對錶格進行排序時,複選框不會正確排序。然後預設情況下,表格框已經以與“預設”不同的方式排序。因此,您最終會遇到非常奇怪的情況,您不知道哪個索引設定哪個項目,因為它們沒有對齊。這就是為什麼我使用非常複雜的 For 迴圈並檢查啟用了哪個發行版的 Ifbox。
如果您使用「預設」順序(無法使用 JSL 設置,這會導致其他平台出現問題,例如流程篩選),您會得到以下結果

這些是最常見的“正確”索引。
我還沒有嘗試過您是否可以根據當前排序順序(或知道使用哪一列進行排序)來計算哪個索引是哪個索引。
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?嘿@jthi ,
再次感謝您對此的嘗試(和@txnelson )!我一直在研究程式碼,大多數時候它都運行得很好。由於問題似乎在於比較發行版與排序的行為方式,我認為如果我不關心所有發行版仍然存在,類似這樣的事情應該會起作用:運行發行平台並適合所有發行版,然後製作一個比較分佈輸出的組合資料表,在新表中刪除不能用於製程能力的三個分佈,然後對頂部擬合的AICc 的分佈與正常落地的分佈進行比較,然後取每個變數的頂部擬合或正態擬合並刪除所有其餘部分(從而使該表成為分佈屬性表),然後使用管理限制平台將這些分佈應用為主表上的列屬性,最後重新啟動分佈平台。我希望這個週末能嘗試一下,看看是否有效。
史蒂夫
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?這是我最初的想法,這就是為什麼我問你是否確實想保留比較分佈,所以我同意了。只要您可以在不同平台之間保持相同的名稱,它就應該可以正常工作。
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?好吧,我到了!我確信它不是很雄辯,但我想把它扔在那裡,以防它對其他人有幫助。
第一步是在資料表中選擇要擬合分佈的資料列。
//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">@tx尼爾森</A> (I used a bunch of your other posts to help me get here)
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?幹得好。
我瀏覽了你的腳本並做了一些更改。
- 我將建立第 10 列的語法變更為與用於列 11 - 14 列的語法相同。目前名稱、Column 10 等是 JMP 建立列時使用的名稱,需要預設列名稱。因此,您要執行腳本的資料表很可能有一列是您正在使用的名稱之一。我的建議是簡單地將 Column 10 等更改為 _Column 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>回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?謝謝@txnelson !
這些變化是巨大的,幫助我學到了更多。非常感謝您的時間和幫助!
史蒂夫
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?
這是我根據您的腳本採取的方法
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>
我也會考慮建立第一個分佈,以便當時最適合一列。這樣,您可以在每列之後更新標題,因為計算最佳擬合可能需要很長時間(也可以考慮更新進度列)。
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?謝謝@jthi ,這裡也有很多值得學習的好東西!感謝所有的幫助!
史蒂夫
回覆:這可能是一個很大的問題,但是有人可以幫助編寫一個腳本來嘗試選擇一個非常接近最佳擬合分佈的常態分佈嗎?此外,您可以將多個 if 語句替換為 if-elseif 或 Match。我還沒有測試過這些,但這些應該可以提供一個想法。
對於像您這樣的多個 if 語句,它總是會檢查所有這些語句,但只有一個應該匹配。如果您使用 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>