Extrahieren Sie Daten aus einer EinweganalyseIch versuche, ein Skript zu erstellen, um den p-Wert aus der Einweganalyse zu übernehmen und ihn in eine neue Spalte in der für die Analyse verwendeten Tabelle einzufügen.
Ich habe mir den JMP 13-Skriptleitfaden angesehen und auf Seite 690 steht „Werte aus einer Analyse in einen Bericht extrahieren“, was genau das zu sein scheint, was ich möchte. Folgt man dieser Anleitung jedoch, scheint es mit oneway und anovas nicht zu funktionieren ...
Hier ist das aufgelistete Skript, das ich geändert habe, um mit dem Bigclass-Beispieldatensatz zu arbeiten, während ich versucht habe, Fehler im Code zu beheben:
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]),
),
);*/
Aber das eingebettete Protokoll weist einen Fehler auf, wenn die Anova in einen Bericht eingefügt wird:
Send erwartet ein skriptfähiges Objekt beim Zugriff oder bei der Auswertung von „Send“, Report( anova )[Outline Box( 9 )] << /*###*/Close( 0 ) /*###*/
Der Debugger schlägt an derselben Stelle fehl und gibt diese als Variablen aus:
Variable Wert
anova {Oneway[], Ein Weg[]}
dt-Datentabelle („große Klasse“)
reportanova {DisplayBox[OutlineBox], DisplayBox[OutlineBox]}
Daher kann ich nur vermuten, dass sich das, was mit Bivariate funktioniert, nicht auf Oneway erstreckt.Ich habe sogar die Variablen geändert und anova zu anov gekürzt, für den Fall, dass es sich um eine Nichtübereinstimmung von Variable/Befehl/etwas handelte, aber es schlägt weiterhin fehl.Da war ein vorherigen Post aus dem Jahr 2011 mit einem Beispielcode, der jedoch mit Schriftartinformationen verstümmelt war, die sich in Word, einem JMP-Skriptfenster oder dem Speichern als HTML-Datei nicht klären ließen, sodass ich ihn tatsächlich lesen konnte ...
Das muss ich lösen, bevor ich sehen kann, ob mein Code zum Hinzufügen des p-Werts zur richtigen Zeile funktioniert ...
Danke.
Betreff: Daten aus einer Einweganalyse extrahierenSollte jemand auch sehen wollen, wie ich es geschafft habe, den Wert entsprechend Geschlecht und Alter wieder in die Tabelle einzutragen:
//creates a new column
dt<<NEW column=""></NEW>
Es gibt vielleicht eine einfachere oder sauberere Möglichkeit, dies zu tun, aber es funktioniert. Verschachtelte if-Anweisungen und for-Schleifen funktionierten ebenfalls, sobald mir klar wurde, dass der Datentyp des ursprünglichen Alters nicht mit „Zahl“ übereinstimmte und die Liste aus „LSD Threshold Matrix“ „Zeichen“ war.
Betreff: Daten aus einer Einweganalyse extrahierenIch habe das Verstümmelte aufgeräumt Post ab 2011.
Betreff: Daten aus einer Einweganalyse extrahierenEine starke Empfehlung für etwas, das wir als „Best Practice“ lehren: Verwenden Sie das nicht absolute Indizes die im Anzeigebaumdiagramm angezeigt werden. Auf diese Weise können Sie korrekte Indizes schreiben. Warum also nicht?Denn dieser Weg ist schwer zu verfassen, zu lesen und daher aufrechtzuerhalten, und er ist brüchig. Benutzen Sie die relative Indizierung wie in meiner Lösung dargestellt. Es ist einfacher zu schreiben, zu lesen (selbstdokumentierend?) und zu warten. Es ist auch viel weniger spröde. Sei egoistisch und denke nur an dich selbst!
Denken Sie daran, dass sich auch JMP ändert: Versionen führen neue Abschnitte in Berichten ein oder verschieben Abschnitte, Sie ändern Ihre Plattformeinstellungen, jemand anderes verwendet Ihr Skript mit anderen Einstellungen und so weiter. Defensives Scripting rechnet mit solchen Schwankungen.Relative Indizes sind dagegen robust.
Manche Leute denken, dass diese Wahl nur eine Frage des Stils ist. Ich hoffe, dass sie nie unter Veränderungen leiden.
(Und lassen Sie mich nicht mit der Verwendung der Interpreteranweisung „Senden an Bericht“ beginnen ...)
Betreff: Daten aus einer Einweganalyse extrahierenDas funktioniert, Danke!
Für alle anderen, die hier suchen ... und um sicherzustellen, dass ich den Code verstehe und nicht nur kopiere und einfüge, in:
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>
Die Option „By()“ im Oneway-Modus erstellt zwei separate Instanzen innerhalb des Berichts. Ich vermute, dass dies der Grund dafür ist, dass „<
anova rpt<SPAN class="token punctuation">[</SPAN><SPAN class="token number">1</SPAN><SPAN class="token punctuation">]</SPAN>
zeigt auf die erste Gruppe, die beim Erstellen des Oneway aus „By(:sex)“ erstellt wurde, nämlich „F“, und „anova rpt[2]“ bezieht sich auf Gruppe 2 „M“.T Das ursprüngliche Skript aus dem Skriptleitfaden brauchte es nicht, da es nur einen Abschnitt im Bericht gab, mit dem man sich befassen musste, obwohl es sich um eine einfache Bivariate handelte?
Dann das 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>
lässt jmp direkt zum Abschnitt „LSD Threshold Matrix“ des Berichts springen und setzt das Nummerierungsschema zurück, weshalb die String-Spalte jetzt durch ...Box(1) aktualisiert wird, aber für die gesamte Baumstruktur ist es ... Kasten(5).Bei allen drei handelt es sich um gleichwertige Möglichkeiten, die aktualisierte Altersliste der Frauen aus der Baumstruktur abzurufen:
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>
Wenn dann „By (:sex)“ auskommentiert wird, wird die Baumstruktur vereinfacht und:
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>
Beide funktionieren jetzt, da [1] verstanden wird und nicht angegeben werden muss, da [2] nicht einmal mehr eine Option ist.
Betreff: Daten aus einer Einweganalyse extrahierenEs gibt allgemeine Regeln und Syntax, die für alle JMP-Plattformen (Berichte) gelten, aber die Zusammensetzung (dh bestimmte verschachtelte Anzeigefelder) variiert natürlich. Versuchen Sie diesen Ansatz:
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;