Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalités

Salut à tous les experts, je suis un utilisateur de JMP. J'écris pour apprendre à écrire un script pour calculer les résultats des tests de somme de rang Wilcoxon pour des milliers de fonctionnalités. Les tableaux de regroupement et de fonctionnalités (de feature_1 à feature_n) sont joints comme la figure ci-dessus. Voici ce que je vais faire :
1) Test de somme des rangs de Wilcoson pour " Traitement A vs aucun traitement » pour feature_1 à feature_2000. Je comprends que j'ai besoin d'utiliser la fonction "adapter Y par X". Le X devrait être le groupement (Traitement); et Y doit être la valeur correspondant à feature_1, 2....n.
2) Je comprends comment le faire manuellement. Le code de chaque fonctionnalité ressemble un peu à ceci :
Groupe d'ajustement(
Unidirectionnel( Y( :Caractéristique_1 ), X( :Traitement ), Test de Wilcoxon( 1 ) ),
Cependant, je ne sais pas comment écrire un script pour le laisser récupérer les éléments de colonne uniquement "Aucun traitement" et "Traitement A" ; et comment le faire fonctionner en boucle pour terminer la fonction 1, puis la fonction 2 et jusqu'à la fonction 2000.
J'ai fait de mon mieux pour lire le guide de script. Cependant, je ne peux saisir que le concept de base et je ne peux pas vraiment le résoudre. Je serai vraiment reconnaissant si quelqu'un ici peut au moins donner un coup de main ici.
Merci beaucoup..
Meilleur,
Windermere
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésOuais... tu as raison. Je ne devrais pas utiliser le $.
Merci
Je crois que vos solutions et celles de Jim fonctionnent maintenant
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésEnfin, ça marche...
C'est une bonne expérience d'apprentissage.
Merci
Windermere
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésPensez que vous avez juste besoin de "C" (et non de "$C") au début du nom de fichier du fichier que vous essayez d'ouvrir.
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésSalut Jim, si j'essaie d'ouvrir un jeu de données qui n'est pas dans SAMPLE_DATA mais quelque part sous les fenêtres, par exemple, comme ceci "C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp"
Dois-je l'écrire ainsi ?
dt= Ouvrir("$C:\Users\yuanyli4\Desktop\JMP TEST\Sheet1.jmp");
Merci
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésdt = 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" );
Ce sont les choses que j'ai écrites sur la base des suggestions les plus récentes.
Cela ne fonctionne toujours pas... 
Quand j'essaie de le lancer. Aucune réponse du tout...
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésVoici un exemple de faire ce que vous voulez.J'utilise un exemple de tableau de données contenant de nombreuses variables continues.Je change le nom de l'une des colonnes continues en "Feature_1" pour imiter le nom de la colonne que vous ciblez.Je supprime ensuite toutes les colonnes continues de la colList qui apparaissent avant la colonne "Feature_1", puis j'exécute l'analyse sur toutes les colonnes 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 )}
);
Veuillez prendre le temps de lire le guide de script pour savoir ce qu'est le script
Aide==>Livres==>Guide de script
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésJe suis désolé. Cela ne fonctionne toujours pas.
Je me demande si quelqu'un peut aider avec le cas spécifique. Je suis désolé de ne pas savoir comment écrire le début de la boucle à partir de la colonne nommée Feature_1 jusqu'à la fin. J'espère vraiment que qui peut expliquer comment écrire le script là-dessus.
Merci
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésUne autre option à envisager est la fonction de filtrage des réponses JMP. Il ne fait pas le test de la somme des rangs, mais plutôt un test t ou un test robuste (pour sous-pondérer les valeurs aberrantes). Il fonctionne rapidement, fournit un tableau de valeurs p, des graphiques pour la signification par rapport aux tailles d'effet, et le meilleur de tous a une option "ajustement sélectionné" afin que vous puissiez facilement ajuster Y par X les caractéristiques qui vous intéressent le plus, puis vous pourrait exécuter le test de Wilcoxon sur un sous-ensemble des 2000 fonctionnalités.
https://www.jmp.com/support/help/14/response-screening.shtml
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésJim vous a déjà apporté une aide et des conseils précieux.
Si je comprends bien, vous pouvez avoir plus de 2 000 fonctionnalités, il peut donc être légèrement plus efficace d'éviter de les parcourir en boucle. De plus, regarder 2 000 rapports n'est pas génial, vous devez donc probablement résumer les résultats d'une manière ou d'une autre.
Dans ce cas, vous pouvez en effet éviter la boucle, vous voudrez peut-être comprendre comment fonctionne le code ci-dessous pour vous aider à aller plus loin avec JSL. Généralement, l'empilement des données et l'utilisation d'une variable 'By' est un bon modèle de codage à connaître. Bien sûr, dans l'exemple, il n'y a que deux "caractéristiques" (hauteur et poids).
// 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");
Bien sûr, lorsque vous appliquez un test statistique des milliers de fois, vous devez considérer que le taux de fausses alarmes sera inévitablement élevé.
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésMerci et vous avez absolument raison de dire que je n'ai pas de formation et d'expérience en rédaction de scripitng.
Je vais réessayer, j'ai aussi besoin de lire. J'espère que cela ne vous dérange pas si je poste quelque chose ici si je ne comprends pas...
Merci encore pour votre patience.
Meilleur,
Windermere
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésVous trouverez ci-dessous un script annoté qui devrait vous donner ce que vous voulez.
/* 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 )}
);
Toutes les fonctions et tous les messages du script ci-dessus sont documentés avec des exemples dans l'index de script
Aide==>Index des scripts
Les structures et méthodes JSL sont documentées dans le Scripting Guide
Aide==>Livres==>Guide de script
Cependant, il semble que vous soyez actuellement limité dans vos connaissances et votre expérience en programmation.Je vous suggère fortement de vous procurer l'un des nombreux livres sur l'introduction à la programmation.Bien que vous ne trouviez pas de livre sur "Introduction à la programmation pour le langage de script JMP", ce qui est vraiment nécessaire, c'est d'apprendre les concepts de programmation.Une fois que cela est compris, le passage d'un langage à l'autre dans le monde de la programmation devient une simple question d'apprentissage de la nouvelle syntaxe du nouveau langage.
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalités
/* 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 )};
C'est le script que j'ai utilisé.
Malheureusement,
Ca ne fonctionne pas du tout..
Aucune réponse.
Quelqu'un sait-il pourquoi?
Merci
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésSalut txnelson,
Merci pour votre aide. Je veux juste m'assurer que j'ai bien compris les éléments suivants.
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>
Pour ma table, je devrais l'écrire comme
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>
Est-ce correct?
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>
Dans mon cas, il devrait être écrit comme
<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>
Est-ce exact?
Donc, je ne comprends pas vraiment ce que signifie i=0, i=1, i=2 ? Pourriez-vous s'il vous plaît expliquer?
"Nitems" doit être remplacé par le nom de colonne de la dernière colonne (feature_2000). Ma compréhension est-elle correcte ?
Aussi, avons-nous besoin d'un ")" pour arrêter cette boucle ? Le modèle que vous avez montré ci-dessous n'avait pas le ")".
Merci.
J'essaierai le script demain et je vous ferai un retour.
Windermere
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésBoucler à travers les colonnes et exécuter l'une des plates-formes est l'un des éléments les plus courants traités dans le forum de discussion.La recherche sur "Looping" fait apparaître plusieurs sélections.Vous trouverez ci-dessous un exemple de bouclage tiré d'un exemple de bouclage sur des colonnes et d'exécution d'une plate-forme de création de graphiques.Le bouclage pour une plate-forme Oneway sera très similaire.
/* 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 : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésSalut,
Merci pour votre solution de sélection des informations du groupe.
Mais comment faire le test pour feature_1, à feature_2000 en boucle ? Pourriez-vous également fournir une solution à cela?
Merci
Windermere
Re : Comment écrire un script pour le test de somme de rang de Wilcoxon pour des milliers de fonctionnalitésLes deux solutions que je peux voir rapidement sont soit de définir l'état de la ligne pour toutes les lignes qui n'ont pas "Aucun traitement" ou "Traitement A" sur "Masquer et exclure", puis d'exécuter vos analyses Fit Y by 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(………………………..));
Ou, sous-ensemble les données dans un nouveau tableau qui ne contient que les lignes "Aucun traitement" et "Traitement A", puis effectuez l'analyse
names default to here(1);
dt=current data table();
dt << select where(:treatment =="No Treatment" | :treatment !=="Treatment A");
dt2=dt<<SUBSET></SUBSET>