Sélection automatique des valeurs aberrantesJ'ai 7 000 lignes, composées de plusieurs lots.Je fais une distribution par lot et j'utilise le box plot pour rechercher les valeurs aberrantes.Mais j'ai plus de 100 lots, existe-t-il un moyen pour que JMP sélectionne automatiquement les lignes qui sont aberrantes ?
Re : Sélection automatique des valeurs aberrantesEst-ce ce dont vous avez besoin?
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 : Sélection automatique des valeurs aberrantesEncore une petite question rapide. J'ai supprimé environ 90 colonnes, est-ce que cela peut fonctionner ?
avec n colonnes ou doit-il toujours y avoir 3 colonnes ?
Re : Sélection automatique des valeurs aberrantesCela semble fonctionner.merci.
Re : Sélection automatique des valeurs aberrantesmaintenant, vois si cela fonctionne pour toi...
le script que vous avez envoyé n'était pas du tout adapté à vos données...
Re : Sélection automatique des valeurs aberrantesVous trouverez ci-joint un exemple de mes données avec lesquelles j'essayais de l'utiliser.Idéalement, cela ferait cela pour chaque Y.
Re : Sélection automatique des valeurs aberrantesma formule n'est pas sensible à la taille du lot. de plus, cela fonctionnera même si la colonne du lot est composée de caractères (et non numériques).
pouvez-vous publier un échantillon, même avec seulement 2 ou trois lots différents ?Re : Sélection automatique des valeurs aberrantesQuand je l'exécute, j'obtiens une table, et en voici un instantané, ce sera
fonctionne puisque je peux sélectionner des lignes où Out = 1, si je veux sélectionner tous les
valeurs aberrantes.
[image : image.png]
Re : Sélection automatique des valeurs aberrantessi vous exécutez l'intégralité du script, pouvez-vous voir que vous obtenez ce que vous vouliez (mais pas sur vos données) ?Re : Sélection automatique des valeurs aberrantesJe copie tout depuis //maintenant nous pouvons travailler vers le bas. Quand je lance ça
ma propre table, cela crée simplement une table avec un seul lot. je dois dire
une chose, c'est que le nombre de points par lot n'est pas cohérent. Je fais
je ne sais pas si cela compte.
Re : Sélection automatique des valeurs aberrantescela a fonctionné pour moi.
à la fin, vous devriez avoir 3 tables. original avec toutes les lignes, une avec juste des valeurs aberrantes et la dernière sans valeurs aberrantes. Laissez-moi savoir si cela fonctionne.
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 : Sélection automatique des valeurs aberrantesJe ne sais pas si tu as reçu mon dernier message que je viens d'envoyer, j'ai reçu un message bizarre
retour d'e-mail automatisé. J'ai réparé le deuxième et il fait toujours le même travail
même chose.
Re : Sélection automatique des valeurs aberrantesdans la boucle for, ce n'est pas le casRe : Sélection automatique des valeurs aberrantesMa colonne batch est en majuscule :
[image : image.png]
Re : Sélection automatique des valeurs aberrantesle nom de la colonne est sensible à la casse, soyez cohérent lorsque vous utilisez :Batch ou :batchRe : Sélection automatique des valeurs aberranteslorsque j'ai exécuté ceci, il a créé une table de sous-ensemble avec le premier lot uniquement. je
J'ai changé ceci pour faire ma table ouverte :
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 : Sélection automatique des valeurs aberranteslaisse-moi réessayer
ce n'est pas une solution élégante mais les étapes sont claires et faciles à modifier
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 : Sélection automatique des valeurs aberrantesessayez de diviser la table par lot et de regrouper par valeur unique (pour ne perdre aucune ligne), puis exécutez mon script.
sinon vous avez besoin d'une stratégie différente de celle que je propose.
Est-ce que ça fait du sens?Re : Sélection automatique des valeurs aberrantesJe n'arrive pas à faire fonctionner cela avec mes données, j'ai modifié la hauteur et le poids de mes colonnes et supprimé les deux lignes où il a ouvert le tableau et l'a intégré dans mon tableau, mais il indique que les évaluations sont effectuées mais ne feront rien.
J'ai aussi besoin de quelque chose qui utilise le by et ceci pour chaque lot individuellement.
Re : Sélection automatique des valeurs aberrantesSalut,
voici peut-être une solution :
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 : Sélection automatique des valeurs aberrantesJ'ai essayé le script de Grubb.Cela montre simplement les valeurs aberrantes et ne met pas en évidence les lignes, n'est-ce pas ?J'ai besoin de quelque chose qui mettra en évidence les lignes.
Re : Sélection automatique des valeurs aberrantesLe filtrage des valeurs aberrantes ne fonctionne pas si j'ai besoin d'une variable dans le by.Ce que je veux faire, c'est que mon Y est dans une colonne.Une autre colonne est intitulée lot.Je mets des lots par lots et fais le nombre de distributions au fur et à mesure que je fais des lots.Alors disons 100 distributions.Je veux un script pour mettre en évidence toutes les valeurs aberrantes dans les 100 distributions.Idéalement, cela ne mettra en évidence que les lignes afin que je puisse choisir ma propre couleur puisque j'utilise des couleurs pour différentes choses.Cela a-t-il plus de sens maintenant ?
Re : Sélection automatique des valeurs aberrantesSi vous aviez cherché le Échange de fichiers partie de la Communauté JMP pour ' valeur aberrante ', vous auriez trouvé ces deux scripts utilitaires :
Bien entendu, la base statistique de chacun de ces tests doit être adaptée à votre situation et à vos critères.
Re : Sélection automatique des valeurs aberrantesJe ne suis pas sûr de savoir exactement ce que vous recherchez.Si vous souhaitez sélectionner les lignes pour une distribution donnée, lors de l'affichage de la sortie, vous pouvez simplement faire glisser les points de données aberrants affichés dans la boîte à moustaches aberrante, et les points de données aberrants seront sélectionnés.

Mais si vous souhaitez passer de colonne en colonne et sélectionner des lignes aberrantes, un simple script pourrait le faire. Cependant, rappelez-vous que la sélection de lignes s'étend à toutes les colonnes et que vous obtiendrez des lignes sélectionnées dans lesquelles l'une des colonnes est sélectionnée. .
Ce que vous souhaiterez peut-être vraiment, c'est un script simple qui colore toutes les cellules individuelles qui sont des valeurs aberrantes.Peut-être rouges s'ils sont trop au-dessus de la moyenne, et orange s'ils sont aberrants en dessous de la moyenne.
Pouvez-vous s'il vous plaît clarifier exactement ce que vous recherchez ?
Voir la réponse de Dan pour une meilleure réponse.
Re : Sélection automatique des valeurs aberrantesVous souhaiterez peut-être regarder sous Analyser > Dépistage > Explorer les valeurs aberrantes.