Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funciones

Hola a todos los expertos, soy usuario de JMP. Estoy escribiendo para aprender a escribir un script para calcular los resultados de la prueba de suma de rangos de Wilcoxon para miles de características. Las tablas de agrupación y funciones (desde función_1 hasta función_n) se adjuntan como en la figura anterior. Esto es lo que voy a hacer:
1) Prueba de suma de rangos de Wilcoson para " Tratamiento A vs. Ningún tratamiento" para característica_1 a característica_2000. Entiendo que necesito usar la función "ajustar Y por X". La X debe ser la agrupación (Tratamiento); y la Y debe ser el valor correspondiente a feature_1, 2....n.
2) Entiendo cómo hacerlo manualmente. El código para cada función es algo así:
Grupo de ajuste (
Oneway( Y( :Característica_1 ), X( :Tratamiento ), Prueba de Wilcoxon( 1 ) ),
Sin embargo, no sé cómo escribir un script para que pueda seleccionar los elementos de la columna que solo tienen "Sin tratamiento" y "Tratamiento A"; y cómo hacer que se ejecute como un bucle para finalizar la función 1 y luego la función 2 y hasta la función 2000.
He hecho todo lo posible para leer el guid de secuencias de comandos. Sin embargo, solo puedo captar el concepto básico y realmente no puedo resolverlo. Estaré muy agradecido si alguien aquí puede al menos dar una mano aquí.
Muchas gracias..
Mejor,
Windermere
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasSí... tienes razón. No debería usar el $.
Gracias
Creo que tanto la solución tuya como la de Jim funcionan ahora.
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasPor fin funciona...
Esa es una buena experiencia de aprendizaje.
Gracias
Windermere
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesPiense que solo necesita "C" (no "$C") al comienzo del nombre del archivo que está tratando de abrir.
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasHola Jim, si trato de abrir un conjunto de datos que no está en SAMPLE_DATA pero en algún lugar debajo de las ventanas, por ejemplo, como este "C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp"
¿Debería escribirlo así?
dt= Open("$C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp");
Gracias
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesdt = 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" );
Estas son las cosas que escribí sobre la base de las sugerencias más actualizadas.
Todavía no funciona... 
Cuando trato de ejecutarlo. No hay respuesta en absoluto...
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasAquí hay un ejemplo de hacer lo que quieres.Estoy usando una tabla de datos de muestra que tiene muchas variables continuas.Cambio el nombre de una de las columnas continuas a "Característica_1" para imitar el nombre de la columna a la que se dirige.Luego elimino todas las columnas continuas de colList que aparecen antes de la columna "Feature_1" y luego ejecuto el análisis en todas las columnas restantes.
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 )}
);
Tómese el tiempo para leer la Guía de secuencias de comandos para aprender de qué se trata la creación de secuencias de comandos.
Ayuda==>Libros==>Guía de secuencias de comandos
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesLo siento. Todavía no funciona.
Me pregunto si alguien puede ayudar con el caso específico. Lamento no saber cómo escribir el inicio del bucle desde la columna denominada Feature_1 hasta el final. Realmente espero que quién pueda explicar cómo escribir el guión sobre eso.
Gracias
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesOtra opción a considerar es la función de detección de respuesta de JMP. No realiza la prueba de suma de rangos, sino una prueba t o una prueba robusta (para reducir los valores atípicos). Se ejecuta rápido, proporciona una tabla de valores p, gráficos de importancia frente a tamaños de efectos y, lo mejor de todo, tiene una opción de "ajuste seleccionado" para que pueda ajustar fácilmente Y por X las características que más le interesen y luego podría ejecutar la prueba de Wilcoxon en un subconjunto de las características de 2000.
https://www.jmp.com/support/help/14/response-screening.shtml
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesJim ya te ha brindado una gran ayuda y orientación.
Si entiendo correctamente, es posible que tenga más de 2000 funciones, por lo que podría ser un poco más eficiente evitar pasar por encima de ellas. Además, mirar 2000 informes no es muy bueno, por lo que probablemente necesite resumir los resultados de alguna manera.
En este caso, puede evitar el bucle, por lo que le gustaría comprender cómo funciona el código a continuación para ayudarlo a avanzar con JSL. En general, apilar los datos y usar una variable 'Por' es un buen patrón de codificación a tener en cuenta. Por supuesto, en el ejemplo solo hay dos 'características' (altura y 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");
Por supuesto, al aplicar una prueba estadística miles de veces, debe tener en cuenta que la tasa de falsas alarmas será inevitablemente alta.
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesGracias y tiene toda la razón en que no tengo entrenamiento ni experiencia en escritura de guiones.
Lo intentaré de nuevo, también necesito leer. Espero que no te importe si publico algo aquí si no entiendo...
Gracias de nuevo por tu paciencia.
Mejor,
Windermere
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesA continuación se muestra un script anotado que debería darle lo que desea.
/* 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 )}
);
Todas las funciones y mensajes en la secuencia de comandos anterior están documentados con ejemplos en el índice de secuencias de comandos
Ayuda==>Índice de secuencias de comandos
Las estructuras y los métodos de JSL están documentados en la Guía de secuencias de comandos.
Ayuda==>Libros==>Guía de secuencias de comandos
Sin embargo, parece que actualmente está limitado en su conocimiento y experiencia en programación.Le sugiero encarecidamente que elija uno de los muchos libros sobre Introducción a la programación.Si bien no encontrará un libro sobre "Introducción a la programación para el lenguaje de secuencias de comandos JMP", lo que realmente se necesita es aprender los conceptos de programación.Una vez que se entiende eso, cambiar entre lenguajes en el mundo de la programación se convierte en una simple cuestión de aprender la nueva sintaxis del nuevo lenguaje.
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de características
/* 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 )};
Este es el script que usé.
Desafortunadamente,
No funciona en absoluto..
Sin respuesta
¿Alguien sabe por qué?
Gracias
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasHola txnelson,
Gracias por su ayuda. Solo quiero asegurarme de que entiendo las siguientes cosas de manera correcta.
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>
Para mi tabla, debería escribirlo como
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>
¿Es correcto?
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>
En mi caso, debería escribirse como
<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>
¿Es eso correcto?
Entonces, realmente no entiendo qué significa i=0, i=1, i=2. ¿Podría explicar por favor?
"Nitems" debe cambiarse al nombre de columna de la última columna (feature_2000). ¿Es correcto mi entendimiento?
Además, ¿necesitamos un ")" para detener este bucle? La plantilla que mostraste a continuación no tenía el ")".
Gracias.
Probaré el guión mañana y te daré un feedback.
Windermere
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesRecorrer columnas y ejecutar una de las plataformas es uno de los elementos más comunes que se manejan en el foro de discusión.La búsqueda en "Bucle" muestra múltiples selecciones.A continuación, se muestra un ejemplo de bucle tomado de un ejemplo de bucle entre columnas y ejecución de una plataforma Graph Builder.El bucle para una plataforma Oneway será muy similar.
/* 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 );Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de característicasHola,
Gracias por su solución para elegir la información del grupo.
Pero, ¿cómo hacer la prueba de feature_1, a feature_2000 como un bucle? ¿Podría por favor también proporcionar una solución para eso?
Gracias
Windermere
Re: Cómo escribir un script para la prueba de suma de rangos de Wilcoxon para miles de funcionesLas dos soluciones que puedo ver rápidamente son configurar el estado de fila para todas las filas que no tienen "Sin tratamiento" o "Tratamiento A" en "Ocultar y excluir", y luego ejecutar sus análisis Ajustar Y por 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(………………………..));
O bien, subdivida los datos en una nueva tabla que solo tenga las filas "Sin tratamiento" y "Tratamiento A", y luego realice el análisis.
names default to here(1);
dt=current data table();
dt << select where(:treatment =="No Treatment" | :treatment !=="Treatment A");
dt2=dt<<SUBSET></SUBSET>