Come eseguire lo script per ogni campione in un elenco se sono presenti più voci per campione nella tabella dati.Ho una tabella dati in cui gli stessi campioni sono stati misurati più volte (vedi esempio sotto). I campioni sono separati dal loro identificatore.

Voglio che il mio script sia in grado di eseguire la stessa serie di calcoli su ciascun campione in modo da poter determinare i limiti di controllo e creare un grafico di controllo per A, B, C, ecc. Non conosco l'identificatore di ogni campione. Ho già uno script che può eseguire i miei calcoli e creare i grafici per me, semplicemente non può eseguire calcoli separati per ciascun identificatore.
Il mio compito iniziale era usare una sorta di loop per farlo. Ho uno script che restituisce ogni identificatore univoco in un elenco e mi fornisce il numero di identificatori univoci come impostazione per il ciclo.
Identifiers = Column( "Identifier") << GetAsMatrix();
Identifiers set = Associative Array( Identifiers);
Unique Identifiers = Identifiers set << Get Keys;
nUnique Identifiers = N Items (Unique Identifiers);
Tuttavia, non riesco proprio a far funzionare un loop. C'è un modo migliore per farlo? O qualcuno potrebbe mostrarmi come fare il loop?
Sto usando JMP 10.
Grazie!
ScriptingRi: Come eseguire lo script per ogni campione in un elenco se ci sono più voci per campione nella tabella dati.Funziona come un fascino, grazie!
Ri: Come eseguire lo script per ogni campione in un elenco se ci sono più voci per campione nella tabella dati.Se non vuoi modificare il tuo script, puoi eseguirlo su un sottoinsieme di ciascun livello dell'identificatore, in questo modo:
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;
);Ri: Come eseguire lo script per ogni campione in un elenco se ci sono più voci per campione nella tabella dati.Come potrei fare ulteriori calcoli filtrati dall'identificatore? Voglio manipolare i dati e quindi calcolare i miei limiti in base ai dati per identificatore che verrebbero quindi aggiunti a ciascuno dei grafici, quindi penso che qualsiasi tipo di filtro dovrebbe venire prima dello script del grafico finale. Ho uno script che può farlo e posso pubblicarlo se necessario, ma è piuttosto lungo. Sto davvero solo cercando un modo per creare lo script che ho già eseguito per ogni identificatore piuttosto che per tutte le righe nella tabella dei dati
Ri: Come eseguire lo script per ogni campione in un elenco se ci sono più voci per campione nella tabella dati.Mi chiedo se l'utilizzo delle piattaforme di carte di controllo integrate per calcolare i limiti e tracciare le misure funzionerebbe, soprattutto se si assegna Identificatore al ruolo di analisi.
Semplicemente non voglio che tu passi molto tempo a scrivere script se duplica le funzionalità già disponibili.
Ri: Come eseguire lo script per ogni campione in un elenco se ci sono più voci per campione nella tabella dati.Ci sono molti modi per farlo, ma uno è semplicemente aggiungere un filtro dati locale alle tue piattaforme esistenti.Ecco un esempio che utilizza il generatore di grafici:
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 ) )
)
)
)
)
);