Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarBezogen auf diesen Wunschlisteneintrag, den ich erstellt habe: Fügen Sie Normalisierung und robuste statistische Funktionen (und Matrixfunktionen) hinzu. . Ich dachte, ich könnte einfach versuchen, diese vorerst als benutzerdefinierte Funktionen zu schreiben (auch wenn ich weiß, dass es unmöglich sein wird, sie zu teilen und für alle zu aktualisieren), aber ich stand fast sofort vor meinem ersten Problem: wie man Spalten referenziert ... Wenn ich benutzerdefinierte Formeln verwende, muss ich Berechnungen auf Zeilenebene verwenden oder Spalten als Zeichenfolgen anstelle von „:colname“ referenzieren, was mich daran hindern würde, sie direkt im Formeleditor zu verwenden.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_min = New Custom Function(
"custom",
"My Min1",
Function({x, y},
As Constant(
vals = Column(x) << get values;
groups = Column(y) << get values;
);
cur_group = Loc(groups, As Column(y));
vals[cur_group[Loc Min(vals[cur_group])]];
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
my_min = New Custom Function(
"custom",
"My Min2",
Function({x, y},
Col Minimum(Column(x), Column(y));
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
my_min = New Custom Function(
"custom",
"My Min3",
Function({x, y},
Col Minimum(x, y);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
dt << New Column("ColMin", Numeric, Continuous, Formula(Col Minimum(:height, :sex)));
dt << New Column("MyMin1_str", Numeric, Continuous, Formula(custom:My Min1("height", "sex")));
dt << New Column("MyMin2_str", Numeric, Continuous, Formula(custom:My Min2("height", "sex")));
dt << New Column("MyMin3_str", Numeric, Continuous, Formula(custom:My Min3("height", "sex")));
dt << New Column("MyMin1_ref", Numeric, Continuous, Formula(custom:My Min1(:height, :sex)));
dt << New Column("MyMin2_ref", Numeric, Continuous, Formula(custom:My Min2(:height, :sex)));
dt << New Column("MyMin3_ref", Numeric, Continuous, Formula(custom:My Min3(:height, :sex)));Datenmischung und -bereinigungDatenexploration und -visualisierungMassenanpassungBetreff: Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarWunschlisteneintrag, von dem ich glaube, dass er dies viel einfacher machen würde:
Option oder Funktion zum sofortigen Auswerten einer benutzerdefinierten Spaltenformel oder zum Zwischenspeichern von Werten zwischen Zeilen
Betreff: Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarZwei Kommentare:
- Ich kann anscheinend den Verweis darauf nicht finden, aber ich erinnere mich, dass mir irgendwann definitiv gesagt wurde, dass es keine Möglichkeit gibt, eine benutzerdefinierte Spaltenformel zu schreiben, die ihren Wert zwischen Zeilen zwischenspeichert, wie es bei internen Formeln der Fall ist.Daher müssten Sie eine Funktion schreiben, die im Kontext jeder Zeile auswertet, was bedeutet, dass sie jeweils einen einzelnen Wert zurückgibt.(Ich würde mich freuen, wenn mich hier jemand korrigiert, wenn das möglich ist.)
- JMP wertet die Spaltenreferenz aus, bevor sie an die Funktion übergeben wird (eifrige Auswertung), was bedeutet, dass Sie den Wert in dieser Zeile und nicht in der gesamten Spalte erhalten.Sie müssen JMP anweisen, einen Verweis auf die Spalte zu übergeben, und das können Sie mit Expr tun.
Ich glaube, dass dadurch beide Probleme behoben werden, bin mir aber nicht sicher, ob es sehr intuitiv oder benutzerfreundlich ist.
Update: Die benutzerdefinierte Funktion kann auf den Zeilenkontext zugreifen, sodass Sie die Notwendigkeit, den Wert für die aktuelle Zeile wie in Test2 an die Funktion zu übergeben, überspringen können.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
my_min = New Custom Function(
"custom",
"Test1",
Function({x,y,yval},
show(yval);
show(Name Expr(x)<< get values);
show(Loc(Name Expr(y) << Get Values, yval));
Min((Name Expr(x)<< get values)[Loc(Name Expr(y) << Get Values, yval)]);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
custom:Test1(Expr(:age),Expr(:sex),"F");
dt << New Column("Test1", Numeric, Continuous, Formula(custom:Test1(Expr(:height), Expr(:sex), :sex)));
my_min = New Custom Function(
"custom",
"Test2",
Function({x,y},
xvals = Name Expr(x)<< get values;
yvals = Name Expr(y) << Get Values;
Min(xvals[Loc(yvals, yvals[row()])]);
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);
dt << New Column("Test2", Numeric, Continuous, Formula(custom:Test2(Expr(:height), Expr(:sex))));Betreff: Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarGuter Punkt!Ich war so darauf konzentriert, die Spaltenverweise auszuwerten, dass mir nicht einmal auffiel, dass die Werte unsinnig waren.Ich werde mehr darüber nachdenken.
Betreff: Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarDas scheint keine richtige Antwort zu liefern, da sie höchstwahrscheinlich „Zeile für Zeile“ und nicht als Spalten ausgewertet werden

Betreff: Erstellen einer statistischen benutzerdefinierten (Formel-)Funktion mit byVarMacht das, was Sie wollen?Es sieht so aus, als müssten Sie die Funktionsparameter explizit auswerten, wenn Sie erwarten, dass es sich um Spaltenverweise handelt.
my_min = New Custom Function(
"custom",
"My Min4",
Function({x, y},
EvalExpr(Col Minimum(Expr(x), Expr(y)));
),
<< Formula Category("Statistical")
);
Add Custom Functions(my_min);