Creación de una función estadística personalizada (fórmula) que tiene byVarRelacionado con este elemento de la lista de deseos que creé: Agregue normalización y funciones estadísticas sólidas (y funciones matriciales) . Pensé que podría intentar escribirlas como funciones personalizadas por ahora (aunque sé que será imposible compartirlas y actualizarlas para todos), pero me enfrenté a mi primer problema casi de inmediato: cómo hacer referencia a columnas... Cuando uso fórmulas personalizadas, me quedo atascado usando cálculos a nivel de fila o haciendo referencia a columnas como cadenas en lugar de :colname, lo que me impediría usarlas directamente desde el Editor de fórmulas.
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)));Combinación y limpieza de datosExploración y visualización de datosLa personalización en masaRe: Crear función estadística personalizada (fórmula) que tiene byVarElemento de la lista de deseos que creo que haría esto mucho más fácil:
Opción o función para evaluar una fórmula de columna personalizada a la vez o almacenar en caché valores entre filas
Re: Crear función estadística personalizada (fórmula) que tiene byVarDos comentarios:
- Parece que no puedo encontrar la referencia, pero recuerdo que en un momento me dijeron definitivamente que no hay forma de escribir una fórmula de columna personalizada que almacene en caché su valor entre filas como lo hacen las fórmulas internas.Por lo tanto, necesitaría escribir una función que se evalúe en el contexto de cada fila, lo que significa que devuelve un valor único a la vez.(Me encantaría que alguien me corrigiera aquí si es posible).
- JMP evalúa la referencia de la columna antes de pasarla a la función (evaluación ansiosa), lo que significa que obtiene el valor en esa fila en lugar de toda la columna.Debe indicarle a JMP que pase una referencia a la columna, y puede hacerlo con Expr.
Creo que esto soluciona ambos problemas, pero no estoy seguro de que sea muy intuitivo o fácil de usar.
Actualización: la función personalizada puede acceder al contexto de la fila, por lo que puede evitar la necesidad de pasar el valor de la fila actual a la función, como en 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: Crear función estadística personalizada (fórmula) que tiene byVar¡Buen punto!Estaba tan concentrado en evaluar las referencias de las columnas que ni siquiera me di cuenta de que los valores no tenían sentido.Lo pensaré más.
Re: Crear función estadística personalizada (fórmula) que tiene byVarEso no parece proporcionar una respuesta correcta, ya que lo más probable es que las evalúe "fila por fila" y no como columnas.

Re: Crear función estadística personalizada (fórmula) que tiene byVar¿Hace esto lo que quieres?Parece que necesita evaluar explícitamente los parámetros de la función si espera que sean referencias de columnas.
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);