
Me encuentro con un problema en el que quiero ver cómo se verían mis límites de control anteriores en relación con los límites de control fijos actuales o nuevos para un conjunto de gráficos de control. Por lo general, agregaría líneas de referencia a cada gráfico, pero creo que podría haber una mejor manera, usando un mensaje de plataforma olvidado hace mucho tiempo (al menos para mí).
A principios de este año, estuve jugando con la idea de cómo sería agregar una nueva propiedad de columna, en este caso Límites de acción y alerta para los gráficos de monitoreo ambiental, y luego usar esa propiedad de columna como línea de referencia en los gráficos de control. Enlace al blog de EM
Mientras buscaba algo completamente diferente en el índice de secuencias de comandos, encontré una función llamada "Agregar límites". Por lo que puedo decir, esta función existe desde hace mucho tiempo, al menos antes de v14, y se puede usar para enviar límites de control superior e inferior a un gráfico de control. Estos límites se muestran como líneas discontinuas y se enumeran en una tabla junto al gráfico. Me tomaría mucho JSL para que eso suceda, por lo que es muy bueno descubrir una característica de tanta utilidad.
El uso básico de Add Limits se parece a esto:
//Example of adding limits to a control chart
ccb = dt << Control Chart Builder( Variables( Y( :Column 1 ) ), Show Control Panel( 0 ) );
ccb << chart( position( 1 ), Add Limits( {LCL( 20 ), UCL( 30 )} ) );
La última línea de JSL envía un mensaje al gráfico que incluye los valores que se utilizarán como límites de la línea discontinua.
Por supuesto, me gustaría usarlo dinámicamente con cualquier columna, por lo que requiere un poco más de trabajo de pies.
Primero configuremos una tabla para usarla como ejemplo.
dt=New Table( "old and new control limits",Add Rows( 50 ),
New Column( "Column 1",Numeric,"Continuous",Format( "Best", 12 ),
Formula( Round( Random Normal( 25, 3 ), 0 ) )));
column(dt, 1)<< Delete Formula;
Tenga en cuenta que estoy eliminando la fórmula que genera algunos datos aleatorios para trabajar justo después de construir la tabla. Esto corrige los valores en la tabla.
El siguiente paso es agregar un nuevo tipo de propiedad de columna, algo personalizado que no existe de forma nativa en JMP.
Column( dt, 1 ) << set property( "Old Control Limits", {LCL( 20 ), UCL( 30 )} );
Después de ejecutar esta línea, la columna de la tabla de datos ahora tiene una propiedad llamada Límites de control anteriores.
Solo para verificar si el script funcionó, puede ver los valores de la propiedad de la columna al hacer esto.
OCL = Column( dt, 1 ) << Get Property( "Old Control Limits" );Show( OCL[1], OCL[2] );
La nueva variable, OCL, tiene dos valores, LCL(20) y UCL(30)
Puedo usar esos valores en un nuevo gráfico de control.
Las siguientes dos líneas pueden parecer realmente extrañas, pero son súper sólidas y aprovechan la estructura basada en funciones de JSL.
Primero voy a definir un par de argumentos vacíos o casi vacíos y luego los anidaré.
ccbe = Expr(Control Chart Builder( Variables( Y( :Column 1 ) ), Show Control Panel( 0 ) ));
ce = Expr( chart( position( 1 ) ) );
ae = Expr( add limits() );
le = {};
Al configurar estas expresiones, puedo manejar cada parte sin evaluarlas.
ccbe, la expresión del generador de gráficos de control es una función, "Generador de gráficos de control" con dos argumentos, "Variables" y "Mostrar panel de control"
Quiero agregar un nuevo argumento llamado Chart() a la función Control Chart Builder. La nueva variable, ce es una expresión con el argumento "Gráfico" y Gráfico incluye un argumento, "Posición (1)".
Quiero agregar Agregar límites al argumento del gráfico, por lo que tengo la variable ae para hacer referencia a una expresión Agregar límites vacía.
Por último, hice una lista vacía llamada "le", que contendrá los límites que obtuve de "Obtener propiedades" en la variable OCL del paso anterior.
A continuación, voy a juntar las piezas en capas:
Insert Into( le, OCL );show( le );
Insert Into( ae, le );Show( ae );
Insert Into( ce, Name Expr( ae ) );Show( ce );
Insert Into( ccbe, Name Expr( ce ), 2 );
ccbe;
Primero tomo la lista de cosas en OCL y la inserto en el archivo.
En segundo lugar, tomo "le" y lo inserto en "ae", seguido de la inserción de "ae" en "ce". En el segundo caso, envolví "ae" dentro de Name Expr(). Esto me da la expresión evaluada de ae sin evaluarla. Este método NameExpr() es muy útil.
Por último, inserto ce en el ccbe, que es la expresión completa del gráfico de control.
En el JSL anterior, he incluido un "show" después de cada paso para que pueda ver cómo se construye la función en el registro.
El último paso es obtener un gráfico. Simplemente ejecutando ccbe solo, se evalúa la variable que contiene la expresión completa y obtengo un gráfico de control con líneas discontinuas que representan los límites de control anteriores, que provienen de las propiedades de las columnas.
Con un poco más de esfuerzo, estoy bastante seguro de que sería posible comenzar con una tabla que incluya los límites de control actuales y anteriores, que podría usarse para completar todas las propiedades de columna para una tabla completa de variables de proceso.
El guión completo se incluye a continuación.