Selezione automatica dei valori anomaliHo 7000 righe, composte da più batch.Sto eseguendo una distribuzione per batch e utilizzando il box plot dei valori anomali per cercare i valori anomali.Ma ho più di 100 batch, esiste un modo per fare in modo che JMP selezioni automaticamente quali righe sono valori anomali?
Re: Selezione automatica dei valori anomaliè di questo che hai bisogno?
Names Default To Here( 1 );
// make a sample data table
dt = New Table( "Data",
add rows( 10000 ),
New Column( "it", Numeric, Ordinal, Format( "Best", 8 ), Formula( Row() ) ),
New Column( "Batch", Numeric, Ordinal, Format( "Best", 8 ), formula( Random Integer( 110 ) ) ),
New Column( "y1", Numeric, Continues, Format( "Best", 8 ), formula( Random Lognormal( :Batch / 10, 5 ) ) ),
New Column( "y2", Numeric, Continues, Format( "Best", 8 ), formula( Random Lognormal( :Batch / 10, 5 ) ) ),
New Column( "Out",
Numeric,
Ordinal,
Format( "Best", 8 ),
Set Property( "Value Colors", {0 = -13977687, 1 = -4222943} ),
Color Cell by Value,
formula( 0 )
),
New Column( "Outy1",
Numeric,
Ordinal,
Format( "Best", 8 ),
Set Property( "Value Colors", {0 = -13977687, 1 = -4222943} ),
Color Cell by Value,
formula( 0 )
),
New Column( "Outy2",
Numeric,
Ordinal,
Format( "Best", 8 ),
Set Property( "Value Colors", {0 = -13977687, 1 = -4222943} ),
Color Cell by Value,
formula( 0 )
),
);
dt << run formulas;
Column( dt, "it" ) << delete formula;
Column( dt, "Batch" ) << delete formula;
Column( dt, "y1" ) << delete formula;
Column( dt, "y2" ) << delete formula;
Column( dt, "Out" ) << delete formula;
Column( dt, "Outy1" ) << delete formula;
Column( dt, "Outy2" ) << delete formula;
// now we get to work
// make a list of batches
byvarlist = Associative Array( dt:Batch ) << get keys;
// make a list of columns
cols = dt << get column names( Continuous ); //List all Numeric columns
// loop through the batches
For( i = 1, i <= N Items( byvarlist ), i++,
// select each batch
dt << select where( dt:Batch == byvarlist[i] );
// subset each batch
subdt = dt << Subset( Selected Rows( 1 ) );
// clear selection for smoth workflow
dt << clear select;
// finde outliers in each variable within each batch
For( ii = 1, ii <= N Items( cols ), ii++,
out = Eval(
Parse(
"subdt << get rows where(
subdt:" || Char( cols[ii] ) || " > Col Quantile( subdt:" || Char( cols[ii] ) ||
", 0.75 ) + 1.5 * (Col Quantile( subdt:" || Char( cols[ii] ) || ", 0.75 ) - Col Quantile( subdt:" || Char( cols[ii] ) ||
", 0.25 )) | subdt:" || Char( cols[ii] ) || " <
Col Quantile( subdt:" || Char( cols[ii] ) ||
", 0.25 ) - 1.5 * (Col Quantile( subdt:" || Char( cols[ii] ) || ", 0.75 ) - Col Quantile( subdt:" || Char( cols[ii] ) ||
", 0.25 )));"
)
)`;
Eval( Parse( "column (subdt, \!"Out" || Char( cols[ii] || "\!" )[" || Char( out ) || "] = 1;" ) ) );
// also indicate the global outlier
Column( subdt, "Out" )[out] = 1;
//wait (0.00001);
);
// update original data table with new information for the batch
subdt << delete columns( "Batch" );
subdt << delete columns( cols );
dt << Update( With( subdt ), Match Columns( :it = :it ) );
Close( subdt, No Save );
//Wait( 0.00001 );
);
dt << color by column( :Out );
Re: Selezione automatica dei valori anomaliSolo un'altra domanda veloce. Ho eliminato circa 90 colonne, può funzionare
con n colonne o devono essere sempre 3 colonne?
Re: Selezione automatica dei valori anomaliSembra funzionare.Grazie.
Re: Selezione automatica dei valori anomaliora vedi se ti va bene...
lo script che hai inviato non era affatto adattato ai tuoi dati...
Re: Selezione automatica dei valori anomaliin allegato c'è un esempio dei miei dati con cui stavo cercando di utilizzarlo.Idealmente lo farebbe per ogni Y.
Re: Selezione automatica dei valori anomalila mia formula non è sensibile alla dimensione del lotto. inoltre funzionerà anche se la colonna batch è di caratteri (e non numerica).
puoi pubblicare un campione, anche con solo 2 o tre lotti diversi?Re: Selezione automatica dei valori anomaliQuando lo eseguo, ottengo una tabella, ed eccone un'istantanea, questa sarà
funziona poiché posso selezionare le righe in cui Out = 1, se voglio selezionare tutte le file
valori anomali.
[immagine: immagine.png]
Re: Selezione automatica dei valori anomalise esegui l'intero script puoi vedere che ottieni ciò che volevi (ma non sui tuoi dati)?Re: Selezione automatica dei valori anomaliCopio tutto da //ora ci mettiamo al lavoro. Quando lo avrò eseguito
la mia tabella, crea semplicemente una tabella con un solo batch. devo dire
una cosa è che il numero di punti per lotto non è coerente. Io faccio
non so se è importante.
Re: Selezione automatica dei valori anomaliquesto ha funzionato per me.
alla fine dovresti avere 3 tabelle. originale con tutte le righe, una con solo valori anomali e l'ultima senza valori anomali. fammi sapere se funziona.
Names Default To Here( 1 );<BR /><BR />// make a sample data table<BR />dt = New Table( "Data",<BR /> add rows( 10000 ),<BR /> New Column( "it", Numeric, Continues, Format( "Best", 8 ), Formula( Row() ) ),<BR /> New Column( "Batch", Numeric, Ordinal, Format( "Best", 8 ), formula( Random Integer( 110 ) ) ),<BR /> New Column( "y", Numeric, Continues, Format( "Best", 8 ), formula( Random Lognormal( :Batch / 10, 5 ) ) ),<BR /> New Column( "Out", Numeric, Ordinal, Format( "Best", 8 ), formula( 0 ) ), <BR /><BR />);<BR /><BR />dt << run formulas;<BR />Column( dt, "it" ) << delete formula;<BR />Column( dt, "Batch" ) << delete formula;<BR />Column( dt, "y" ) << delete formula;<BR />Column( dt, "Out" ) << delete formula;<BR /><BR />// now we get to work<BR />dt = Current Data Table();<BR />byvarlist = Associative Array( dt:Batch ) << get keys;<BR />For( i = 1, i <= N Items( byvarlist ), i++,<BR /> dt << select where( dt:Batch == byvarlist[i] );<BR /> subdt = dt << Subset( Selected Rows( 1 ) );<BR /> dt << clear select;<BR /> subdt:Out << set formula(<BR /> If(<BR /> :y > Col Quantile( :y, 0.75 ) + (Col Quantile( :y, 0.75 ) - Col Quantile( :y, 0.25 )) * 1.5, 1,<BR /> :y < Col Quantile( :y, 0.25 ) - (Col Quantile( :y, 0.75 ) - Col Quantile( :y, 0.25 )) * 1.5, 1,<BR /> 0<BR /> )<BR /> );<BR /> subdt << run formulas;<BR /> Column( subdt, "Out" ) << delete formula;<BR /> keep = {"it", "Out"};<BR /> todelete = subdt << get column names( "string" );<BR /> For( icol = 1, icol <= N Items( keep ), icol++,<BR /> Remove From( todelete, Contains( todelete, Keep[icol] ), 1 )<BR /> );<BR /> subdt << delete columns( todelete );<BR /> dt << Update( With( subdt ), Match Columns( :it = :it ) );<BR /> Close( subdt, No Save );<BR /> Wait( 0.00001 );<BR />);<BR />selected = dt << select where( :Out == 1 );<BR />selected << Markers( 11 );<BR />selected << Marker Size( 8 );<BR />selected << Row Colors( red );<BR />dt << clear select;<BR /><BR />dt << select where( dt:Out == 1 );<BR />Outdt = dt << Subset( Selected Rows( 1 ) );<BR />dt << clear select;<BR /> <BR />Wait( 0.00001 );<BR /> <BR />dt << select where( dt:Out == 0 );<BR />indt = dt << Subset( Selected Rows( 1 ) );<BR />dt << clear select;<BR /><BR />
Re: Selezione automatica dei valori anomaliNon sono sicuro che tu abbia ricevuto il mio ultimo messaggio che ho appena inviato, mi è venuta una cosa strana
email di risposta automatizzata. Ho riparato il secondo e sta ancora facendo il
stessa cosa.
Re: Selezione automatica dei valori anomalinel ciclo for non lo èRe: Selezione automatica dei valori anomaliLa mia colonna batch è in maiuscolo:
[immagine: immagine.png]
Re: Selezione automatica dei valori anomaliil nome della colonna fa distinzione tra maiuscole e minuscole, sii coerente quando usi :Batch o :batchRe: Selezione automatica dei valori anomaliquando l'ho eseguito, ha creato una tabella di sottoinsiemi solo con il primo batch. IO
cambiato questo per fare la mia tabella aperta:
dt = currentdatatable();
byvarlist = Associative Array( dt:Batch ) << get keys;
For( i = 1, i <= N Items( byvarlist ), i++,
dt << select where( dt:batch == byvarlist[i] );
subdt = dt << Subset( Selected Rows( 1 ) );
dt << clear select;
subdt:Out << set formula(
If(
:y > Col Quantile( :y, 0.75 ) + (Col Quantile( :y, 0.75 )
-Col Quantile( :y, 0.25 )) * 1.5, 1,
:y < Col Quantile( :y, 0.25 ) - (Col Quantile( :y, 0.75 )
-Col Quantile( :y, 0.25 )) * 1.5, 1,
0
)
);
subdt << run formulas;
Column( subdt, "Out" ) << delete formula;
keep = {"it", "Out"};
todelete = subdt << get column names( "string" );
For( icol = 1, icol <= N Items( keep ), icol++,
Remove From( todelete, Contains( todelete, Keep[icol] ), 1 )
);
subdt << delete columns( todelete );
dt << Update( With( subdt ), Match Columns( :it = :it ) );
Close( subdt, No Save );
);
selected = dt << select where( :Out == 1 );
selected << Markers( 11 );
selected << Marker Size( 8 );
selected << Row Colors( red );
dt << clear select;Re: Selezione automatica dei valori anomaliFammi riprovare
non è una soluzione elegante ma i passaggi sono chiari e facili da modificare
Names Default To Here( 1 );
// make a sample data table
dt = New Table( "Data",
add rows( 10000 ),
New Column( "it", Numeric, Continues, Format( "Best", 8 ), Formula( Row() ) ),
New Column( "Batch" ,Numeric, Ordinal, Format( "Best", 8 ), formula( random integer (110) )),
New Column( "y" ,Numeric, Continues, Format( "Best", 8 ), formula( random log normal (:Batch / 10, 5) )),
New Column( "Out" ,Numeric, Ordinal, Format( "Best", 8 ), formula (0)),
);
dt << run formulas;
column (dt, "it") << delete formula;
column (dt, "Batch") << delete formula;
column (dt, "y") << delete formula;
column (dt, "Out") << delete formula;
// now we get to work
// extract the list of the by variable levels
byvarlist = Associative Array( dt:Batch ) << get keys;
// run across each group and locate the outliers
For( i = 1, i <= N Items( byvarlist ), i++,
// produce a subset data table for each group using selection method
dt << select where (dt:batch == byvarlist[i]);
subdt = dt << Subset(
Selected Rows( 1 ),
);
dt << clear select;
// indicate outliers within the group
subdt:Out << set formula(
If(
:y > Col Quantile( :y, 0.75 ) + (Col Quantile( :y, 0.75 ) -
Col Quantile( :y, 0.25 )) * 1.5, 1,
:y < Col Quantile( :y, 0.25 ) - (Col Quantile( :y, 0.75 ) -
Col Quantile( :y, 0.25 )) * 1.5, 1,
0
)
);
subdt << run formulas;
// prepare table for updating original by removing formulas and columns that are not needed
column (subdt, "Out") << delete formula;
keep = {"it", "Out"};
todelete = subdt << get column names( "string" );
For( icol = 1, icol <= N Items( keep ), icol++,
Remove From( todelete, Contains( todelete, Keep[icol] ), 1 )
);
subdt << delete columns( todelete );
// update
dt << Update(
With( subdt ),
Match Columns( :it = :it )
);
Close( subdt, No Save );
);
// now the original data has all the outliers indicated in a column
selected = dt << select where (:Out == 1);
selected << Markers( 11 );
selected << Marker size ( 8 );// not working???
selected << Row Colors( red );// not working???
dt << clear select;
Re: Selezione automatica dei valori anomaliprova a dividere la tabella per batch e raggrupparla per valore univoco (in modo da non perdere alcuna riga), quindi esegui il mio script.
altrimenti hai bisogno di una strategia diversa da quella che offro.
ha senso?Re: Selezione automatica dei valori anomaliNon riesco a farlo funzionare con i miei dati, ho modificato l'altezza e il peso delle mie colonne e ho rimosso le due righe in cui apriva la tabella e l'ho incorporato nella mia tabella, ma dice che le valutazioni sono state eseguite ma non farà nulla.
Ho anche bisogno di qualcosa che utilizzi by e this per ciascun lotto individualmente.
Re: Selezione automatica dei valori anomaliCIAO,
forse ecco una soluzione:
https://community.jmp.com/t5/Discussions/How-to-extract-month-in-words-from-a-date-value-how-to-change/mp/19362/highlight/true#M17650
Ron
Re: Selezione automatica dei valori anomaliHo provato la sceneggiatura di Grubb.Questo mostra solo i valori anomali e non evidenzia le righe, giusto?Ho bisogno di qualcosa che evidenzi le righe.
Re: Selezione automatica dei valori anomaliI valori anomali di screening non funzionano se ho bisogno di una variabile nel frattempo.Quello che voglio fare è che la mia Y sia in una colonna.Un'altra colonna è denominata batch.Inserisco il batch per e seguo il numero di distribuzioni mentre faccio i batch.Quindi diciamo 100 distribuzioni.Voglio uno script per evidenziare tutti i valori anomali in tutte le 100 distribuzioni.Idealmente evidenzierà solo le righe in modo da poter scegliere il mio colore poiché utilizzo i colori per cose diverse.Ha più senso adesso?
Ri: Selezione automatica dei valori anomaliSe avessi cercato il Scambio di file porzione di Comunità JMP per ' anomalo ,' avresti trovato questi due script di utilità:
Naturalmente la base statistica per ciascuno di questi test deve essere adatta alla vostra situazione e ai vostri criteri.
Ri: Selezione automatica dei valori anomaliNon sono sicuro di cosa stai cercando esattamente.Se desideri selezionare le righe per una determinata distribuzione, quando visualizzi l'output, puoi semplicemente trascinare i punti dati anomali visualizzati nel box plot degli outlier e selezionerà i punti dati anomali.

Ma se vuoi passare da una colonna all'altra e selezionare righe anomale, un semplice script potrebbe farlo, tuttavia, ricorda che la selezione delle righe attraversa tutte le colonne e ciò che otterresti saranno le righe selezionate in cui è selezionata una qualsiasi delle colonne .
Ciò che potresti veramente desiderare è un semplice script che colora tutte le singole celle che sono valori anomali.Forse rosso se sono molto al di sopra della media e arancione se sono valori anomali al di sotto della media.
Puoi per favore chiarire esattamente cosa stai cercando?
Vedi la risposta di Dan per una risposta migliore.
Ri: Selezione automatica dei valori anomaliPotresti voler guardare in Analizza > Screening > Esplora valori anomali.