Actualmente tengo un script que crea gráficos de capacidad de proceso y control para una variedad de variables, lo coloca en un diario y luego lo guarda como PDF. El problema es que mi script tiene 5000 líneas y se ejecuta más lento que la melaza en un congelador. Entonces pensé que tendría más sentido definir una función para cada tipo de gráfico que construyo y unirlos de esa manera. Creé con éxito funciones para los gráficos de control, pero no puedo hacer que funcione el gráfico de capacidad del proceso.
Aquí hay un script que utiliza los datos de muestra del aeropuerto (adjuntos) para crear un gráfico similar al que estoy intentando crear:
Process Capability(
Process Variables( :Flight ), // select column for data
Spec Limits( :Flight( LSL( 0 ), /*Target( 30 ),*/ USL( 20 ) ) ), //Spec limits, dont need target
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{:Flight << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)},
);Me gustaría definir una función con el nombre de la columna como entrada. Esto es lo que tengo hasta ahora:
capability_chart = function({variable, low, up},
Process Capability(
Process Variables( eval(variable) ), // select column for data
Spec Limits( eval(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{column(dt, element) << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)}
)
);
capability_chart("Flight", 0, 10)Cuando ejecuto esto, aparece una ventana que me solicita límites de especificaciones. Quiero que mi secuencia de comandos complete automáticamente los límites de especificaciones. También intenté usar column() y ascolumn() en lugar de eval() en la línea de límites de especificaciones, pero hicieron lo mismo. Idealmente, no tendría que crear una tabla de especificaciones ni agregar límites de especificaciones como propiedad de columna, pero puedo hacerlo si no hay otra manera. Tampoco quiero recorrer todas las columnas y crear un montón de gráficos de capacidad de proceso porque existe un formato para el informe que sería confuso cambiar. Se agradece cualquier ayuda.
Si solo necesita capacidad de proceso para una columna a la vez, usaría la plataforma de distribución en casos como este.
Names Default To Here(1);
capability_chart = function({dt, colname, lowlimit, highlimit}, {Default Local},
dist = dt << Distribution(
Continuous Distribution(
Column(:Flight),
Quantiles(0),
Summary Statistics(0),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(LSL(lowlimit), Target(.), USL(highlimit))
)
);
return(dist);
);
dt = Open("$SAMPLE_DATA/Quality Control/Airport.jmp");
pc = capability_chart(dt, "Flight", 0, 10);
Terminará con un informe un poco diferente debido a los cuadros de esquema, pero estos se pueden "ocultar" si es necesario (o simplemente lleve el cuadro de esquema que le interesa a su informe)

Aquí hay una lista de trucos para hacer que una expresión JSL funcione:
Manejo de expresiones en JMP: Tipps y Trapdoors
Consejos:
- la mayoría de las plataformas aceptan el nombre de la columna (= cadena, "Vuelo" ) además del nombre de la columna (=referencia, :Vuelo ):)
Entonces, el único truco que necesitamos: reemplazar la variable por el nombre de la columna (cadena).
El problema: en la mayoría de los casos, Jmp no evalúa un argumento antes de llamar a la función. Entonces, si coloca Eval() alrededor del argumento de la función, no ayudará a evaluarlo.
-> Envuelva todo en un Eval(Eval Expr(()) y reemplace sus Eval() s con Expr() s
... para decirle a Jmp que los evalúe primero.
capability_chart = function({variable, low, up},
Eval Expr(Process Capability(
Process Variables( Expr(variable), // select column for data
Spec Limits( Expr(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
))
));
capability_chart("Flight", 0, 10)
pero los límites de especificación ("Vuelo" (LSL (bajo), Objetivo (.), USL (arriba))) no funcionan, se convierten a
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
Entonces, probemos el truco con Name Expr(Como columna(nombre de columna)):
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
... y nuevamente obtenemos:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )¡Guau! ... y arg!
Entonces, usemos el Plan B: que siempre funciona: use Eval(Substitute())
La idea original: en combinación con Name Expr(As column(column_name)) como expresión de reemplazo
... pero casi sorprendentemente, incluso funciona con la cuerda desnuda (!):
capability_chart = function({variable, low, up},
Eval(Substitute(Expr(Process Capability(
Process Variables( _var_ ), // select column for data
Spec Limits( _var_(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
)),Expr(_var_), variable
)));
capability_chart("Flight", 0, 10)