Création d'une fonction statistique personnalisée (formule) qui a byVarLié à cet élément de liste de souhaits que j'ai créé : Ajouter une normalisation et des fonctions statistiques robustes (et des fonctions matricielles) . Je pensais que je pouvais simplement essayer de les écrire en tant que fonctions personnalisées pour le moment (même si je sais qu'il sera impossible de les partager et de les mettre à jour pour tout le monde), mais j'ai rencontré mon premier problème presque immédiatement : comment référencer les colonnes... Lors de l'utilisation de formules personnalisées, suis-je bloqué en utilisant des calculs au niveau des lignes ou en référençant des colonnes en tant que chaînes au lieu de :colname, ce qui m'empêcherait de les utiliser directement à partir de l'éditeur de formules.
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)));Tableau de donnéesScriptRe : Création d'une fonction statistique personnalisée (formule) qui a byVarÉlément de la liste de souhaits qui, je pense, rendrait cela beaucoup plus facile :
Option ou fonction pour évaluer une formule de colonne personnalisée à la fois, ou mettre en cache des valeurs entre les lignes
Re : Création d'une fonction statistique personnalisée (formule) qui a byVarDeux commentaires :
- Je n'arrive pas à trouver la référence, mais je me souviens qu'on m'a définitivement dit à un moment donné qu'il n'y avait aucun moyen d'écrire une formule de colonne personnalisée qui met en cache sa valeur entre les lignes comme le font les formules internes.Ainsi, vous auriez besoin d'écrire une fonction qui évalue dans le contexte de chaque ligne, ce qui signifie qu'elle renvoie une seule valeur à la fois.(J'aimerais que quelqu'un me corrige ici si c'est possible.)
- JMP évalue la référence de colonne avant de la transmettre à la fonction (évaluation rapide), ce qui signifie que vous obtenez la valeur de cette ligne au lieu de la colonne entière.Vous devez indiquer à JMP de transmettre une référence à la colonne, et vous pouvez le faire avec Expr.
Je pense que cela résout les deux problèmes, mais je ne suis pas sûr que ce soit très intuitif ou convivial.
Mise à jour : la fonction personnalisée peut accéder au contexte de la ligne, vous pouvez donc éviter de transmettre la valeur de la ligne actuelle à la fonction, comme dans le test2.
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))));Re : Création d'une fonction statistique personnalisée (formule) qui a byVarBon point!J'étais tellement concentré sur l'évaluation des références de colonne que je n'ai même pas remarqué que les valeurs étaient absurdes.Je vais y réfléchir plus.
Re : Création d'une fonction statistique personnalisée (formule) qui a byVarCela ne semble pas fournir de réponse correcte car il les évalue très probablement "ligne par ligne" et non en tant que colonnes

Re : Création d'une fonction statistique personnalisée (formule) qui a byVarEst-ce que cela fait ce que vous voulez ?Il semble que vous deviez évaluer explicitement les paramètres de la fonction si vous vous attendez à ce qu'ils soient des références de colonne.
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);