
Questa dimostrazione illustrerà alcuni dei modi in cui è possibile utilizzare le matrici. Nel diario del corso, nella sezione "Dati sui tempi di polimerizzazione", cliccherò su "Dati sui tempi di polimerizzazione". Supponiamo di dover trovare il tempo medio di polimerizzazione per ogni data. Sommaremo tutti i valori dei tempi di polimerizzazione in ogni riga e divideremo per il numero di campioni. Userò le matrici per eseguire questo calcolo. Anche in questo caso, le operazioni vettoriali renderanno il calcolo più efficiente. Tornando al diario del corso, ho uno script preimpostato chiamato "Calcola statistiche con matrici". Lo sposto in modo da poter vedere sia la tabella dei tempi di polimerizzazione (la renderemo un po' più ampia e uniforme) sia il nostro script. Lo script inizia creando una variabile chiamata s. s memorizzerà il risultato della funzione J. La funzione J crea una matrice con un numero specificato di righe, un numero specificato di colonne e un valore iniziale. In questo caso, utilizzo la funzione Nrow senza argomenti. Quindi esaminerà solo il numero di righe nella tabella dati corrente. Quindi eseguirò la riga. E potete vedere nel log che ciò che ora è memorizzato in s è questo vettore colonna di zeri. E lo userò per aggiungere sul posto ciascuno dei valori del tempo di cura. Quindi sto usando un ciclo for. Ho inizializzato c equals perché con i dati del tempo di cura, voglio iniziare con la seconda colonna. Verifico che c sia minore o uguale al numero di colonne. E ancora, una buona pratica sarebbe, soprattutto se si lavora con tabelle dati più grandi, eseguire questo conteggio al di fuori dei cicli for, memorizzarlo in una variabile e confrontare c con quella variabile. Successivamente il parser valuta il corpo del ciclo for. E quindi prendiamo... guardiamo prima il lato destro della funzione assign. Quindi invio il messaggio get as matrix to column questa prima volta e poi lo aggiungo sul posto a s. Quindi aggiorniamo c con l'operatore di post-incremento. Quindi questo aggiunge uno sul posto a c. Verifichiamo che c sia ancora minore o uguale al numero di colonne. Ora otteniamo column come matrice e la aggiungiamo a s. Quindi andrò avanti e scriverò le righe. E ricordate che la funzione for restituisce un valore mancante al logaritmo. Ma potete passare il mouse su s per vedere che ora contiene questi numeri piuttosto grandi, la somma di tutte e cinque le colonne del tempo di cura. Infine, invierò un messaggio alla tabella dati corrente, il messaggio new column. E il titolo della nuova colonna sarà Average. E per i valori (e di nuovo, potrebbero essere valori impostati o valori), eseguirò effettivamente un calcolo. Quindi, di nuovo, posso fornire funzioni all'argomento values senza dover prima creare variabili per memorizzarle. Quindi la funzione qui... ho una funzione di divisione e una funzione di sottrazione. Prendo s, che è la somma delle colonne del tempo di polimerizzazione, e lo divido per c meno. Ed è per c meno perché abbiamo iniziato a contare c a Quindi questo toglie uno dal numero di elementi che abbiamo sommato. E ovviamente, c ha dovuto incrementare oltre il test. Doveva fallire il test. Quindi il valore finale di c-- posso passare il mouse e vedere che è E tuttavia, in realtà abbiamo solo aggiunto elementi. Ecco perché dividiamo per c meno Quindi vado avanti ed eseguo quest'ultima riga. E potete vedere che la colonna Media è stata creata nella tabella dei dati del tempo di polimerizzazione. E indicato nel registro, potete vedere che ho creato un'istanza di un oggetto colonna. E infatti, tutto sulla riga che il risultato potrebbe essere assegnato a una variabile se volessi continuare a lavorare con quella colonna. Ora, per il passaggio successivo della dimostrazione, voglio lavorare con tutti i dati del tempo di polimerizzazione contemporaneamente, eseguendo calcoli. Quindi estrarrò l'intera tabella dati come matrice anziché una colonna alla volta, come ho fatto in questo script pre-scritto. E prima di farlo, voglio eliminare la colonna che ho appena creato. Quindi selezionerò l'intero contenuto di questa finestra dell'Editor di script. E invierò un messaggio alla tabella dati corrente. Elimina colonne. E la colonna che voglio eliminare è quella chiamata Media. E vorrei sottolineare, ancora una volta, che l'uso della tabella dati corrente è molto comodo quando si testano cose o si sta presentando. In uno script di produzione, vogliamo davvero usare riferimenti più espliciti alla nostra tabella. Quindi la tabella dati corrente è utile quando si fa pratica con gli script, solo per testare per vedere come funziona qualcosa. Ma in pratica, uno script che si prevede di distribuire o utilizzare e che si desidera mantenere su più versioni di JMP e in più situazioni in cui lo si utilizza, vorrebbe usare quel riferimento esplicito alla tabella dati anziché la tabella dati corrente. Quindi andrò avanti ed eseguirò questo. E questo ha eliminato la colonna di cui volevo sbarazzarmi. Ho restituito quel messaggio scriptabile al log. Ora lasciami cancellare il contenuto della finestra dell'editor di script. Estrarrò l'intera tabella dati come matrice e la memorizzerò nella variabile m. Quindi a m verrà assegnato il risultato dell'invio di un messaggio alla tabella dati corrente. E quel messaggio è get as matrix. Quindi lo eseguirò. E puoi vedere nel log, o puoi passare il mouse su m, che ora ho questa matrice. E la prima colonna contiene questi numeri davvero enormi. E ovviamente, questo perché quando invio get as matrix a una tabella dati in generale, estrarrà tutte le colonne numeriche. E questo includerà le date. Quindi il giorno qui viene trattato come numerico. Puoi capirlo dall'icona del tipo di modellazione, perché è continuo. Il tipo di dati deve essere numerico. In realtà potresti anche -- se lo ingrandisco -- anche se il giorno sembra contenere caratteri, si tratta solo di formattazione. Quindi è giustificato a destra perché è un numero. Quindi get as matrix ha estratto anche quel valore. E se voglio fare calcoli su Cure Time – e in effetti, i calcoli che voglio fare riguarderanno la ricerca di un valore minimo e massimo – non voglio questi valori elevati per il giorno in quella matrice. Quindi andrò a una nuova riga. E farò attenzione. Voglio mantenere visibile quello che ho già – il codice che ho già inserito nella finestra mentre lo faccio, ma non voglio rieseguirlo tutto. Quindi farò molta attenzione a eseguire una riga alla volta. Per eliminare quella prima colonna, userò la variabile m e la metterò in pedice con uno zero e un uno. E se ricordate, questo pedice significa semplicemente di non selezionare nessuna riga in particolare. In altre parole, datemi tutte le righe nella prima colonna. E le assegnerò la matrice vuota, che è solo un insieme di parentesi quadre senza nulla al loro interno. E ancora, per eseguire solo quella riga, posso evidenziarla e usare uno qualsiasi dei metodi che usiamo per eseguire un intero script. Ma eseguirà solo la parte selezionata o evidenziata. Oppure, sul tastierino numerico di una tastiera desktop standard, posso usare il tasto Invio all'estrema destra. Quindi, ciò che viene restituito al log è solo la matrice vuota. Ma se ora passo il mouse su m o se ho evidenziato m e l'ho eseguito, potete vedere che ora abbiamo solo i valori di Cure Time. Ci siamo sbarazzati di quella prima colonna con quei numeri di data grandi. Vado a una nuova riga e do un'occhiata ad alcune delle altre funzioni di matrice che possiamo usare. Quindi creerò una variabile, a, a cui verrà assegnato il risultato dell'utilizzo della funzione loc, LOC. E troverò le posizioni in questa matrice, m, in cui i valori sono maggiori di. E quando eseguo solo quella riga, stiamo trattando la matrice, m, come se fosse un vettore riga e contando a partire dalla prima posizione e restituendo semplicemente le posizioni, le posizioni dei singoli indici, di tutti gli elementi nella matrice che sono maggiori di. Ora, se volessi i valori effettivi, creerò una variabile chiamata avals. E firmerò il risultato dell'indicizzazione della matrice memorizzata in m con la variabile a. E eseguirò solo quella riga. E questi sono i valori effettivi del tempo di polimerizzazione che superano. E naturalmente, per semplificare questo script, se non avessi bisogno di memorizzare le posizioni di tutti quei valori, avrei potuto semplicemente indicizzare -- lasciatemi copiare questo -- la matrice m con la funzione loc. Non ho bisogno di questo passaggio aggiuntivo di memorizzare le posizioni e poi utilizzarle, a meno che non abbia qualche altro motivo per lavorare con le posizioni che avevo inizialmente memorizzato in a in questo esempio. Quindi la prossima cosa che voglio fare con questa matrice è calcolare alcuni valori trasformati. Questa trasformazione prenderà ogni osservazione del tempo di polimerizzazione meno il minimo nell'intera tabella, divisa per l'intervallo dei valori del tempo di polimerizzazione dal massimo al minimo e moltiplicherà il risultato per . È un po' come prendere la distanza di ogni osservazione dal tempo di polimerizzazione minimo come una proporzione dell'intervallo. Questo illustra un altro vantaggio del lavorare con le matrici. Per trovare un valore minimo in un'intera tabella dati, sia che stessi scrivendo uno script o lavorando in modo interattivo, lavorare con le singole colonne della tabella dati richiederebbe molti passaggi per trovare quel valore minimo o quel valore massimo. Ma lavorando con una matrice, posso farlo in una riga di codice molto breve. Quindi nella finestra del mio editor di script -- ora vado avanti e pulisco il contenuto -- creerò una variabile minCT -- quindi tempo di polimerizzazione minimo, e assegnerò a quella variabile il risultato dell'utilizzo della funzione min con m come argomento. E andrò avanti ed eseguirò quella riga. Quindi il valore minimo è E poi creerò anche una variabile maxCT. E le assegnerò il risultato dell'utilizzo della funzione max con m come argomento. E eseguirò solo quella riga. E questo è E ora posso usare queste variabili nel mio calcolo di questa trasformazione. Creerò una variabile, t, per memorizzare i valori di trasformazione. Lasciatemi andare a una nuova riga. Quindi a t verrà assegnato il risultato di volte e poi aprirò parentesi per il numeratore m meno minCT, chiuderò parentesi il segno di divisione e poi aprirò parentesi per il denominatore, maxCT meno minCT. Quindi posso eseguire solo quella riga e quindi ottengo questi valori di trasformazione. Ogni osservazione meno il minimo come proporzione dell'intervallo di valori del tempo di polimerizzazione. Ora, sono molte cifre decimali. Non abbiamo davvero così tanta precisione. Quindi possiamo effettivamente arrotondare questi valori. E andrò di nuovo a una nuova riga. Sovrascriverò i valori in t assegnando il risultato della funzione di arrotondamento a t. Potresti farlo in una nuova variabile se volessi mantenere l'originale. Ma digiterò t e poi l'operatore di assegnazione, la funzione di arrotondamento. Gli argomenti sono: cosa sto arrotondando? Quindi sto arrotondando i valori memorizzati in t. E poi quante cifre decimali voglio? Voglio zero. Ora, questo troncherà i valori nella matrice. Non è la stessa cosa che formattare una colonna di dati in modo che abbia solo zero cifre decimali, mentre i valori completi sono ancora memorizzati in background. Quindi non sto formattando qui. Sto effettivamente troncando i valori. Procedo ed eseguo questa operazione. E ora ho i valori interi per i valori trasformati. Ora, se volessi reinserire questi valori nella tabella dati del tempo di trattamento, potresti eseguire un ciclo nella matrice e creare nuove colonne. Se volessi semplicemente creare una nuova tabella dati, esiste una funzione molto semplice chiamata as table. E ci sono argomenti opzionali per nominare questa tabella e per nominare le colonne. Per questa dimostrazione, semplificherò le cose usando semplicemente la variabile t come argomento di "as table". E quando lo eseguo, ottengo questa tabella senza titolo con nomi di colonna generici. Ma tutti quei valori provenienti da quella matrice di trasformazione sono stati inseriti in questa tabella. E ancora, potrei specificare il nome e le intestazioni di colonna come parte dell'argomento "as table". Oppure potrei usare lo script per modificarlo in un secondo momento. Abbiamo quindi esaminato un paio di modi diversi per estrarre valori numerici da una tabella dati, per colonna o per l'intera tabella dati, tutte le colonne numeriche, l'intera tabella dati e alcune manipolazioni che possiamo effettuare con le matrici.