어려운 질문일 수도 있지만, 가장 적합한 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?그럼 제가 바라는 바는 다음과 같습니다.
Distribution 플랫폼에서 모든 것을 맞추기 위해 클릭하면 많은 것을 얻을 수 있습니다.

그러나 가장 적합한 AICc가 정규 분포의 5 이내에 있으면 정규 적합을 사용할 수도 있습니다.그러니 이미 가장 적합한 AICc가 실행된 여러 열을 살펴보고 정규 분포의 AICc가 5 이내에 있으면 선택한 적합(비정규적이라고 가정)을 정규로 조정하는 스크립트를 작성할 방법이 있을까요?보너스 포인트는 기꺼이 사용할 수 있는 AICc의 델타를 입력할 수 있는 입력 상자가 있다는 것입니다.더욱이 보너스는 이러한 분포에서 프로세스 능력을 계산할 수 없으므로 Students t, Cauchy 및 ExGaussian을 선택 옵션에서 제거하는 것입니다(이것은 이 정리 스크립트를 실행한 후 실행할 다음 단계입니다).
저는 시도해 보았지만 작동하지 않습니다. 도움을 주시면 정말 감사하겠습니다!!
스티브
자동화 및 스크립팅Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?
이미 가장 잘 맞는 것을 실행한 여러 열을 거쳐가는 스크립팅 방법이 있다면
Distribution 플랫폼은 여전히 열려 있고 모든 결과가 있나요? 아니면 결과는 어디에 저장되어 있나요? Compare Distributions를 열어두어야 하나요? 아니면 하나의 Distribution만 맞춰도 충분하나요?
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?안녕하세요 @jthi !
네, 플랫폼은 여전히 열려 있고 모든 최적 비교는 여전히 거기에 있습니다. 이상적으로는 비교 상자가 여전히 거기에 있지만 그것이 훨씬 더 쉽다면 최적 비교로 살 수 있습니다.
그래서 여기서 시작해요

그리고 이와 같은 적합성에 대해서는 normal이 선택될 것입니다. 그러나 Normal이 목록의 훨씬 아래에 있는 경우 SHASH가 선택될 것입니다.

여기서는 Johnson Sb의 AICc 값의 5 이내에 있으므로 normal이 선택됩니다.

도움이 되길 바라며, 이 글을 읽어주셔서 감사합니다!
스티브
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?여기에는 관련된 두 가지 어려운 점이 있습니다. 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 - Precision Castparts Corp\Documents\Script 3.jsl의 54번째 줄에서
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?디버그 프린트를 추가하고 어디에서 잘못되었는지 확인해야 합니다. 루프를 N Items(dists)에서 N Items(fit_titles)로 변경해야 할 수도 있습니다.
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?저는 Jarmo와 비슷한 해결책에 접근하려고 했지만 다릅니다. Compare Distributions Outline Box 아래의 Table Box에 있는 Check Box를 사용하기로 했다는 점에서 다릅니다. 저는 (올바르게) Normal AICc가 실제로 선택된 분포의 5 이내에 있다면 JSL에서 해야 할 일은 JMP에서 선택한 분포에 대한 체크 박스의 선택을 취소하고 Normal Distribution에 대한 체크 박스를 선택하는 것뿐이라고 추론했습니다. 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 )! 저는 코드를 가지고 놀았고 대부분 잘 작동합니다. 문제가 Compare Distributions가 순서를 처리하는 방식인 것 같으므로 모든 분포가 그대로 있어도 상관없다면 다음과 같은 방법이 효과가 있을 것 같습니다. 분포 플랫폼을 실행하고 모두 맞춘 다음, 비교 분포 출력의 결합된 데이터 테이블을 만들고, 새 테이블에서 프로세스 역량에 사용할 수 없는 세 분포를 제거한 다음, 정상 위치와 상위 적합의 AICc에 대한 분포를 비교한 다음, 각 변수에 대한 상위 적합 또는 정상 적합을 취하고 나머지는 모두 삭제합니다(따라서 이 테이블을 분포 속성 테이블로 만듭니다). 그런 다음, Manage Limits 플랫폼을 사용하여 이러한 분포를 주 테이블의 열 속성으로 적용한 다음 마지막으로 분포 플랫폼을 다시 시작합니다. 이번 주말에 시도해보고 효과가 있는지 보고 싶습니다.
스티브
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">@txnelson</A> (I used a bunch of your other posts to help me get here)
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?좋은 일이에요.
귀하의 대본을 살펴보고 몇 가지 변경 사항을 적용했습니다.
- 열 10을 만드는 구문을 열 11 - 열 14에 사용된 구문과 동일하게 변경했습니다. 사용 중인 이름을 변경하는 것이 좋습니다. 현재 이름인 열 10 등은 JMP에서 열을 만들 때 사용하는 이름이며 기본 열 이름이 필요합니다. 따라서 스크립트를 실행할 데이터 테이블에 사용 중인 이름 중 하나를 가진 열이 있을 가능성이 높습니다. 제 제안은 문제를 피하기 위해 열 10 등을 _열 10_ 등으로 변경하는 것입니다.
- New Column 코드를 수식 지정에서 Set Each Value 사용으로 변경했습니다. 동일한 기능을 제공하지만 수식을 만들지 않고, 결국 코드에서 삭제해야 합니다.
- 목록을 만드는 데 사용하는 For Each Row, col 및 Dist를 제거했습니다. 이는 단일 명령문으로 수행할 수 있으므로 데이터 테이블을 반복할 필요가 없습니다.
- 또한 코드의 시작부분에 실제로 선택된 열이 있는지 확인하는 검사를 넣고, 그렇지 않은 경우 사용자에게 열을 선택하고 스크립트를 다시 실행하라는 메시지를 표시하는 것이 좋습니다.
아래에서 내 변경 사항을 확인하세요
//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>
또한 한 번에 한 열씩 가장 잘 맞는 첫 번째 분포를 만드는 것도 고려할 것입니다. 이렇게 하면 각 열마다 캡션을 업데이트할 수 있으므로 가장 잘 맞는 것을 계산하는 데 시간이 오래 걸릴 수 있습니다(진행률 표시줄을 업데이트하는 것도 고려할 수 있음).
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?@jthi 감사합니다. 여기서도 배울 만한 좋은 내용이 많이 있네요! 모든 도움에 감사드립니다!
스티브
Re: 어려운 질문일 수도 있지만, 최적 분포에 매우 가까운 정규 분포를 선택해 볼 수 있는 스크립트를 도와줄 수 있는 분이 있을까요?또한, 여러 if-statement를 if-elseif 또는 Match로 바꿀 수 있습니다. 저는 이것들을 테스트하지 않았지만, 이것들이 아이디어를 줄 것입니다.
여러 if 문이 있는 경우 항상 모든 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>