Potrebbe sembrare una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ecco cosa spero:
Quando clicchi su "Adatta tutto" nella piattaforma di distribuzione, ottieni molti adattamenti

Tuttavia, se l'AICc del miglior adattamento è entro 5 della distribuzione normale, potresti anche usare l'adattamento normale. Quindi, se ci fosse un modo per scrivere uno script che esaminerebbe un gruppo di colonne che hanno già avuto l'adattamento migliore e quindi adattare l'adattamento selezionato (supponendo che non sia normale) a Normale se è entro un AICc di 5 rispetto alla distribuzione normale? I punti bonus sarebbero per essere in grado di avere una casella di input per immettere il delta dell'AICc con cui sei disposto a convivere. Un doppio bonus sarebbe rimuovere t di Student, Cauchy ed ExGaussian dalle opzioni di selezione poiché non puoi calcolare le capacità di processo su queste distribuzioni (e quello sarà il passaggio successivo da eseguire dopo che questo script di pulizia è stato eseguito).
Ho provato ma non ci sono riuscito, qualsiasi aiuto sarebbe molto apprezzato!!
Steve
Automazione e scriptingR: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?
se c'è un modo per scrivere uno script che passi attraverso un gruppo di colonne che hanno già avuto la migliore esecuzione
La piattaforma di distribuzione è ancora aperta e ha tutti i risultati o dove sono archiviati i risultati? È necessario lasciare aperte le distribuzioni di confronto o è sufficiente che una distribuzione sia stata adattata?
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ciao @jthi !
Sì, la piattaforma sarebbe ancora aperta e tutti i confronti best fit sarebbero ancora lì. Penso che idealmente la casella di confronto sia ancora lì, ma potrei vivere solo con il best fit se fosse molto più facile.
Quindi iniziando da qui

e per qualcosa di simile a questa vestibilità, verrebbe scelto normale, tuttavia diciamo che Normale fosse molto in basso nell'elenco, allora verrebbe scelto SHASH

In questo caso si sceglierebbe il valore normale in quanto è compreso entro 5 del valore AICc di Johnson Sb.

Spero che questo ti sia utile e grazie per aver letto questo articolo!
Steve
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ci sono due cose difficili da fare, che sono correlate: non è possibile impostare la casella di ordinamento predefinita della tabella con JSL (a mia conoscenza, e questo causa problemi su molte piattaforme) e questo rende difficile impostare correttamente le caselle di controllo (non sono nello stesso ordine in cui vedi gli altri valori, molto probabilmente non vengono sempre ordinate o qualcosa del genere).
E per questo motivo, non sono sicuro che funzionerà in ogni caso (ho provato a fare a meno del For ma gli ordini cambiavano troppo)
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();
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Grazie per lo script @jthi !
Ho provato ad eseguirlo e ho ricevuto questo errore

Dal registro:
/*:
Intervallo di pedici nell'accesso o nella valutazione di 'fit_titles[ /*###*/idx]' , fit_titles[/*###*/idx]
alla riga 54 in C:\Users\steve.hampton\OneDrive - Precision Castparts Corp\Documents\Script 3.jsl
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Devi iniziare ad aggiungere stampe di debug e controllare dove va storto. Potresti dover cambiare il ciclo da N Items(dists) a N Items(fit_titles) o qualcosa del genere.
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ho provato ad approcciare la soluzione in modo simile a quella di Jarmo, ma diverso. Diverso in quanto ho scelto di usare le caselle di controllo nella casella Tabella sotto la casella Contorno distribuzioni di confronto. Ho ragionato (correttamente) che se l'AICc normale era entro 5 di qualsiasi distribuzione effettivamente selezionata, allora tutto ciò che deve essere fatto in JSL è deselezionare la casella di controllo per la distribuzione scelta da JMP e selezionare la casella di controllo per la distribuzione normale. Se in JSL, questa deselezione e selezione viene effettuata, la distribuzione corretta viene visualizzata sull'istogramma. Tuttavia, sembra che i messaggi normali che vengono utilizzati per manipolare una casella di controllo dall'interno di JSL non restituiscano o impostino correttamente le caselle di controllo........a meno che non abbia una comprensione completa delle caselle di controllo visualizzate in una casella tabella.
Vedi sotto per quello che ho trovato
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>Spero che qualcuno possa darmi un indizio sul mio errore di logica o di utilizzo. Se non ci sono spiegazioni del genere, passerò la questione al Supporto JMP.</P>R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Immagino che le caselle di controllo non siano realmente legate alla casella della tabella -> quando si ordina la casella della tabella, le caselle di controllo non vengono ordinate correttamente. E poi di default la casella della tabella è già ordinata in modo diverso da "default". Quindi si finisce in una situazione molto strana in cui non si ha idea di quale indice imposta quale elemento poiché non sono allineati. Ecco perché ho usato il ciclo For molto complicato e per controllare quale distribuzione Ifbox era abilitata.
Se utilizzi l'ordine "predefinito" (che non puoi impostare con JSL, il che causa problemi anche in altre piattaforme come lo screening dei processi) ottieni questo

questi sono gli indici "corretti" più spesso .
Non ho ancora provato a capire se è possibile calcolare quale indice è quale dato l'ordinamento corrente (o sapendo quale colonna è stata utilizzata per l'ordinamento).
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ciao @jthi ,
Grazie ancora per averci provato (e @txnelson )! Ho giocato un po' con il codice e funziona abbastanza bene la maggior parte delle volte. Dal momento che sembra che il problema sia il modo in cui le distribuzioni di confronto si comportano con l'ordinamento, penso che se non mi interessa avere ancora tutte le distribuzioni, qualcosa del genere dovrebbe funzionare: esegui la piattaforma di distribuzione e adatta tutto, quindi crea una tabella dati combinata degli output di distribuzione di confronto, nella nuova tabella rimuovi le tre distribuzioni che non possono essere utilizzate per una capacità di processo, quindi esegui il confronto sulle distribuzioni per l'AICc del miglior adattamento rispetto a dove atterra il normale, quindi prendi il miglior adattamento o l'adattamento normale per ogni variabile ed elimina tutto il resto (rendendo così questa tabella una tabella di proprietà delle distribuzioni), quindi usa la piattaforma di gestione dei limiti per applicare quelle distribuzioni come proprietà di colonna sulla tabella principale e infine rilancia la piattaforma di distribuzione. Spero di provarci questo fine settimana e vedere se funziona.
Steve
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Questa era la mia idea originale ed è per questo che ho chiesto se volevi mantenere le Compare Distributions, quindi ho optato per quella. Finché riesci a mantenere gli stessi nomi tra diverse piattaforme, dovrebbe funzionare bene.
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ok, ci sono arrivato! Sono sicuro che non è molto eloquente, ma volevo buttarlo lì nel caso in cui potesse essere utile a qualcun altro.
Il primo passo è selezionare le colonne nella tabella dati per le quali si desidera adattare le distribuzioni.
//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)
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Ottimo lavoro.
Ho letto attentamente il tuo copione e ho apportato alcune modifiche.
- Ho modificato la sintassi della creazione della Colonna 10 per renderla uguale a quella utilizzata per la colonna, Colonna 11 - Colonna 14. Ti suggerisco di modificare i nomi che stai utilizzando. I nomi correnti, Colonna 10 ecc. sono un nome che JMP utilizza quando crea colonne e necessita di un nome di colonna predefinito. Pertanto, è molto probabile che una tabella dati su cui eseguirai lo script possa avere una colonna con uno dei nomi che stai utilizzando. Il mio suggerimento è di modificare semplicemente Colonna 10 ecc. in _Colonna 10_ ecc. per evitare il problema.
- Ho cambiato il codice della tua Nuova Colonna da specificando una Formula, a usando Set Each Value. Fornisce la stessa funzionalità, ma senza creare una formula, che il tuo codice finisce per dover eliminare.
- Ho eliminato un For Each Row che stai utilizzando per creare gli elenchi, col e Dist. Questo può essere fatto in singole istruzioni, eliminando così la necessità di eseguire un ciclo nella tabella dati
- Ti suggerisco inoltre di inserire un controllo all'inizio del codice per determinare se ci sono effettivamente colonne selezionate e, in caso contrario, visualizzare un messaggio che chiede all'utente di selezionare le colonne ed eseguire nuovamente lo script.
Guarda le mie modifiche qui sotto
//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>R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Grazie @txnelson !
Questi cambiamenti sono stati fantastici e mi hanno aiutato a imparare ancora di più. Apprezzo molto il tuo tempo e il tuo aiuto!
Steve
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?
Ecco il mio approccio basato sul tuo script
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>
Prenderei anche in considerazione la creazione della prima distribuzione per i best fit una colonna alla volta. In questo modo potresti aggiornare la didascalia dopo ogni colonna, poiché calcolare il best fit può richiedere molto tempo (potresti anche considerare di aggiornare la barra di avanzamento).
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Grazie @jthi , anche qui ci sono un sacco di cose belle da imparare! Apprezzo tutto l'aiuto!
Steve
R: Potrebbe essere una richiesta impegnativa, ma qualcuno può aiutarmi con uno script per provare a selezionare una distribuzione normale quando è molto vicina alla distribuzione più adatta?Inoltre, potresti sostituire le tue istruzioni if multiple con if-elseif OPPURE con Match. Non le ho testate, ma dovrebbero dare un'idea.
Con più istruzioni if come quelle che hai tu, le controllerà sempre tutte, ma solo una dovrebbe corrispondere. Se usi if-elseif si fermerà alla prima corrispondenza trovata ( 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>E <A href="https://www.jmp.com/support/help/en/18.0/#page/jmp/match-function.shtml#ww246655" target="_blank" rel="noopener noreferrer">Match()</A> dovrebbe essere generalmente più facile da leggere e se ricordo bene è anche leggermente più veloce</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>