Nel un post precedente , Ho menzionato un nuovo componente aggiuntivo JMP che può essere usato per dividere i dati prima di modellizzazione predittiva . Questo post si occupa di come funziona e quindi tocca necessariamente l'argomento di JMP Scripting Language, o JSL in breve.
Questo è un grande argomento, quindi qui voglio solo mostrare l'anatomia di uno script JSL che fa qualcosa di utile. Questo post presuppone che tu abbia scaricato e installato il componente aggiuntivo e hanno familiarità con ciò che fa. (Nota: il download del componente aggiuntivo richiede un accesso SAS gratuito.)
Se selezioni la voce di menu 'Visualizza> Componenti aggiuntivi ...' in JMP 9, dovresti vedere 'Divisione stratificata' elencata nella casella combinata. Scegliendo questo elemento si ottiene un collegamento alla "Cartella principale" del componente aggiuntivo, e selezionando questo link e facendo doppio clic su "stratifiedSplit.jsl" si apre il codice sorgente nell'editor di JMP. Per continuare, assicurati di aver visualizzato i numeri di riga nell'editor ("File> Preferenze", quindi seleziona "Script Editor" come "Gruppo di preferenze").
Il JSL può essere decostruito come segue:
(1) Righe 11-13: Le proporzioni di default in cui i dati devono essere divisi. Nota che un suffisso di "0", "1" o "2" in un nome indica qualcosa che ha a che fare con i dati "Allenamento", "Convalida" o "Test" (rispecchiando i valori generati nella colonna dell'indicatore casuale eseguita da JMP) .
(2) Righe 15-29: Una funzione che viene chiamata se si aggiorna una delle proporzioni predefinite, che verifica che il nuovo valore sia effettivamente compreso tra 0 e 1.
(3) Righe 31-55: L'interfaccia utente: presenta tutte le colonne nella tabella dati corrente e consente di selezionare la colonna di risposta. Puoi anche sostituire le proporzioni di divisione predefinite.

(4) Righe 58-85: Mostra l'aiuto in una nuova finestra se viene premuto il pulsante 'Guida' in (3).
(5) Righe 88-104: Viene eseguito quando viene premuto il pulsante 'OK' in (3) e controlla se le tre proporzioni effettivamente specificate continuano a sommare all'unità. In caso contrario, (3) viene nuovamente visualizzato con le proporzioni di divisione predefinite.
(6) Righe 107-135: Controlla che una colonna di risposta sia stata effettivamente selezionata e si arresta se non lo è. Se è stata selezionata una colonna di risposta, trova il numero di livelli distinti in quella colonna e, se questo è maggiore di 100, dà l'opzione di fermarsi.
(7) Righe 138-182: Utilizzando una mappatura di quali righe della tabella corrente corrispondono a quale livello della colonna di risposta (6) e delle proporzioni di divisione specificate (3), viene creata la nuova colonna di convalida. Quindi utilizza Distribuzione per mostrare come le righe nella tabella sono state divise casualmente.
Per coloro che hanno già familiarità con JSL, il codice qui è irrilevante. Ad un livello più alto, tuttavia, ci sono sempre decisioni progettuali che devono essere prese, e il compromesso è solitamente richiesto quando si tiene a mente che il risultato finale deve essere "abbastanza buono" per l'uso previsto.
In questo caso, ad esempio, è stata fatta una scelta specifica per separare il controllo degli errori in due parti - (2) e (5) sopra - per semplificare la logica dietro l'interfaccia utente. Anche se sei nuovo di JSL, con un po 'di pazienza e l'aiuto della Guida JSL (' Guida> Libri> Guida allo scripting '), dovresti essere in grado di capire i dettagli di come ogni sezione di codice funziona effettivamente. Dopotutto, uno dei modi migliori per iniziare a imparare una nuova lingua è iniziare da qualcosa che funziona. Per ragioni di spazio, guarderemo solo qui (6) e (7).
Come già accennato, una delle parti chiave di questo problema è scoprire i livelli nella colonna di risposta (6). Sebbene ci siano molti modi per farlo, il matrice associativa è il più versatile.
Il frammento di codice mostrato sotto fa un tavolo con cui giocare. La riga 5 ottiene i 20 valori di "Risposta" in un vettore e la linea 6 crea un array associativo e gli invia un messaggio "Ottieni chiavi" per rivelare i valori distinti nell'ordine lessicografico. Un vantaggio dell'array associativo è che funziona con qualsiasi tipo di dati (non solo numeri, come in questo caso), ma si noti che "Get Keys" restituisce sempre un elenco. Quindi, nella riga 7, dobbiamo usare "N Items ()" per scoprire quanti oggetti contiene questo elenco.

Una volta che abbiamo valori per 'yLev' e 'nLevs' da (6), i passaggi in (7) sono i seguenti:
1. Costruire un vettore di valori mancanti, 'vVal' che verrà in seguito utilizzato per popolare la nuova colonna di convalida (riga 141).
2. Ripercorri i diversi livelli contenuti in 'yLev' (righe da 143 a 161).
3. Individuare i numeri di riga in "yVales" (e quindi nella tabella dati) che corrispondono al livello corrente e memorizzarli nella variabile "strato" (riga 145). Si noti qui che la sintassi per fare ciò dipende dal fatto che "yVals" sia un vettore o un elenco (e quindi se la colonna di risposta originale avesse un tipo di dati "Numeric" o "Character").
4. La variabile 'stratumN' contiene il numero di righe che corrispondono al livello corrente (riga 147). Converti le proporzioni di divisione specificate in numeri interi e assicurati che queste somme siano 'stratumN' (righe da 149 a 154).
5. Costruire i vettori 'v0', 'v1' e 'v2' delle lunghezze corrette e contenenti rispettivamente i valori '0', '1' e '2' (righe da 157 a 159). Si noti che per garantire che il passaggio successivo funzioni sempre, dobbiamo considerare la possibilità che una delle proporzioni sia 0.0 e impostare il vettore corrispondente su "[]".
6. Impila questi vettori alla fine (usando 'VConCat ()'), e mischia il risultato in modo che i valori '0', '1' e '2' siano distribuiti casualmente. Assegnare questi valori alle righe corrette in 'vVal' in modo che i valori mancanti siano sostituiti (riga 160).
7. Al termine del ciclo, utilizzare 'vVal' per creare una nuova colonna di convalida o sostituire una colonna di convalida esistente (righe da 163 a 170). Si noti che utilizziamo una proprietà di colonna "Etichetta valore" in modo che i valori interi di "0", "1" e "2" appaiano rispettivamente come "Addestramento", "Convalida" e "Test".
8. Utilizzare "Distribuzione" con una variabile "Per" per mostrare i valori della colonna di convalida per ciascun livello nella risposta.
Sebbene di routine, ci sono forse alcuni aspetti non ovvi al codice:
• Non abbiamo formulato alcuna supposizione non necessaria sul tipo di dati o sul tipo di modellazione della colonna di risposta selezionata (il codice funzionerebbe perfettamente, ad esempio, con una colonna "Numerica", "Continua" con valori che sono " 'ammassati' in livelli).
• I valori mancanti nella colonna di risposta si propagano come valori mancanti alla colonna di convalida che è stata creata, il che è desiderabile. Ma nota che, nel caso di una colonna numerica, il "." valore genererà un avviso JMP benigno quando la piattaforma di distribuzione tenta di elaborare il gruppo "By" con "." valori. Per una colonna di caratteri, la stringa nulla "" viene elaborata come gli altri livelli nel gruppo "Per" senza avviso.
• L'espressione 'ColListBox ()' nella riga 42 non presenta le colonne Stato riga per la selezione anche se esistono nella tabella, cosa che è auspicabile in questo caso.
Se usi JMP e ti piace armeggiare con il codice, ci sono molti modi per saperne di più. Potresti iniziare guardando questo Voce Scambio di file .