crea una formula per generare colonne della matrice di progettazione<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Sono un principiante nell'uso di JMP e non riesco a trovare risposte simili alle mie domande nella community di JMP. Supponiamo di avere una tabella dati con diverse colonne e che l'utente debba selezionare la colonna dalla tabella dati e quindi verrà generata una matrice di progettazione in base alla colonna selezionata. La colonna selezionata e la matrice di progettazione verranno create in una nuova tabella dati. Ma questo non è abbastanza. Se l'utente desidera modificare il valore nella colonna selezionata nella nuova tabella dati, la matrice di progettazione verrà aggiornata di conseguenza. Il mio problema è che non riesco ad aggiornare correttamente la matrice di progettazione con il codice seguente:
// crea una finestra per selezionare la colonna
// omette del codice per creare la finestra
CheckAndConvert = Espr(
selectedColumns = c << Ottieni elementi;
// Se gli input sono validi, continuiamo
Se (N elementi (colonne selezionate) > 0,
vinci << Chiudi finestra;
A = Colonna(colonneselezionate);
s = A << RicavaComeMatrice; // estrae la colonna select in s
// crea la nuova tabella dati "Design Matrix"
dt = Nuova tabella("Matrice disegno");
dt << Nuova colonna("fetta", Numerico, Valori(s[0, 1])); // copia s nella colonna "slice" nella nuova tabella dati
// crea le colonne corrispondenti della matrice di progettazione e le aggiunge nella nuova tabella di dati
For( i=1, i<=Col Max(dt:slice), i++,
dt << Nuova colonna("X"||Char(i), Numerico,
Dopo l'ultimo,
Formula(
If(dt:slice == i, 1,
0
)
)
);
);
);
);
PS: posso ottenere la risposta corretta quando eseguo il codice senza modificare il valore nella colonna della fetta, ma non posso aggiornare le colonne X se cambio il valore della fetta. Si noti che il numero di colonne X è il valore massimo nella colonna slice, che non è fissato con valori diversi. Nelle seguenti immagini, mostro gli esempi per selezionare la colonna 1 e la colonna 2 nei dati del test.
Grazie in anticipo,
Pulong
Oggetto: creare una formula per generare colonne della matrice di progettazioneLe mie scuse. Ho letto di nuovo la tua richiesta e ho capito che nessuna delle funzioni JSL sarà d'aiuto in questo caso. Hanno lo scopo di creare le colonne per gli effetti dei fattori categoriali per la regressione lineare.
Ecco uno script che prenderà la matrice con i livelli dei fattori e creerà la matrice con una colonna per ogni termine in un polinomio quadratico:
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
Non è così difficile creare le tue funzioni.
Oggetto: creare una formula per generare colonne della matrice di progettazioneConsulta Aiuto > Indice di scripting. Cambia il browser per mostrare Funzioni. Quindi selezionare il gruppo di funzioni Matrix. Troverai qui diverse funzioni per creare la matrice del modello (per i termini) dalla matrice del progetto (livelli di fattore).
Oggetto: creare una formula per generare colonne della matrice di progettazione
Penso di avere una domanda simile, se non identica.
Voglio creare una matrice di progettazione da variabili predittive simili a x2fx in Matlab.
Ad esempio: selezionando le variabili predittive e specificando il tipo di progettazione (interazioni di secondo ordine) e quindi generando la tabella di progettazione.
Vedi l'esempio da Matlab di seguito: (ma voglio farlo in JMP).
Esempio 1
Quanto segue converte 2 predittori<FONT face="Courier New" size="3"> X1</FONT> E<FONT face="Courier New" size="3"> X2</FONT> (le colonne di<FONT face="Courier New" size="3"> X</FONT> ) in una matrice di progettazione per un modello quadratico completo con termini<FONT face="Courier New" size="3"> costante</FONT> ,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , E<FONT face="Courier New" size="3"> X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 Oggetto: creare una formula per generare colonne della matrice di progettazioneApprezzo molto per il tuo aiuto.
Oggi ho già trovato una soluzione al mio problema.
Oggetto: creare una formula per generare colonne della matrice di progettazioneOK, molte grazie.
Quindi sembra che il pezzo mancante sia poter modificare le celle di una colonna (numerica) in una finestra di report, nel qual caso puoi usare 'NumberColEditBox()'. Per una colonna di caratteri puoi usare 'StringColEditBox'. Combinando i due puoi presentare qualsiasi tabella in una finestra dell'editor che il tuo codice controlla (anche se immagino che dovresti saltare lo stato delle righe e le colonne delle espressioni):
NamesDefaultToHere ( 1 ) ;
// Usa una colonna numerica
dt = Aprire ( "$SAMPLE_DATA/Classe grande.JMP" ) ;
cNome = "altezza" ;
cVals = Colonna ( dt , cNome ) << getValues ;
// interfaccia utente
nw = Nuova finestra ( "Modifica celle" , ceb = NumberColEditBox ( cNome , cVals ) , ButtonBox ( "Aggiornamento" , updateCells )) ;
// Aggiorna lo script
updateCells =
Espr (
nw << chiudi la finestra ;
newVals = ceb << ottieniComeMatrice ;
dt << Inizio aggiornamento dati ;
Colonna ( dt , cNome ) << setValues ( newVals ) ;
dt << EndDataUpdate ;
) ;
Oggetto: creare una formula per generare colonne della matrice di progettazioneGrazie per la tua risposta. La tua comprensione del flusso di lavoro è esattamente ciò che sto facendo.
Considera "Definisci sezione":
Ho già progettato la finestra per realizzare questo compito.
Per quanto riguarda "Aggiorna sezione":
La difficoltà sta nell'aggiornamento automatico a qualsiasi modifica apportata dall'utente. Posso generare la matrice di progettazione, ma non so come aggiornare automaticamente la matrice di progettazione se l'utente apporta alcune modifiche alla colonna della sezione. Inoltre, se so come aggiornare automaticamente la matrice di progettazione, non sarà un problema generare automaticamente altre colonne basate sulla matrice di progettazione modificando un po' il codice.
Grazie,
Pulong
Oggetto: creare una formula per generare colonne della matrice di progettazioneMolte grazie per la tua spiegazione più dettagliata. Forse posso ripeterlo con parole diverse per essere sicuro di aver capito?
Supponiamo che la prima tabella (contenente tutte le possibili fette) si chiami dt0. Pensando ai tuoi passaggi chiave sopra:
- L'utente seleziona una colonna (una fetta) in dt0 e crea una nuova tabella (chiama questa dt1) contenente solo questa fetta, più le colonne della matrice di progettazione (più le altre colonne derivate che menzioni, ma non precisare) .
- Si desidera che l'utente sia in seguito in grado di modificare la colonna della sezione in dt1 e che le altre colonne in dt1 si aggiornino "automaticamente".
Immagino che il componente aggiuntivo finale abbia due opzioni di menu: "Definisci sezione" e "Aggiorna sezione". Se la mia descrizione di 1. sopra è corretta, questo script "Design Slice" è facilmente ottenibile modificando il codice che ho già suggerito: la tabella dt1 potrebbe essere inserita in una cartella condivisa in modo che altri possano ottenerla e tu puoi aggiungere qualsiasi cosa metadati desiderati per la tabella o le colonne al suo interno.
Lo script "Aggiorna sezione" potrebbe presentare all'utente tutte le tabelle disponibili nella cartella condivisa e consentire loro di selezionarne una. A questo punto, tuttavia, non modificherebbero direttamente la tabella: piuttosto verrebbero presentati con una finestra di report che consente loro di modificare i valori della colonna della sezione nella tabella. Qui, "modifica" potrebbe significare aggiornare i valori esistenti o aggiungere nuove righe. Quando fanno clic su OK in questo rapporto per indicare che sono felici, dt1 potrebbe essere aggiornato automaticamente per riflettere tutte le loro modifiche e potresti anche aggiornare i metadati come richiesto. Ovviamente questo codice di "aggiornamento" sarebbe comune con "Definisci sezione".
A meno che non abbia frainteso, sembra che questo flusso di lavoro sarebbe ragionevole, forse anche meglio che dare agli utenti l'accesso gratuito a dt1 stesso.
Oggetto: creare una formula per generare colonne della matrice di progettazionePoiché questa è la prima volta che utilizzo JMP, proverò a descrivere il mio problema nel linguaggio dello script JMP. In breve, ho una tabella di dati, all'interno della quale esiste una colonna "slice" e voglio generare la matrice di progettazione basata sulla colonna di fetta e generare anche alcune altre colonne basate sulla matrice di progettazione. Quello che devo fare è sviluppare un componente aggiuntivo per JMP che implementi questo compito, in modo che anche altri colleghi possano utilizzare il mio componente aggiuntivo per esperimenti con il computer.
Innanzitutto, vorrei sviluppare una finestra per selezionare la colonna della sezione e generare una tabella di dati che includa la colonna della sezione e la matrice di progettazione e salvare la formula per aggiornare automaticamente la matrice di progettazione se alcuni valori nella colonna della sezione vengono modificati successivamente . (Ho bisogno di salvare la formula, perché il mio project manager lo ha richiesto, ma potrei convincerlo senza usare le colonne della formula se trovo una soluzione migliore.)
Ora posso creare la finestra e generare la tabella dati che include la colonna tagliata e la matrice di progettazione, ma la matrice di progettazione non può essere aggiornata se cambio i valori nella colonna di sezione.
Per quanto riguarda la colonna tagliata:
So che la funzione di progettazione in JMP può generare automaticamente la matrice di progettazione, ma non è utile se desidero colonne formula. Quindi ho scritto la mia funzione per generare la mia matrice di progettazione, come mostrato nel mio script. Supponiamo che io abbia la colonna slice a = [1, 1, 2, 3]'. Quindi la matrice di progettazione verrà generata come
100
100
0 1 0
0 0 1.
La colonna tagliata può essere molto grande e quindi è difficile sapere quante colonne avrà la matrice di progettazione osservando manualmente la colonna tagliata. Inoltre, i valori nella colonna affettata possono essere modificati arbitrariamente.
Penso che i passaggi chiave per creare generare la matrice di progettazione siano i seguenti:
1. selezionare la colonna tagliata, fare clic sul pulsante "OK", quindi verrà generata una nuova tabella, che include la colonna tagliata e la matrice di progettazione. Chiaramente, questo passaggio comporta un intervento manuale.
2. Se modifico manualmente alcuni valori nella colonna della sezione nella nuova tabella, la matrice di progettazione originale verrà eliminata automaticamente e verrà generata la nuova matrice di progettazione corrispondente.
In secondo luogo, ho anche bisogno di generare alcune colonne basate sulla matrice di progettazione e ho anche scritto lo script per generarle, ma non so come salvarle come colonne formula. Questo problema non sarà un problema se so come salvare le colonne della formula per la matrice di progettazione.
Infine, se riuscissi a creare la matrice di progettazione e alcune colonne, le impacchetterei come componente aggiuntivo e le testerei in molte circostanze diverse.
Grazie per il tuo suggerimento. Fammi sapere se mi sono fatto capire.
Pulong
Oggetto: creare una formula per generare colonne della matrice di progettazionePotrei sicuramente sbagliarmi (a seconda di quanto generale hai bisogno che sia la tua soluzione), ma non mi sembra che le colonne formula siano il modo migliore per tentare questo. Il fatto che una colonna nella tabella di origine (generalmente) sia mappata su più colonne e il fatto che il numero di tali colonne sia il numero (variabile) di livelli nella colonna di origine lo rende difficile.
Prima di offrire un altro suggerimento, forse potresti descrivere il flusso di lavoro che prevedi in modo un po' più dettagliato, per favore? Indicare anche quali passaggi comportano un intervento manuale.
Oggetto: creare una formula per generare colonne della matrice di progettazioneGrazie per il tuo gentile aiuto.
Devo generare una matrice di progettazione da una colonna, in modo da poter aggiornare anche la matrice di progettazione se i valori nella colonna vengono modificati. Infatti, voglio creare una formula per generare la matrice di progettazione in base alle colonne selezionate e salvare la formula in modo da poter aggiornare la matrice di progettazione se alcuni valori nelle colonne selezionate vengono modificati.
Nel mio codice viene generata la matrice di progettazione, ma non riesco a ottenere la matrice di progettazione aggiornata se cambio un determinato valore nella colonna selezionata, che è il problema con cui sto lottando. Ho davvero apprezzato se potessi fornire qualche suggerimento sul mio problema.
Grazie,
Pulong
Oggetto: creare una formula per generare colonne della matrice di progettazioneNon ero del tutto sicuro di quello che stavi cercando. Ma dato che sei nuovo in JMP, il codice qui sotto potrebbe darti qualche idea.
NamesDefaultToHere ( 1 ) ;
// Tabella di prova
dt = Nuova tabella ( "Test" ,
Nuova colonna ( "C1" , Numerico , Continuo , Formula ( Intero casuale ( 1 , 5 ))) ,
Nuova colonna ( "C2" , Numerico , Continuo , Formula ( Intero casuale ( 1 , 5 ))) ,
Nuova colonna ( "C3" , Numerico , Continuo , Formula ( Intero casuale ( 1 , 5 ))) ,
AddRows ( 10 )
) ;
// interfaccia utente
Nuova finestra ( "Aggiorna design" ,
PanelBox ( "Scegli una colonna per vedere il design" ,
lub = LineUpBox ( NCol ( 2 ) ,
CLB = ColListBox ( dt , Tutto , Numerico , MaxItems ( 1 ) , Articoli minimi ( 1 ) , clbScript ) )
)
) ;
// Script per aggiornare dinamicamente la line up box lb a seconda della selezione in clb
clbScript =
Espr (
// Ottieni i valori nella colonna selezionata
vals = Colonna ( dt , CLB << getSelected ) << ottieniComeMatrice ;
// Elimina qualsiasi casella matrice esistente
Tentativo ( mb << eliminare ) ;
// Ottieni la matrice di progettazione in una casella matrice
mb = MatrixBox ( Progetto ( vals )) ;
// Accoda la nuova casella della matrice
lub << aggiungere ( mb ) ;
) ;