Differenza di lineeSupponiamo di avere due linee, distanza rispetto al tempo, per due diversi oggetti in movimento.Le misurazioni del tempo per l'oggetto 1 e l'oggetto 2 sono a tempi arbitrari, ovvero i tempi misurati per l'oggetto 1 non sono gli stessi tempi forniti per l'oggetto 2.
Esiste un modo nel Costruttore di grafici per tracciare la *differenza* tra queste curve e il tempo?
Modellazione statistica avanzataPersonalizzazione di massaIngegneria della qualità e dei processiRe: Differenza di lineeCome combinazione dei diversi suggerimenti, potresti anche utilizzare un semplice interpolate() - interpolate() per calcolare la differenza e quindi utilizzare l'impostazione lambda del grafico più fluido per ottimizzare la granularità della curva.

Open( "$DOWNLOADS/ab.jmp" );
New Column( "diff",
Formula(
rowsA = As Constant( Current Data Table() << get rows where( :Source Table == "a" ) );
rowsB = As Constant( Current Data Table() << get rows where( :Source Table == "b" ) );
xA = As Constant( :time[rowsA] );
xB = As Constant( :time[rowsB] );
posA = As Constant( :position[rowsA] );
posB = As Constant( :position[rowsB] );
If( Min( xA ) <= :time <= Max( xA ) & Min( xB ) <= :time <= Max( xB ),
Interpolate( :time, xA, posA ) - Interpolate( :time, xB, posB ),
.
);
)
);
Graph Builder(
Variables( X( :time ), Y( :diff ), Y( :position ), Overlay( :Source Table ) ),
Elements( Position( 1, 1 ), Points( X, Y, Overlay( 0 ), Legend( 1 ) ), Smoother( X, Y, Overlay( 0 ), Lambda( 0.02 ) ) ),
Elements( Position( 1, 2 ), Points( X, Y ), Smoother( X, Y ) )
);
Re: Differenza di lineeA causa di alcuni bizzarri problemi di licenza* ho finalmente potuto provarlo solo oggi. Funziona abbastanza bene, molto elegante!
Due domande:
- JSL è abbastanza potente da modificare la formula per me? Quindi l'intero processo potrebbe essere inserito in uno script .jsl?
- Mi aspettavo che la curva della differenza si aggiornasse mentre cambiavo la lambda su quella più fluida, ma non è così. Osservando più in profondità vedo che la "formula di salvataggio" sta effettivamente salvando i parametri della spline, non mantenendo una connessione con le spline effettivamente utilizzate. Presumo che quest'ultimo non sia ragionevolmente possibile?
Grazie ancora!
****************************************
* Alla fine sono stato costretto ad aggiornare il mio Mac alla versione 11.6, senza rendermi conto che JMP v14 non avrebbe funzionato. Quindi ho richiesto la v16 tramite la mia azienda e ci sono voluti letteralmente mesi dopo aver ottenuto un PO per ottenere effettivamente una licenza v16 per me. Ci sono stati tonnellate di avanti e indietro con certificati fiscali, cambiamenti di indirizzo e problemi con gli ordini di acquisto. Non so dire se il problema fosse la catena di fornitura della mia azienda o il reparto vendite di JMP/SAS, ma ottenere una licenza se hai soldi in mano non dovrebbe essere così difficile.
Re: Differenza di lineeEcco un'alternativa di scripting bassa utilizzando il file Salva formula comando disponibile nel menu del triangolo rosso per un elemento Più morbido o Linea di adattamento.

Partendo dalla tabella ab.jmp di Craige utilizzando Overlay per ottenere due linee/curve, utilizza Salva formula per ottenere una nuova colonna con una formula simile a:
If( :Source Table == "a", Spline Eval( ... ), :Source Table == "b", Spline Eval( ... ), . ))
Vai nell'editor delle formule per la nuova colonna e modifica la formula per sottrarre le due espressioni Spline:
Valutazione spline(...) - Valutazione spline(...)
E usalo come Y in GB.

Re: Differenza di lineeSì, sono in pensione e imparo molto rispondendo alle domande.
@XanGregg per il suggerimento del generatore di grafici.
Re: Differenza di lineeWow, soluzione impressionante! E molto ben documentato, grazie!!
L'unica cosa migliore sarebbe se JMP lo facesse da solo senza il passaggio intermedio di scripting, ma a parte fare clic con il tasto Maiusc su due righe nel Costruttore di grafici e chiedere una riga di differenza (che è concettualmente disordinato da un modello mentale di punto di vista "cosa sta facendo"), non riesco davvero a immaginare come funzionerebbe.
Grazie, Craig!
(ps. Sei davvero in pensione? Supportate JMP per divertimento?)
Re: Differenza di lineePenso che quello che vuoi si chiami interpolazione lineare a tratti. Non sono sicuro di quale piattaforma potrebbe produrre una formula per questo, ma puoi fare qualcosa di simile in questo modo. Fai i tuoi test se usi questo!
dt = Open( "$desktop/ab.jmp" ); // table with unaligned times for a and b measurements
dt << sort( by( time ), replacetable( 1 ) ); // make sure time is ascending
aRows = dt << getrowswhere( SourceTable == "a" ); // get all the a
bRows = dt << getrowswhere( SourceTable == "b" ); // and b row indexes
aTimes = dt:time[aRows]; // get all the a and b times and positions in
aPositions = dt:position[aRows]; // matrices for the interpolate function
bTimes = dt:time[bRows];
bPositions = dt:position[bRows];
apos = Function( {time}, // tiny wrappers for interpolate
Interpolate( time, aTimes, aPositions )
);
bpos = Function( {time},
Interpolate( time, bTimes, bPositions )
);
dtnew = New Table( "new_ab", // new table is similar to old table
New Column( "Source Table", Character( 1 ), "Nominal" ),
New Column( "time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "position", Numeric, "Continuous", Format( "Best", 12 ) )
);
bigdif = 0; // track the largest difference so it can have a ref line
bigtime = .;
// make a new table covering the range of the data
For( i = min(min(aTimes),min(bTimes))-10, i <= max(max(aTimes),max(bTimes))+10, i += 1,
dtnew << addrows( 1 ); // interpolate a at time i
dtnew:SourceTable = "a";
dtnew:time = i;
dtnew:position = apos( i );
dtnew << addrows( 1 ); // interpolate b at time i
dtnew:SourceTable = "b";
dtnew:time = i;
dtnew:position = bpos( i );
dtnew << addrows( 1 ); // difference at time i
dtnew:SourceTable = "diff";
dtnew:time = i;
dtnew:position = apos( i ) - bpos( i );
If( Abs( dtnew:position ) > bigdif, // capture biggest diff
bigdif = Abs( dtnew:position );
bigtime = i;
);
);
dtnew << Graph Builder(
Size( 518, 448 ),
Show Control Panel( 0 ),
Variables( X( :time ), Y( :position ), Overlay( :Source Table ) ),
Elements( Points( X, Y, Legend( 21 ) ), Smoother( X, Y, Legend( 22 ), Lambda( 0.000001 ) ) ),
SendToReport(
Dispatch( {}, "time", ScaleBox, {Add Ref Line( bigtime, "Solid", "Black", "big=" || Char( bigtime ), 1 )} ),
Dispatch( {}, "Graph Builder", FrameBox, {Marker Size( 2 )} )
)
);Inserisci dati in questo modo

E i dati interpolati come questo

Producendo un grafico come questo:
The green curve is blue - red; the ref line is at the first biggest difference.La curva verde è blu - rossa; la linea di riferimento è la prima differenza più grande.
Se questa fosse una gara, a vincerebbe in 71 secondi e b perderebbe in 99 secondi. a era più avanti a 43 secondi (beh, forse. Non si può essere troppo sicuri della posizione di b al tempo 43 nei dati originali.)
Non puoi ottenerlo da un semplice adattamento lineare sui dati originali:
Original data with linear fit.Dati originali con adattamento lineare.
Re: Differenza di linee@Mark_Bailey Se le due linee sono lineari, un modello di altezza previsto dal peso per i 2 gruppi di sesso finisce per avere una stima del termine pari a -2,079223. Non sarebbe questa la differenza tra le linee se semplificate in una regressione lineare?

Re: Differenza di linee
@Mark_Bailey ha scritto:
Esattamente. La complessità della curva o della forma determinerà la complessità del modello necessario. Puoi mostrare un'immagine di un grafico dei dati? Forse esiste un modello teorico per tali dati?
Non possiamo aiutarti ulteriormente perché il passo successivo è la modellazione, ma dobbiamo sapere quale modello per aiutarti.
@Mark_Bailey , @Craige_Hales -- Sì, un adattamento lineare tra i punti andrebbe bene. Mi rendo conto che la differenza sarà un po' rimbalzante a causa dell'interpolazione lineare, ma va bene, stiamo solo osservando magnitudini approssimative.
Re: Differenza di lineeEsattamente. La complessità della curva o della forma determinerà la complessità del modello necessario. Puoi mostrare un'immagine di un grafico dei dati? Forse esiste un modello teorico per tali dati?
Non possiamo aiutarti ulteriormente perché il passo successivo è la modellazione, ma dobbiamo sapere quale modello per aiutarti.
Re: Differenza di lineeSe avessi una coppia di tabelle di dati, una per oggetto, con colonne per tempo e distanza, potresti salvare le formule per prevedere le posizioni intermedie. Sottraendo le formule alla volta si darebbe una risposta. Penso che la domanda di Mark sia se pensi che un modello lineare/quadratico/altro di Fit Model fornirebbe una stima sufficientemente buona della posizione di un oggetto, tra le misurazioni.
Re: Differenza di lineeNo, abbiamo solo la versione base di JMP v16.
Re: Differenza di lineeL'unico modo per confrontare le curve osservate in momenti diversi è modellarle ciascuna e confrontare i modelli in momenti selezionati. Il modello potrebbe essere semplice come un'interpolazione lineare o complesso come qualsiasi tipo di modello in JMP. Hai JMP Pro? In tal caso, è possibile trattare i dati come "funzioni" e utilizzare Functional Data Explorer.
Non entrerò nei dettagli finché non avrò sentito da te che l'approccio generale ha senso.