Extraire les données d'une analyse unidirectionnelleJ'essaie de créer un script pour prendre la valeur p de l'analyse unidirectionnelle et la déposer dans une nouvelle colonne du tableau utilisé pour l'analyse.
J'ai consulté le guide de script JMP 13 et à la page 690, il y a "Extraire les valeurs d'une analyse dans un rapport", ce qui semble être ce que je veux. Cependant, à titre indicatif, cela ne semble pas fonctionner avec oneway et anovas...
Voici le script répertorié que j'ai modifié pour fonctionner avec l'exemple de jeu de données bigclass pendant que j'essayais de dépanner le code :
Deletesymbols();
dt=Open("$SAMPLE_DATA\Big Class.jmp");
//creates a oneway analysis of big class similar how my data will be interpreted
anova=Oneway(
Y(:height),
X(:age),
With Control(1, {12}),
Means(1), Mean Diamonds(1), Comparison Circles(1),
By(:sex)
);
anova<<show tree structure;
/*
Female LDS threshold results are in OultineBox(9), Levels (age) is StringColBox(5), pValues are NumberColBox(15)
Male LDS threshold results are in OultineBox(18), Levels (age) is StringColBox(10), pValues are NumberColBox(30)
*/
// Should create a report that I can use to extract data from the anova analysis based off the original script
report(anova) [Outline Box(9)] << Close( 0 ); <BR />report(anova) [Outline Box(18)] << Close( 0 );
reportanova = anova << Report;
// Should extract the level (age) and pvalues for females
agef = reportanova[Outline Box(9)][String Col Box(5)] << Getaslist;
pvalsf = reportanova[Outline Box(9)][NumberColBox(15)] << Getaslist;
// Should extract the level (age) pvalues for males
agem = reportanova[Outline Box(18)][String Col Box(10)] << Getaslist;
pvalsm = reportanova[Outline Box(18)][NumberColBox(30)] << Getaslist;
//column creation to recieve extracted data
dt<<new column("p-value",Numeric, "Continuous");
//should add the collected p-value to the data table in the new column, matched to the correct row based on sex and age <FONT color="#FF0000">(untested)</FONT>.
For Each Row( p-value =
match(sex,
"f",match(age,
show(agef[1]),show(pvalsf[1]),
show(agef[2]),show(pvalsf[2]),
show(agef[3]),show(pvalsf[3]),
show(agef[4]),show(pvalsf[4]),
show(agef[5]),show(pvalsf[5]),
show(agef[6]),show(pvalsf[6]),
),
"m",match(age,
show(agem[1]),show(pvalsm[1]),
show(agem[2]),show(pvalsm[2]),
show(agem[3]),show(pvalsm[3]),
show(agem[4]),show(pvalsm[4]),
show(agem[5]),show(pvalsm[5]),
show(agem[6]),show(pvalsm[6]),
),
);*/
Mais le journal intégré contient une erreur lors de la mise de l'anova dans un rapport :
Send Attend un objet scriptable lors de l'accès ou de l'évaluation de 'Send', Report( anova )(Outline Box( 9 )] << /*###*/Close( 0 ) /*###*/
Le débogueur échoue au même endroit et donne celles-ci comme variables :
Variable Valeur
anova {Oneway[], Sens Unique[]}
Table de données dt ("grande classe")
reportanova {DisplayBox[OutlineBox], DisplayBox[OutlineBox]}
Je ne peux donc que deviner que ce qui fonctionne avec Bivariate ne s'étend pas à Oneway.J'ai même changé les variables, en raccourcissant anova en anov au cas où il s'agirait d'une incompatibilité variable/commande/quelque chose, mais cela continue d'échouer.Il y avait un post précédent à partir de 2011 avec un exemple de code, mais il était brouillé avec des informations sur la police qui ne s'éclaireraient pas dans Word, dans une fenêtre de script jmp ou ne seraient pas enregistrées sous forme de fichier HTML pour que je puisse réellement le lire...
Je dois résoudre ce problème avant de pouvoir voir si mon code pour ajouter la valeur p à la bonne ligne fonctionne...
Merci.
Re : Extraire les données d'une analyse unidirectionnelleSi quelqu'un veut également voir comment j'ai obtenu l'ajout de la valeur au tableau en fonction du sexe et de l'âge au travail :
//creates a new column
dt<<NEW column=""></NEW>
Il existe peut-être un moyen plus simple ou plus simple de procéder, mais cela fonctionne. Les instructions if et for imbriquées ont également fonctionné dès que j'ai réalisé l'inadéquation du type de données de l'âge d'origine en tant que « nombre », et la liste de « Matrice de seuil LSD » était « caractère ».
Re : Extraire les données d'une analyse unidirectionnellePour ce que ça vaut, j'ai nettoyé les brouillés poste à partir de 2011.
Re : Extraire les données d'une analyse unidirectionnelleUne recommandation forte pour quelque chose que nous enseignons comme « meilleure pratique » : ne pas utiliser le indices absolus qui sont affichés dans l’arborescence d’affichage. Vous pouvez écrire des indices corrects de cette façon, alors pourquoi pas ?Parce que cette méthode est difficile à composer, à lire et donc à maintenir, et elle est fragile. Utilisez le indexation relative comme illustré dans ma solution. Il est plus facile à écrire, à lire (à s'auto-documenter ?) et à maintenir. Il est aussi beaucoup moins cassant. Soyez égoïste et ne pensez qu’à vous !
N'oubliez pas que JMP évolue également : les versions introduisent de nouvelles sections dans les rapports ou déplacent des sections, vous modifiez les préférences de votre plateforme, quelqu'un d'autre utilise votre script avec des préférences différentes, etc. Scripts défensifs anticipe une telle variation.Les indices relatifs y sont robustes.
Certains pensent que ce choix n’est qu’une question de style. J'espère qu'ils ne souffriront jamais du changement.
(Et ne me lancez pas dans l'utilisation de la directive de l'interpréteur Send To Report...)
Re : Extraire les données d'une analyse unidirectionnelleCela fonctionne, merci !
Donc, pour tous ceux qui cherchent ici... et pour m'assurer que je comprends bien et que je ne me contente pas de copier et coller du code, dans :
f ages <SPAN class="token operator">=</SPAN> anova rpt<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token string">"LSD Threshold Matrix"</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token function">StringColBox</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get</SPAN><SPAN class="token punctuation">;</SPAN>
L'option 'By()' dans oneway crée deux instances distinctes dans le rapport, je suppose que c'est pourquoi '<
anova rpt<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN>
pointe vers le premier groupe créé à partir de 'By(:sex)' lors de la création du sens unique, qui est 'F', et 'anova rpt[2]' fait référence au groupe 2 'M'.T Le script original du guide de script n'en avait pas besoin car il n'y avait qu'une seule section à traiter dans le rapport lorsqu'il s'agissait d'une simple variable bivariée ?
Puis le segment :
<SPAN class="token punctuation">[</SPAN><SPAN class="token string">"LSD Threshold Matrix"</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token function">StringColBox</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN>
permet à jmp de passer directement à la section "LSD Threshold Matrix" du rapport et réinitialise le schéma de numérotation, c'est pourquoi la colonne de chaîne est maintenant référencée par ...Box(1), mais pour toute la structure arborescente, c'est... Encadré (5).Ces trois moyens étant équivalents, vous pouvez obtenir la liste des âges féminins référencés à partir de la structure arborescente :
f ages <SPAN class="token operator">=</SPAN> anova rpt<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token string">"LSD Threshold Matrix"</SPAN><SPAN class="token punctuation">]</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token function">StringColBox</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get</SPAN><SPAN class="token punctuation">;<BR />f ages = anova rpt[1][Outline Box(9)][StringColBox(1)] << Get;<BR />f ages = anova rpt[1][StringColBox(5)] << Get;<BR /></SPAN>
Ensuite, si le By (:sex) est commenté dans un sens unique, l'arborescence est simplifiée et :
ages <SPAN class="token operator">=</SPAN> anova rpt[1]<SPAN class="token punctuation">[</SPAN><SPAN class="token function">StringColBox</SPAN><SPAN class="token punctuation">(5</SPAN><SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator"><</SPAN><SPAN class="token operator"><</SPAN><SPAN class="token messages"> Get</SPAN><SPAN class="token punctuation">;<BR />ages = anova rpt[StringColBox(5)] << Get;<BR /></SPAN>
les deux fonctionnent maintenant parce que le [1] est compris et n'a pas besoin d'être spécifié car [2] n'est même plus une option.
Re : Extraire les données d'une analyse unidirectionnelleIl existe des règles et une syntaxe générales qui s'appliquent à toutes les plates-formes JMP (rapports), mais la composition (c'est-à-dire les zones d'affichage imbriquées spécifiques) varie bien entendu. Essayez cette approche :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
//creates a oneway analysis of big class similar how my data will be interpreted
anova = dt << Oneway(
Y( :height ),
X( :age ),
With Control( 1, {12} ),
Means( 1 ),
Mean Diamonds( 1 ),
Comparison Circles( 1 ),
By( :sex )
);
anova rpt = anova << Report;
f ages = anova rpt[1]["LSD Threshold Matrix"][StringColBox(1)] << Get;
f pVal = anova rpt[1]["LSD Threshold Matrix"][NumberColBox(2)] << Get;
m ages = anova rpt[2]["LSD Threshold Matrix"][StringColBox(1)] << Get;
m pVal = anova rpt[2]["LSD Threshold Matrix"][NumberColBox(2)] << Get;