Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.J'ai un tableau de données dans lequel les mêmes échantillons ont été mesurés plusieurs fois (voir exemple ci-dessous). Les échantillons sont séparés par leur identifiant.

Je souhaite que mon script puisse effectuer le même ensemble de calculs sur chaque échantillon afin de pouvoir déterminer les limites de contrôle et créer une carte de contrôle pour A, B, C, etc. Je ne connais pas l'identifiant de chaque échantillon. J'ai déjà un script qui peut faire mes calculs et créer les graphiques à ma place, il ne peut tout simplement pas faire de calculs séparés pour chaque identifiant.
Ma première solution consistait à utiliser une sorte de boucle pour ce faire. J'ai un script qui renvoie chaque identifiant unique dans une liste et me donne le nombre d'identifiants uniques comme configuration pour la boucle.
Identifiers = Column( "Identifier") << GetAsMatrix();
Identifiers set = Associative Array( Identifiers);
Unique Identifiers = Identifiers set << Get Keys;
nUnique Identifiers = N Items (Unique Identifiers);
Cependant, je n'arrive tout simplement pas à faire fonctionner une boucle. Y a-t-il une meilleure manière de faire cela? Ou quelqu'un pourrait-il me montrer comment faire la boucle ?
J'utilise JMP 10.
Merci!
Ingénierie Qualité et ProcédésRe : Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.Fonctionne à merveille, merci !
Re : Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.Si vous ne souhaitez pas modifier votre script, vous pouvez l'exécuter sur un sous-ensemble de chaque niveau de l'identifiant, comme ceci :
Names default to here(1);
//Open some sample data
dt = Open( "$Sample_data/big class.jmp" );
//Your code
Identifiers = Column( "age") << GetAsMatrix();
Identifiers set = Associative Array( Identifiers);
Unique Identifiers = Identifiers set << Get Keys;
nUnique Identifiers = N Items (Unique Identifiers);
//A window to hold a bunch of graphs
win = New Window("Graphs", graphbox = v list box());
//Run an analysis on a subset of the data table for each level of a variable
for( i=1, i<=nUnique Identifiers, i++,
//Make a subset of the table with only values for this level
dt << Select Where( :age == UniqueIdentifiers[i]);
dtSub = dt << Subset("Selected Rows");
//run your existing script on the subset
//For demonstration, taking a picture of the graph builder platform
// and getting the R2 value from a linear model and adding those to a window
pic = (gb = dtSub << Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ) ),
Elements( Points( X, Y, Legend( 2 ) ) ),
Local Data Filter(
Close Outline( 1 ),
Add Filter(
columns( :age ),
Where( :age == Unique Identifiers[i] ),
Display( :age, N Items( 6 ) )
)
)
)) << Get Picture;
graphbox << Append( pic );
gb << Close Window;
fm = dtSub << Fit Model(
Y( :height ),
Effects( :weight ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" ),
Run(
:height << {Summary of Fit( 1 ), Analysis of Variance( 1 ),
Parameter Estimates( 1 ), Scaled Estimates( 0 ),
Plot Actual by Predicted( 1 ), Plot Residual by Predicted( 1 ),
Plot Studentized Residuals( 0 ), Plot Effect Leverage( 1 ),
Plot Residual by Normal Quantiles( 0 ), Box Cox Y Transformation( 0 )}
)
);
Wait( 0 );
dtSum = Report( fm )[Outline Box( "Response height" )][Outline Box( "Whole Model" )][
Outline Box( "Summary of Fit" )][Table Box( 1 )] << Make Into Data Table;
Report( fm ) << Close Window;
Rsq = dtSum:Column 2[1];
graphbox << Append( Text Box( "RSquared was " || char(Rsq) ) );
dtSum << Close Window;
//close the subset
dtSub << Close Window;
);Re : Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.Comment pourrais-je faire des calculs supplémentaires filtrés par l’identifiant ? Je souhaite effectuer quelques manipulations de données, puis calculer mes propres limites en fonction des données par identifiant qui seraient ensuite ajoutées à chacun des graphiques. Je pense donc que tout type de filtre devrait précéder le script de graphique final. J'ai un script qui peut faire ça et je peux le poster si nécessaire, mais il est assez long. Je cherche juste un moyen de créer le script que j'ai déjà exécuté pour chaque identifiant plutôt que pour toutes les lignes de la table de données.
Re : Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.Je me demande si l'utilisation des plates-formes de cartes de contrôle intégrées pour calculer les limites et tracer les mesures fonctionnerait, surtout si vous attribuez un identifiant au rôle d'analyse Par.
Je ne veux tout simplement pas que vous passiez beaucoup de temps à créer des scripts s'ils dupliquent des fonctionnalités déjà disponibles.
Re : Comment exécuter un script pour chaque échantillon d'une liste s'il y a plusieurs entrées par échantillon dans la table de données.Il existe de nombreuses façons de procéder, mais la première consiste simplement à ajouter un filtre de données local à vos plates-formes existantes.Voici un exemple utilisant le générateur de graphiques :
Names default to here(1);
//Open some sample data
dt = Open( "$Sample_data/big class.jmp" );
//Your code
Identifiers = Column( "age") << GetAsMatrix();
Identifiers set = Associative Array( Identifiers);
Unique Identifiers = Identifiers set << Get Keys;
nUnique Identifiers = N Items (Unique Identifiers);
//A window to hold a bunch of graphs
win = New Window("Graphs", graphbox = v list box());
//Open a graph that is filtered to only show each unique identifier
//to keep things organized add it to a single window.
for( i=1, i<=nUnique Identifiers, i++,
win << Append(<BR /> //To get this script I opened graph builder and added a local data filter for one age<BR /> //and then copied/pasted it here and replaced the age with 4Unique Identifiers[i]
Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( X( :height ), Y( :weight ) ),
Elements( Points( X, Y, Legend( 2 ) ) ),
Local Data Filter(
Close Outline( 1 ),
Add Filter(
columns( :age ),
Where( :age == Unique Identifiers[i] ),
Display( :age, N Items( 6 ) )
)
)
)
)
);