Al momento dispongo di uno script che crea grafici di capacità di controllo e di processo per una varietà di variabili, lo inserisce in un diario e quindi salva il diario come PDF. Il problema è che il mio script è lungo 5000 righe e funziona più lentamente della melassa in un congelatore. Quindi ho pensato che avrebbe avuto più senso definire una funzione per ogni tipo di grafico che costruisco e unirli insieme in questo modo. Ho creato con successo funzioni per le carte di controllo, ma non riesco a far funzionare la carta delle capacità del processo.
Ecco uno script che utilizza i dati di esempio dell'aeroporto (allegato) per creare un grafico simile a quello che sto cercando di creare:
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 ) )
)},
);Vorrei definire una funzione con il nome della colonna come input. Ecco cosa ho finora:
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)Quando lo eseguo, viene visualizzata una finestra che mi richiede i limiti delle specifiche. Voglio che il mio script compili automaticamente i limiti delle specifiche. Ho anche provato a utilizzare column() e ascolumn() invece di eval() nella riga dei limiti delle specifiche, ma hanno fatto la stessa cosa. Idealmente, non dovrei creare una tabella delle specifiche o aggiungere limiti di specifica come proprietà di una colonna, ma posso farlo se non esiste un altro modo. Inoltre, non voglio scorrere tutte le colonne e creare una serie di grafici delle capacità del processo perché esiste un formato esistente per il report che potrebbe creare confusione se modificato. Qualsiasi aiuto è apprezzato.
Se hai solo bisogno della capacità di processo per una colonna alla volta, utilizzerei la piattaforma di distribuzione in casi come questo
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);
Ti ritroverai con un rapporto leggermente diverso a causa delle caselle di contorno, ma queste possono essere "nascoste" se necessario (o semplicemente prendi la casella di contorno che ti interessa nel tuo rapporto)

Ecco un elenco di trucchi per far funzionare un'espressione JSL:
Gestione delle espressioni in JMP: Tipps e Trapdoors
Suggerimenti:
- la maggior parte delle piattaforme accetta il nome della colonna (= string, "Flight" ) oltre al nome della colonna (=reference, :Flight ):)
quindi l'unico trucco di cui abbiamo bisogno: sostituire la variabile con il nome della colonna (stringa).
Il problema: nella maggior parte dei casi Jmp non valuta un argomento prima di chiamare la funzione. Quindi, se inserisci Eval() attorno all'argomento della funzione, non aiuterà a valutarlo.
-> Racchiudi tutto in un Eval(Eval Expr(()) e sostituisci i tuoi Eval() con Expr() s
... per dire a Jmp di valutarli prima.
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)
ma Spec Limits("Flight"(LSL( low ), Target( . ), USL( up )) ) non funziona, viene convertito in
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
Quindi, proviamo il trucco con Name Expr(As column(column name)):
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
... e ancora, otteniamo:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )Oh! ...e arg!
Quindi, usiamo il Piano B: che funziona sempre: usa Eval(Substitute())
L'idea originale: in combinazione con Name Expr(As column(column_name)) come espressione sostitutiva
... ma quasi sorprendentemente funziona anche con la stringa nuda (!):
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)