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 robustas (y funciones matriciales) . Pensé que podría tratar de 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 las columnas... Cuando uso fórmulas personalizadas, me quedo atascado usando cálculos de nivel de fila o haciendo referencia a columnas como cadenas en lugar de: nombre de columna, 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)));Tabla de datossecuencias de comandosRe: Creación de una 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 valores entre filas
Re: Creación de una función estadística personalizada (fórmula) que tiene byVarDos comentarios:
- Parece que no puedo encontrar la referencia, pero recuerdo que me dijeron definitivamente en un momento 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 evalúe en el contexto de cada fila, lo que significa que devuelve un solo valor a la vez.(Me encantaría que alguien me corrija aquí si eso 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 en toda la columna.Debe decirle 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 omitir 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: Creación de una 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: Creación de una función estadística personalizada (fórmula) que tiene byVarEso no parece proporcionar una respuesta correcta, ya que lo más probable es que los evalúe "fila por fila" y no como columnas

Re: Creación de una 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 columna.
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);