Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Ich suche nach einer Möglichkeit, eine Teilmenge einer Datentabelle, die nur Zeilen verwendet, die einer bestimmten Bedingung entsprechen, zu nehmen und den Mittelwert dieser Zeilen von einer Spalte zu subtrahieren.
Angenommen, ich möchte mithilfe des Big-Class-Datensatzes eine neue Spalte mit der Anzeige erstellen „Größenunterschied zwischen diesem Schüler und dem durchschnittlichen 14-Jährigen desselben Geschlechts.“
Ich weiß, wie das geht, indem ich eine zweite Tabelle hinzufüge, indem ich Tabellen -> Zusammenfassung -> Statistik: Mittelwert (Größe), Gruppe: Geschlecht, Untergruppe: Alter verwende. Dann kann ich Tabelle -> Aktualisieren: Große Klasse nach (Geschlecht) und Spalten anpassen: Geschlecht = Geschlecht, und dadurch werden mehrere Spalten für Mittelwert (Höhe, [Alter]) hinzugefügt. Dann kann ich eine neue Spalte „Deltagröße vs. 14 Jahre gleichen Geschlechts“ erstellen, die :height - :Mean(height, 14) lautet.
Meine Frage: Gibt es eine Möglichkeit, ohne eine zusätzliche Tabelle und die zusätzliche Spalte (z. B. „Mittelwert (Höhe, 14)“) zu erstellen? Offenbar ist Col Mean(x, byVar) kurz davor, diese Funktionalität bereitzustellen, aber es fehlt ihm die Funktionalität, eine andere Gruppe auszuwählen. Ich könnte zum Beispiel :height - Col Mean(:height, :age, :sex) verwenden, um das Delta zwischen Schüler X und dem durchschnittlichen Schüler seines eigenen Geschlechts und seiner eigenen Größe zu ermitteln, aber ich weiß nicht, ob es eine Möglichkeit gibt, das anzugeben in Col Bedeutet, dass ich nur Zeilen mit Alter=14 berücksichtigen möchte, anstatt den mit dieser Zeile verknüpften Alterswert zu verwenden.
Ich mache diese Art der Normalisierung sehr häufig, daher wäre ich über alles, was sie schneller und einfacher macht, enorm dankbar!
Datenmischung und -bereinigungBetreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Schön! Danke!!!
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @MarkJSchwab ,
Ja, ich kann mir vorstellen, dass es in vielen Fällen möglicherweise nicht ideal ist, dies in Bedingungen zu packen. Hier ist eine Änderung an @brady_brady Die Lösung, die funktionieren sollte (Tabelle im Anhang):

testVal = :sex;
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == testVal )] );
In diesem Fall erfassen wir den Wert von :sex für die aktuelle Zeile und speichern ihn in der Variablen testVal. Wenn wir dann die Zentrierfunktion auswerten, können wir die Verwendung dieses Werts in der Funktion „Zeilen abrufen where()“ testen.
Hier ist die Tabelle mit einer Spalte, die nur die Zeilen enthält, die von dieser Funktion „Get Rows Where()“ ausgewählt wurden:

Wie Sie sehen können, verwenden alle Zeilen das Alter 14 als Teilmenge, aber welche Geschlechtsteilmenge wird durch die aktuellen Zeilenwerte des Geschlechts bestimmt. Sollte sich leicht an unterschiedliche Komplexitätsstufen anpassen lassen.
@julianisch
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Sie müssen lediglich die Formel erweitern, um sowohl Männer als auch Frauen zu behandeln
If( :sex == "F",
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )] ),
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 & :sex == "M" )] )
)
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @julianisch Nochmals vielen Dank für die Hilfe!
Eine letzte Kleinigkeit: Idealerweise würde ich das Durchschnittsalter der 14-jährigen Mädchen von den Mädchen und das Durchschnittsalter der 14-jährigen Jungen von den Jungen abziehen. (In Ihrem Beispiel subtrahieren Sie das Alter von 14-jährigen Mädchen sowohl von den Jungen als auch von den Mädchen.)
(Mir ist klar, dass es in diesem speziellen Fall mit nur M/F einfach wäre, eine Bedingung zu verwenden und zu sagen: „Wenn :sex == 'F', dann verwenden Sie diese Formel, wenn :sex == 'M', dann ändern Sie die Formel in sagen wir {mean(:height[(:height << get datatable) << get rows where( :age == 14 & :sex == "M" )])}", aber in meinen allgemeineren Anwendungsfällen habe ich möglicherweise eine Eine große Anzahl von Gruppen und verschachtelten Bedingungen würde unhandlich werden.)
Gibt es eine einfache Möglichkeit, dies zu erreichen?
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @MarkJSchwab ,
Es scheint, dass <
Hier ist eine Lösung vom JMP-Assistenten @brady_brady :
:height - Mean( :height[(:height << get datatable) << get rows where( :age == 14 )] )

Es lohnt sich, sich einen Moment Zeit zu nehmen, um diese Formel auszupacken, denn ich wette, dass es einige Methoden gibt, die Ihnen später nützlich sein werden.
(:height << get datatable) << get rows where( :age == 14 )
gibt die Matrix der Zeileneinträge zurück, in denen :age==14. Wichtig ist, dass Sie die Funktion „Zeilen abrufen where()“ so ändern können, dass sie zu jeder gewünschten Suche passt, einschließlich der zweiten Frage, die Sie meiner Meinung nach stellen, nämlich der Einbindung einer weiteren Variablen. Zum Beispiel:
(:height << get datatable) << get rows where( :age == 14 & :sex == "F"

Da wir nun eine Matrix von Zeilen haben, die Ihrer Bedingung entsprechen, verwendet Brady diese Matrix, um :height zu subskriptieren.
height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )]

Dadurch wird die Matrix der Werte von :height für jede dieser Zeilen zurückgegeben, in diesem Fall die Körpergröße der 14-jährigen Studentinnen: [61, 62, 65, 63, 62]
Schließlich wird die Funktion „Mean()“ um diese Matrix gewickelt, die den Mittelwert zurückgibt, den Sie zur Berechnung Ihrer zentrierten Variablen benötigen:
mean(:height[(:height << get datatable) << get rows where( :age == 14 & :sex == "F" )])

Diese Lösung ist flexibler, toleranter gegenüber fehlenden Daten und funktioniert für frühere Versionen von JMP, also insgesamt eine bessere Lösung, denke ich. Danke, @brady_brady !
@julianisch
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @julianisch , danke für den Vorschlag. Leider, wenn ich genau diese Formel einfüge
Col Mean( :height, <<FREQ></FREQ>
In meine große Klasse gibt es 62,55 zurück (dh den Gesamt-Col-Mittelwert ohne Auswahl von Alter = 14) anstelle des korrekten Werts, den Sie sehen, von 64,166.
Ich kann sogar Ihren Anhang herunterladen und die richtigen Werte werden in der Spalte „Zentriert in Bezug auf den Mittelwert bei Alter==14“ angezeigt. Wenn ich jedoch eine neue Spalte in dieser Tabelle mit genau derselben Formel erstelle, werden andere Werte zurückgegeben (es werden [Höhe] – [durchschnittliche Gesamthöhe] angezeigt, anstatt [Höhe] – [durchschnittliche Höhe von 14 Jahren] richtig anzuzeigen).
Ich verwende JMP Pro 14.3.0. Irgendwelche Ideen, wie ich meine Ausgabe an Ihre anpassen kann?
Und noch eine Frage: Wenn Sie auf Ihrem Blatt eine zusätzliche byVar von :sex (für die Gesamtformel „:height - (Col Mean( :height, :sex, <Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?
Hallo @MarkJSchwab ,
Es gibt eine einfache Möglichkeit, dies mit Col Mean() zu tun, die erst dann offensichtlich wird, wenn Sie sie sehen. Col Mean() übernimmt ein Frequency-Spaltenargument:

Normalerweise ist dies der Fall, wenn Sie eine Gewichtung mithilfe einer anderen Spalte benötigen. Aber was wäre, wenn wir in Ihrem Beispiel die Werte von Age==14 mit 1 und alle anderen Werte mit 0 gewichten könnten? Das würde uns einen Mittelwert nur der Personen geben, deren Alter == 14 Jahre beträgt. Das können wir direkt in der Formel machen:
Col Mean( :height, <<FREQ></FREQ>

Dies wird zurückkommen:

Nun können wir für Ihre spezielle Frage, die sich auf diesen spezifischen Mittelwert aus der Höhe konzentriert, dies auf die übliche Weise in die Formel einbinden:
:height - (Col Mean( :height, <<FREQ></FREQ>


Ich hoffe das hilft!
@julianisch
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo, MarkJSchwab!
Natürlich gibt es eine Möglichkeit, das zu tun, was Sie möchten.JSL wird Sie befreien!
Ich habe ein einfaches Skript geschrieben, das hauptsächlich die Fähigkeiten von JSL nutzt, um ein Skript für Sie zu schreiben.Versuch es:
// Title: Bigclass Normalization Script for JMP User Community discussion
// Purpose: Demonstrate how to write a very basic script to do "normalizations"
Names Default To Here( 1 );
Bigclass_dt = Open( "$SAMPLE_DATA\Big Class.jmp" );
BigclassSummary_dt = bigclass_dt << Summary( Group( :age, :sex ), Mean( :height ) );
BigclassSummary_dt << Select Where( :Age != 14 ) << Delete Rows;
Bigclass_dt << Join(
With( BigclassSummary_dt ),
Select( :name, :age, :sex, :height ),
SelectWith( :Name( "Mean(height)" ) ),
By Matching Columns( :sex = :sex ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 ),
Output Table( "NormedBigclass by AgeGender" )
);
BigclassJoin_dt = Data Table( "NormedBigclass by AgeGender" ) << New Column( "Normalized",
numeric,
continuous,
Formula( :Name( "height" ) - :Name( "Mean(height)" ) ),
evalFormula
);
Close( BigclassSummary_dt, NoSave );
Ich habe eine separate Übersichtstabelle erstellt und diese dann geschlossen, aber Sie müssen es nicht so machen.
Es gibt natürlich ausgefeiltere Möglichkeiten, ein Skript wie dieses zu schreiben, insbesondere da alle „Where“-Klauseln fest codiert sind und Sie möglicherweise Probleme mit diesem Skript haben, wenn Ihre Datentabelle groß ist, aber immer noch JSL wird Ihr Weg zur Produktivität sein.Es gibt mehrere großartige Ressourcen zum Erlernen von JSL!
Viel Glück!