JSL: Cómo añadir la condición "Y" al filtro de datosHola Comunidad JMP
Me preguntaba si hay una manera de agregar una condición "y" a un filtro de datos en JSL.
Como ejemplo hice un conjunto de datos

Si hacemos un modelo simple sólo sobre la media,
model = Fit Model( Y( :Data ), Run);
Podemos restringir el modelo a un solo grupo con un filtro de datos
dtf = model << Local Data Filter(Columns(:Group), where(:Group == "A"));

Sin embargo, ahora si quiero agregar otro filtro, las únicas opciones JSL que pude encontrar ("Agregar filtro", "Filtrar columnas" y similares) solo parecen agregarse como una condición "O".
dtf << Add Filter(columns(:Outlier), where(:outlier == 0));
dtf << Filter Columns(:Outlier);

La única opción parece ser eliminar el filtro de datos y luego agregar un nuevo filtro con todas las condiciones.
model << Remove Local Data Filter;
dtf = model << Local Data Filter(Columns(:Group, :Outlier), where(:Group == "A"), where(Outlier == 0));

¿Me falta alguna forma de agregar condiciones "Y" o esto simplemente no es posible?
hermano.
Kasper Schlosser
Automatización y scriptingRe: JSL: agregar la condición "Y" al filtro de datosCrea el filtro en JMP y copia el script
Fit Model(
Y(:Data),
Effects,
Personality("Standard Least Squares"),
Emphasis("Effect Leverage"),
Run(
:Data << {Summary of Fit(1), Analysis of Variance(1), Parameter Estimates(1),
Lack of Fit(0), Plot Actual by Predicted(1), Plot Regression(0),
Plot Residual by Predicted(1), Plot Studentized Residuals(0),
Plot Effect Leverage(1), Plot Residual by Normal Quantiles(0),
Box Cox Y Transformation(0)}
),
Local Data Filter(
Add Filter(
columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
)
)
);
En general, esto da una buena idea de lo que puedes escribir en el script.
dt = Current Data Table();
model = Fit Model(Y(:Data), Run);
dtf = model << Local Data Filter(
Columns(:Group, :Outlier),
Where(:Group == "A"),
Where(:Outlier == 1)
);
Re: JSL: agregar la condición "Y" al filtro de datosSí, el índice de scripts también ofrece una descripción general de qué mensajes acepta un filtro de datos (aunque no siempre todos).
Ambos parecen indicar que no, no hay forma de agregar una condición "y" a un filtro de datos a través de jsl.
Esto significaría que la única forma de agregar una condición "y" en jsl es extraer el código de filtro, cambiar el código, luego analizarlo y evaluarlo, lo cual es complicado y propenso a errores.
Re: JSL: agregar la condición "Y" al filtro de datosAsegúrese de agregar a la lista de deseos de JMP esta limitación expuesta.
Además, supongo que tengo una opinión diferente sobre el análisis y la evaluación que mencionaste. Me tranquiliza saber que, si me topo con una limitación, JMP ofrece esta capacidad de nivel básico que, la mayoría de las veces, me permite encontrar una solución.
Re: JSL: agregar la condición "Y" al filtro de datosCuando agrega nuevas columnas a los filtros, básicamente está creando nuevos grupos de filtrado y, de manera predeterminada, estos están separados por OR. Según el caso de uso, a veces puede usar Agrupado por Y
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(columns(:Region, :POP), Where(:Region == {"C", "N"})),
Mode(Select(0), Show(0), Include(1))
);
obj << Add Filter Columns(:State);
obj << Grouped by AND(1);
En la interfaz de usuario tenemos la opción Agregar al grupo seleccionado cuando presiona Y, pero no tenemos una opción de script simple para eso.
Re: JSL: agregar la condición "Y" al filtro de datos
@jthi escribió:
pero no tenemos una opción de scripting simple para eso.
Creo que tenemos:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
dtf << (Filter Column(:age) << Where(:age == 14));
Re: JSL: agregar la condición "Y" al filtro de datosEsto parece funcionar
Una prueba rápida indica que este método afecta al primer filtro, es decir, si tenemos 2 condiciones "o" solo podemos afectar la primera.
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
gb = dt << Graph builder();
dtf = gb << Local Data Filter(
Columns(:sex),
Where(:sex == "F")
);
// adds or condition
dtf << Add Filter(Columns(:sex), Where(:sex == "M"))
// Only affects the female filter
dtf << (Filter Column(:age) << Where(:age == 14));
pero para mi caso de uso esto es perfecto.
Re: JSL: agregar la condición "Y" al filtro de datos¡Buen hallazgo!
Parece que esto solo funciona si también envías el mensaje where con la columna de filtro. Puede que esto no sea intencional, que sea un error o algo así, pero tenemos suerte de tenerlo (simplemente puede fallar en cualquier momento cuando se actualice JMP).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Cities.jmp");
obj = dt << Data Filter(
Add Filter(
columns(:Region, :POP),
Where(:Region == {"C", "N"})
),
Mode(Select(0), Show(0), Include(1))
);
obj << Filter Column(:State); // creates OR group
obj << (Filter Column(:State) << Where()); // Adds AND filter to first filter group
obj << (Filter Column(:CO) << Where()); // Adds AND filter to first filter group
Lo más probable es que fuera mucho mejor si de alguna manera pudiéramos simplemente agregar filtros AND dentro de grupos existentes y no solo nuevos filtros OR grupos.
@Craige_Hales ¿Alguna idea de por qué sucede esto? ¿Alguna idea de a quién etiquetar del lado de JMP?
Re: JSL: agregar la condición "Y" al filtro de datosComo @jthi señaló anteriormente, los filtros se componen de "grupos" y "elementos", y el grupo de filtros no está directamente expuesto a JSL como un objeto que se puede programar. La sintaxis df << (Filter Column(:col) << Msg()) era la forma original de "reenviar" mensajes a un grupo, aunque no está bien documentada. Señalaré que esta sintaxis es una ruta muy diferente al mensaje simple df << Filter Column(:col), que está documentado en el Índice de programación de scripts. La sintaxis anterior no tiene reglas JSL integradas para su procesamiento, aunque se utiliza de forma similar en otros objetos, como Bivariate. Básicamente, el mensaje que se envía al filtro es una expresión y la sintaxis compatible es personalizada para el filtro.
Un poco más sobre la sintaxis especial para reenviar los mensajes. Hay un segundo argumento opcional para especificar el índice del grupo de filtros que debe recibir el mensaje. Esto puede ser importante cuando tienes varios grupos, que incluso pueden contener las mismas columnas. Sin esto, el comando se enviará a la primera columna coincidente o se agregará al primer grupo.
También puede encontrar que el Msg() que se envía al elemento de filtro solo puede ser un mensaje simple. El procesamiento aquí no admite el envío de una lista de comandos para procesar. Esto se debe nuevamente a que el << interno es una ejecución personalizada y no usa directamente las reglas básicas de JSL.
dt = Open( "$SAMPLE_DATA/Cities.jmp" );
df = dt << Data Filter(
Location( {1001, 218} ),
Add Filter( columns( :POP ), Where( :POP >= 4461 ) ),
Add Filter( columns( :OZONE ), Where( :OZONE <= 0.12581 ) )
);
// add a filter item to the first group
df << (Filter Column(:Region, 1) << Check Box Display);
// add a filter item to the second group
df << (Filter Column(:NO, 2) << Where(:NO <= 0.05));