Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Ich suche nach einer Möglichkeit, eine Teilmenge einer Datentabelle zu verwenden, die nur Zeilen verwendet, die einer bestimmten Bedingung entsprechen, und den Mittelwert dieser Zeilen von einer Spalte zu subtrahieren.
Angenommen, ich möchte mithilfe des Big Class-Datensatzes eine neue Spalte erstellen, die angezeigt wird "Höhenunterschied zwischen diesem Schüler und dem durchschnittlichen 14-Jährigen des gleichen Geschlechts."
Ich weiß, wie das geht, indem ich eine zweite Tabelle mit Tabellen -> Zusammenfassung -> Statistik: Mittelwert (Größe), Gruppe: Geschlecht, Untergruppe: Alter hinzufüge. Dann kann ich Tabelle -> Update: Große Klasse nach (Geschlecht), Übereinstimmungsspalten: Geschlecht = Geschlecht, und das fügt mehrere Spalten für Mittelwert (Größe, [Alter]) hinzu. Dann kann ich eine neue Spalte "Delta Höhe vs 14 Jahre gleichen Geschlechts" erstellen, die lautet: Höhe -: Mittelwert (Höhe, 14).
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? Es scheint, als ob Col Mean (x, byVar) kurz davor steht, diese Funktionalität bereitzustellen, aber es fehlt die Funktionalität, um eine andere Gruppe auszuwählen. Zum Beispiel könnte ich verwenden: height - Col Mean (: Größe ,: Alter ,: Geschlecht), um das Delta zwischen Schüler X und dem durchschnittlichen Schüler seines eigenen Geschlechts und seiner Größe zu finden, aber ich weiß nicht, ob es eine Möglichkeit gibt, dies anzugeben in Spalte bedeutet, dass ich nur Zeilen mit dem Alter = 14 berücksichtigen möchte, anstatt den dieser Zeile zugeordneten Alterswert zu verwenden.
Ich mache diese Art der Normalisierung sehr häufig, daher wäre alles, was sie schneller und einfacher macht, sehr dankbar!
DatentabelleBetreff: 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 befreit Sie!
Ich habe ein einfaches Skript geschrieben, das hauptsächlich die Fähigkeit von JSL verwendet, 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 dies nicht so tun.
Es gibt natürlich ausgefeiltere Möglichkeiten, ein Skript wie dieses zu schreiben, zumal alle "where" -Klauseln fest codiert sind und Sie möglicherweise auf Probleme mit diesem Skript stoßen, wenn Ihre Datentabelle groß ist, aber dennoch JSL wird Ihr Weg zur Produktivität sein.Es gibt mehrere großartige Ressourcen zum Erlernen von JSL!
Viel Glück!
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 offensichtlich wird, wenn Sie sie sehen. Col Mean () nimmt ein Frequenzspaltenargument:

Normalerweise ist dies der Fall, wenn Sie mit einer anderen Säule gewichten müssen. Aber was wäre in Ihrem Beispiel, wenn wir die Werte von Alter == 14 als 1 und alle anderen Werte als 0 gewichten könnten? Das würde uns einen Mittelwert von nur jenen Personen geben, bei denen Alter == 14 ist. Wir können das direkt in der Formel tun:
Col Mean( :height, <<FREQ></FREQ>

Dies wird zurückkehren:

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


Ich hoffe das hilft!
@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 meiner großen Klasse wird 62,55 (dh der Gesamt-Col-Mittelwert ohne Auswahl des Alters = 14) anstelle des korrekten Werts von 64,166 zurückgegeben.
Ich kann sogar Ihren Anhang herunterladen, und die richtigen Werte werden in der Spalte "Zentriert in Bezug auf den Mittelwert im Alter == 14" angezeigt. Wenn ich jedoch eine neue Spalte in dieser Tabelle mit genau derselben Formel erstelle, werden unterschiedliche Werte zurückgegeben (wobei [Höhe] - [durchschnittliche Gesamthöhe] angezeigt wird, anstatt [Höhe] - [durchschnittliche Höhe von 14 Jahren] korrekt anzuzeigen).
Ich verwende JMP Pro 14.3.0. Irgendwelche Ideen, wie ich meine Ausgabe an Ihre anpassen kann?
Und noch eine Frage auf Ihrem Blatt, wenn Sie ein zusätzliches byVar von: sex hinzufügen (für die Gesamtformel ": height - (Col Mean (: height ,: sex, << Freq (: age == 14))") die durchschnittliche Jungengröße von 14 Jahren von den Jungen und die durchschnittliche Mädchengröße von 14 Jahren von den Mädchen abziehen?
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @ MarkJSchwab ,
Es scheint, dass << Freq als optionales Argument in JMP 15 hinzugefügt wurde. Für frühere Versionen von JMP müssen Sie also etwas anderes tun.
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, da es einige Methoden gibt, die Sie später für wertvoll halten 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 get rows where () so ändern können, dass sie mit der gewünschten Suche übereinstimmt, einschließlich der zweiten Frage, die Sie meiner Meinung nach haben, um eine weitere Variable aufzunehmen. Zum Beispiel:
(:height << get datatable) << get rows where( :age == 14 & :sex == "F"

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

Dies gibt die Matrix der Werte zurück: Höhe für jede dieser Zeilen, in diesem Fall die Höhe 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, tolerant gegenüber fehlenden Daten und funktioniert für frühere Versionen von jmp. Alles in allem also eine bessere Lösung, denke ich. Vielen Dank, @brady_brady !
@julianisch
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Hallo @julianisch Nochmals vielen Dank für die Hilfe!
Eine letzte Falte: Idealerweise möchte ich, dass das mittlere Alter von 14 Jahren von den Mädchen und das mittlere Alter von 14 Jahren von den Jungen abgezogen wird. (In Ihrem Beispiel subtrahieren Sie das Alter von 14 Jahren von Jungen und 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', ändern Sie die Formel in Sagen Sie {mean (: height [(: height << get datatable) << get rows where where (: age == 14 &: sex == "M")])} ", aber in meinen allgemeineren Anwendungsfällen kann es sein, dass ich a Eine große Anzahl von Gruppen und verschachtelten Bedingungen würde unhandlich werden.)
Gibt es einen einfachen Weg, um dies zu erreichen?
Betreff: Formel zum Subtrahieren des Durchschnitts einer Teilmenge von einer Datenspalte?Sie müssen nur 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 @ MarkJSchwab ,
Ja, ich kann sehen, dass das Einwickeln in Bedingungen in vielen Fällen möglicherweise nicht ideal ist. Hier ist eine Modifikation von @brady_brady Die Lösung, die funktionieren sollte (Tabelle beigefügt):

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

Wie Sie sehen können, verwenden alle Zeilen das Alter von 14 Jahren als Teilmenge, aber welche Geschlechtsuntermenge wird durch die aktuellen Zeilenwerte des Geschlechts bestimmt. Sollte leicht an unterschiedliche Komplexitätsstufen angepasst werden können.
@julianisch