Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalità

Ciao a tutti gli esperti, sono un utente di JMP. Sto scrivendo per imparare a scrivere uno script per calcolare i risultati dei test Wilcoxon rank-sum per migliaia di funzionalità. Le tabelle di raggruppamento e feature (da feature_1 a feature_n) sono allegate come nella figura sopra. Ecco cosa farò:
1) Test della somma dei ranghi di Wilcoson per " Trattamento A vs. Nessun trattamento" da feature_1 a feature_2000. Capisco che devo usare la funzione "adatta Y per X". La X dovrebbe essere il raggruppamento (Trattamento); e la Y dovrebbe essere il valore corrispondente a feature_1, 2....n.
2) Capisco come farlo mannully. Il codice per ogni caratteristica è un po' così:
Gruppo adatto(
Oneway( Y( :Feature_1 ), X( :Treatment ), Wilcoxon Test( 1 ) ),
Tuttavia, non so come scrivere uno script per consentirgli di raccogliere gli elementi della colonna che hanno solo "Nessun trattamento" e "Trattamento A"; e come farlo funzionare come un ciclo per finire la funzione 1 e poi la funzione 2 e fino alla funzione 2000.
Ho fatto del mio meglio per leggere la guida allo scripting. Tuttavia, riesco solo a cogliere il concetto di base e non riesco davvero a risolverlo. Sarò davvero grato se qualcuno qui può almeno dare una mano qui.
Grazie mille..
Migliore,
Windermere
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàSì... hai ragione. Non dovrei usare $.
Grazie
Credo che sia la tua soluzione che quella di Jim ora funzionino
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàFinalmente funziona...
Questa è una buona esperienza di apprendimento.
Grazie
Windermere
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàPensa di aver solo bisogno di "C" (non "$C") all'inizio del nome file del file che stai tentando di aprire.
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàCiao Jim, se provo ad aprire un set di dati che non è in SAMPLE_DATA ma da qualche parte sotto le finestre, ad esempio, come questo "C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp"
Devo scriverlo così?
dt= Open("$C:\Utenti\yuanyli4\Desktop\JMP TEST\Foglio1.jmp");
Grazie
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàdt = Open( "$C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp" );
colList = dt << Get Column Names( Continuous );
dt2 = dt << Stack(
columns( colList ),
source Label Column( "Feature" ),
Stacked Data Column( "Data" ),
Output Table( (dt << getName) || "Stacked" )
);
Close( dt, NoSave );
ow = dt2 << Oneway(
Y( :Data ),
X( :Treatment ),
wilcoxon Test( 1 ),
By( :Feature )
);
firstOwRep = Report( ow[1] );
dt3 = firstOwRep[Table Box( 3 )] << makeCombinedDataTable;
dt3 << setName( "One Way Chisquare Results By Feature" );
Queste sono le cose che ho scritto sulla base dei suggerimenti più aggiornati.
Ancora non funziona... 
Quando provo a eseguirlo. Nessuna risposta...
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàEcco un esempio di fare quello che vuoi.Sto usando una tabella di dati di esempio che ha molte variabili continue.Cambio il nome di una delle colonne continue in "Feature_1" per imitare il nome della colonna su cui stai puntando.Quindi elimino tutte le colonne continue da colList che compaiono prima della colonna "Feature_1" e quindi eseguo l'analisi su tutte le colonne rimanenti.
Names Default To Here( 1 );
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// For illustration, change the name of one of the columns to "Feature_1"
Column( dt, 10 ) << set name( "Feature_1" );
/* Obtain a list of numeric/continuous column names */
colList = dt << Get Column Names( Continuous );
// Remove from the list of columns, all columns before the column called
// "Feature_1"
If( Contains( colList, Parse( "Feature_1" ) ) > 1,
colList = Remove( colList, 1, Contains( colList, Parse( "Feature_1" ) ) - 1 )
);
// Run the analysis
Fit Group(
Oneway( Y( Eval( colList ) ), X( :Wafer ), Wilcoxon Test( 1 ) ),
// If you want all of the outputs in a single row and you don't
// know how many there will be, a simple way to handle this is
// to just specify a large number
<<{Arrange in Rows( 200 )}
);
Si prega di dedicare del tempo alla lettura della Guida allo scripting per apprendere cos'è lo scripting
Aiuto==>Libri==>Guida allo scripting
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàMi dispiace. Ancora non funziona.
Mi chiedo che qualcuno possa aiutare con il caso specifico. Mi dispiace di non sapere come scrivere l'inizio del ciclo dalla colonna denominata Feature_1 fino alla fine. Spero davvero che chi possa spiegare come scrivere la sceneggiatura su questo.
Grazie
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàUn'altra opzione da considerare è la funzione di screening della risposta di JMP. Non esegue il test della somma dei ranghi, piuttosto un test t o un test robusto (per ridurre i valori anomali). Funziona velocemente, fornisce una tabella di valori p, grafici per significato rispetto alle dimensioni degli effetti e, soprattutto, ha un'opzione "adatta selezionata" in modo da poter adattare facilmente Y per X di quelle caratteristiche di maggior interesse per te e poi tu potrebbe eseguire il test di Wilcoxon su un sottoinsieme delle 2000 funzionalità.
https://www.jmp.com/support/help/14/response-screening.shtml
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàJim ti ha già dato un grande aiuto e una guida.
Se ho capito bene, potresti avere più di 2.000 funzionalità, quindi potrebbe essere leggermente più efficiente evitare di ripeterle. Inoltre, esaminare 2.000 rapporti non è eccezionale, quindi probabilmente è necessario riassumere i risultati in qualche modo.
In questo caso puoi davvero evitare il ciclo, quindi ti potrebbe piacere capire come funziona il codice qui sotto per aiutarti ad andare oltre con JSL. Generalmente l'impilamento dei dati e l'utilizzo di una variabile "By" è un buon modello di codifica di cui essere a conoscenza. Ovviamente nell'esempio ci sono solo due 'caratteristiche' (altezza e peso).
// Open a sample data table
dt = Open( "$SAMPLE_DATA\big class.jmp" );
// Obtain a list of column names containing the 'features'
colList = dt << Get Column Names( Continuous );
// Stack the data
dt2 = dt << Stack(
columns( colList ),
Source Label Column( "Feature" ),
Stacked Data Column( "Data" ),
Output Table( (dt << getName)||" Stacked" )
);
Close(dt, NoSave);
// Do the Wilcoxon tests all at the same time (this will be a list, due to the use of the 'By' variable)
ow = dt2 << Oneway( Y( :Data ), X( :sex ), Wilcoxon Test( 1 ), By(:Feature) );
// Get a link to the first report
firstOwRep = Report(ow[1]);
// Get the one way ChiSq results from ALL reports (features) into a single table
dt3 = firstOwRep[TableBox(3)] << makeCombinedDataTable;
dt3 << setName("One Way ChiSquare Results By Feature");
Naturalmente, quando si applica un test statistico migliaia di volte, è necessario considerare che il tasso di falsi allarmi sarà inevitabilmente elevato.
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàGrazie e hai assolutamente ragione sul fatto che non ho formazione ed esperienza nella scrittura di sceneggiature.
Proverò di nuovo, ho anche bisogno di leggere. Spero non ti dispiaccia se posto qualcosa qui se non ho capito...
Grazie ancora per la tua pazienza.
Migliore,
Windermere
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàDi seguito è riportato uno script annotato che dovrebbe darti ciò che desideri.
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\big class.jmp" );
/* Obtain a list of numeric/continuous column names */
colList = dt << Get Column Names( Continuous );
// If you run a Oneway analysis, and specify to Arrange in Rows
// and then save the script, it generates
/*
Fit Group(
Oneway( Y( :height ), X( :sex ) ),
Oneway( Y( :weight ), X( :sex ) ),
<<{Arrange in Rows( 200 )}
)
*/
// A little modification to include all of the columns that
// were extracted using the << Get Columns Names message, and
// the script below will give you what you want
Fit Group(
Oneway( Y( Eval( colList ) ), X( :sex ) ),
// If you want all of the outputs in a single row and you don't
// know how many there will be, a simple way to handle this is
// to just specify a large number
<<{Arrange in Rows( 200 )}
);
Tutte le funzioni ei messaggi nello script sopra sono documentati con esempi nello Scripting Index
Aiuto==>Indice degli script
Le strutture ei metodi JSL sono documentati nella Scripting Guide
Aiuto==>Libri==>Guida allo scripting
Tuttavia, sembra che tu sia attualmente limitato nella tua conoscenza ed esperienza di programmazione.Ti suggerisco caldamente di prendere in mano uno dei tanti libri sull'introduzione alla programmazione.Sebbene non troverai un libro su "Introduzione alla programmazione per il linguaggio di scripting JMP", ciò che è veramente necessario è apprendere i concetti di programmazione.Una volta compreso ciò, il passaggio da un linguaggio all'altro nel mondo della programmazione diventa una semplice questione di apprendimento della nuova sintassi del nuovo linguaggio.
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalità
/* Open a sample data table */
dt = Open( "$Sheet1.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Feature_1( Continuous, String );
For( i = 2, i <= N Items( colList ), i++, );
Oneway(
Y( :colList ),
X( :Treatment ),
Wilcoxon Test( 1 )
);
<<{Arrange in Rows( 1 )};
Questo è lo script che ho usato.
Purtroppo,
Non funziona per niente..
Nessuna risposta.
Qualcuno sa perché?
Grazie
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàCiao Txnelson,
Grazie per l'aiuto. Voglio solo assicurarmi di aver compreso correttamente le seguenti cose.
1.
<SPAN class="token comment">/* Obtain a list of numeric/continuous column names as strings */</SPAN>
colList <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get Column Names</SPAN><SPAN class="token punctuation">(</SPAN> Continuous<SPAN class="token punctuation">,</SPAN> String <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">;</SPAN>
Per il mio tavolo, dovrei scriverlo come
colList <SPAN class="token operator">=</SPAN> dt <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> "Feature_1"</SPAN><SPAN class="token punctuation">(</SPAN> Continuous<SPAN class="token punctuation">,</SPAN> String <SPAN class="token punctuation">); <BR /></SPAN>
È corretto?
2.
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">2</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> <SPAN class="token function">Nitems</SPAN><SPAN class="token punctuation">(</SPAN> colList <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,</SPAN>
Nel mio caso, dovrebbe essere scritto come
<SPAN class="token function">For</SPAN><SPAN class="token punctuation">(</SPAN> i <SPAN class="token operator">=</SPAN> <SPAN class="token number">0</SPAN><SPAN class="token punctuation">,</SPAN> i <SPAN class="token operator"><=</SPAN> feature_2000<SPAN class="token punctuation">(</SPAN> colList <SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> i<SPAN class="token operator">++</SPAN><SPAN class="token punctuation">,)</SPAN>
È corretto?
Quindi, non capisco davvero cosa significa i=0, i=1, i=2? Potresti per favore spiegare?
"Nitems" dovrebbe essere cambiato nel nome della colonna dell'ultima colonna (feature_2000). La mia comprensione è corretta?
Inoltre, abbiamo bisogno di un ")" per interrompere questo ciclo? Il modello che hai mostrato di seguito non aveva ")".
Grazie.
Proverò la sceneggiatura domani e ti darò un feebback.
Windermere
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàIl looping tra le colonne e l'esecuzione di una delle piattaforme è uno degli elementi più comuni gestiti nel forum di discussione.La ricerca su "Looping" fa apparire più selezioni.Di seguito è riportato un esempio di loop tratto da un esempio di loop tra colonne e l'esecuzione di una piattaforma Graph Builder.Il looping per una piattaforma Oneway sarà molto simile.
/* Open a sample data table */
dt = Open( "$SAMPLE_DATA\Fitness.jmp" );
/* Obtain a list of numeric/continuous column names as strings */
colList = dt << Get Column Names( Continuous, String );
/* Loop through the list to generate the desired Graph Builder
and save the report as a JPEG file */
For( i = 2, i <= Nitems( colList ), i++,
gb = dt << Graph Builder(
Size( 534, 454 ),
Show Control Panel( 0 ),
Variables(
X( :Age ),
Y( Column( dt, colList[i] ) ),
Color( :Age )
),
Elements(
Points(
X,
Y,
Legend( 3 ),
Summary Statistic( "Mean" ),
Error Bars( "Confidence Interval" )
)
),
SendToReport(
Dispatch(
{},
"Graph Builder",
FrameBox,
{Marker Size( 5 )}
)
),
Invisible
);
gb << Save Picture( "E:\Trash\Graph Builder_" || colList[i] ||".jpg", JPEG );
);
/* Close table and all invisible reports */
Close( dt, No Save );Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàCIAO,
Grazie per la tua soluzione per aver scelto le informazioni sul gruppo.
Ma come eseguire il test per feature_1, per feauture_2000 come loop? Potresti per favore fornire anche una soluzione per questo?
Grazie
Windermere
Ri: Come scrivere uno script per il test della somma dei ranghi di Wilcoxon per migliaia di funzionalitàLe due soluzioni che posso vedere rapidamente sono l'impostazione dello stato della riga per tutte le righe che non hanno "Nessun trattamento" o "Trattamento A" su "Nascondi ed escludi" e quindi l'esecuzione delle analisi Adatta Y per X
names default to here(1);
dt=current data table();
dt << select where(:treatment !="No Treatment" & :treatment !="Treatment A");
<BR />dt << Hide and Exclude;
dt << Fit Group(
Oneway(………………………..));
Oppure, sottoinsiemi i dati in una nuova tabella che contiene solo le righe "Nessun trattamento" e "Trattamento A", quindi esegui l'analisi
names default to here(1);
dt=current data table();
dt << select where(:treatment =="No Treatment" | :treatment !=="Treatment A");
dt2=dt<<SUBSET></SUBSET>