Unterschied der LinienAngenommen, ich habe zwei Linien, Entfernung vs. Zeit, für zwei verschiedene sich bewegende Objekte.Die Zeitmessungen für Objekt 1 und Objekt 2 erfolgen zu beliebigen Zeitpunkten, d. h. die gemessenen Zeiten für Objekt 1 sind nicht die gleichen wie für Objekt 2.
Gibt es im Graph Builder eine Möglichkeit, die *Differenz* zwischen diesen Kurven im Vergleich zur Zeit darzustellen?
Erweiterte statistische ModellierungMassenanpassungQualitäts- und VerfahrenstechnikBetreff: LinienunterschiedAls Kombination der verschiedenen Vorschläge könnten Sie auch ein einfaches interpolate() - interpolate() verwenden, um die Differenz zu berechnen, und dann die Lambda-Einstellung des glatteren Diagramms verwenden, um die Granularität der Kurve abzustimmen.

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 ) )
);
Betreff: LinienunterschiedAufgrund einiger seltsamer Lizenzprobleme* konnte ich es erst heute endlich ausprobieren. Es funktioniert ganz gut, sehr elegant!
Zwei Fragen:
- Ist JSL leistungsstark genug, um diese Formel für mich zu ändern? Der gesamte Prozess könnte also in ein .jsl-Skript geschrieben werden?
- Ich habe erwartet, dass sich die Differenzkurve aktualisiert, wenn ich das Lambda auf die glattere ändere, aber das passiert nicht. Wenn ich genauer hinschaue, sehe ich, dass die „Speicherformel“ tatsächlich die Spline-Parameter speichert und keine Verbindung zurück zu den tatsächlich verwendeten Splines aufrechterhält. Ich gehe davon aus, dass Letzteres nicht vernünftigerweise möglich ist?
Danke noch einmal!
****************************************
* Ich war schließlich gezwungen, meinen Mac auf 11.6 zu aktualisieren, ohne zu wissen, dass JMP v14 darauf nicht funktionieren würde. Also habe ich über mein Unternehmen Version 16 beantragt, und es dauerte buchstäblich Monate, nachdem ich eine Bestellung erhalten hatte, bis ich tatsächlich eine Version 16-Lizenz für mich bekam. Es gab jede Menge Hin und Her mit Steuerbescheinigungen, Adressänderungen und PO-Problemen. Ich kann nicht sagen, ob das Problem in der Lieferkette meines Unternehmens oder in der Vertriebsabteilung von JMP/SAS lag, aber eine Lizenz zu bekommen, wenn man über Geld verfügt, dürfte eigentlich nicht so schwer sein.
Betreff: LinienunterschiedHier ist eine Low-Scripting-Alternative mit dem Formel speichern Der Befehl ist im Menü des roten Dreiecks für ein Glättungs- oder Anpassungslinienelement verfügbar.

Beginnen Sie mit der ab.jmp-Tabelle von Craige und verwenden Sie „Overlay“, um zwei Linien/Kurven zu erhalten. Verwenden Sie „Formel speichern“, um eine neue Spalte mit einer Formel zu erhalten, die wie folgt aussieht:
If( :Source Table == "a", Spline Eval( ... ), :Source Table == "b", Spline Eval( ... ), . ))
Gehen Sie in den Formeleditor für die neue Spalte und ändern Sie die Formel, um die beiden Spline-Ausdrücke zu subtrahieren:
Spline-Auswertung( ... ) - Spline-Auswertung( ... )
Und verwenden Sie das als Y in GB.

Betreff: LinienunterschiedJa, ich bin im Ruhestand und ich lerne viel, indem ich Fragen beantworte.
@XanGregg für den Vorschlag zum Diagrammersteller.
Betreff: LinienunterschiedWow, beeindruckende Lösung! Und sehr gut dokumentiert, danke!!
Das Einzige, was besser wäre, wäre, wenn JMP dies einfach alleine tun würde, ohne den Zwischenschritt der Skripterstellung, aber abgesehen davon, dass man im Graph Builder bei gedrückter Umschalttaste auf zwei Linien klickt und nach einer Differenzlinie fragt (was aus Sicht eines mentalen Modells konzeptionell chaotisch ist). Ich kann mir nicht wirklich vorstellen, wie das funktionieren würde.
Danke, Craige!
(Ps. Bist du wirklich im Ruhestand? Machen Sie JMP-Unterstützung zum Spaß?)
Betreff: LinienunterschiedIch denke, was Sie wollen, nennt man eine stückweise lineare Interpolation. Ich bin mir nicht sicher, welche Plattform eine Formel dafür liefern könnte, aber Sie können so etwas Ähnliches tun. Führen Sie Ihre eigenen Tests durch, wenn Sie dies verwenden!
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 )} )
)
);Geben Sie Daten wie folgt ein

Und die interpolierten Daten so

Erstellen Sie ein Diagramm wie dieses:
The green curve is blue - red; the ref line is at the first biggest difference.The green curve is blue - red; the ref line is at the first biggest difference.Die grüne Kurve ist blau-rot; Die Ref-Linie liegt am ersten größten Unterschied.
Wenn es sich um ein Rennen handelte, gewann a in 71 Sekunden und b verlor in 99 Sekunden. a war mit 43 Sekunden am weitesten vorne (na ja, vielleicht. Über die Position von b zum Zeitpunkt 43 in den Originaldaten kann man sich nicht ganz sicher sein.)
Das lässt sich nicht mit einer einfachen linearen Anpassung an die Originaldaten erreichen:
Original data with linear fit.Original data with linear fit.Originaldaten mit linearer Anpassung.
Betreff: Linienunterschied@Mark_Bailey Wenn die beiden Linien linear sind, ergibt ein durch Gewicht vorhergesagtes Anpassungsmodell der Größe für die beiden Geschlechtsgruppen am Ende eine Termschätzung von -2,079223. Wäre das nicht der Unterschied zwischen den Linien, wenn man sie zu einer linearen Regression vereinfacht?

Betreff: Linienunterschied
@Mark_Bailey schrieb:
Genau. Die Komplexität der Kurve oder Form bestimmt die Komplexität des erforderlichen Modells. Können Sie ein Bild einer grafischen Darstellung der Daten zeigen? Gibt es vielleicht ein theoretisches Modell für solche Daten?
Wir können Ihnen nicht weiterhelfen, da der nächste Schritt die Modellierung ist, aber wir müssen wissen, um welches Modell es sich handelt, um Ihnen helfen zu können.
@Mark_Bailey , @Craige_Hales - Ja, eine lineare Anpassung zwischen Punkten wäre in Ordnung. Mir ist klar, dass der Unterschied aufgrund der linearen Interpolation etwas schwanken wird, aber das ist in Ordnung, wir betrachten nur grobe Größenordnungen.
Betreff: LinienunterschiedGenau. Die Komplexität der Kurve oder Form bestimmt die Komplexität des erforderlichen Modells. Können Sie ein Bild einer grafischen Darstellung der Daten zeigen? Gibt es vielleicht ein theoretisches Modell für solche Daten?
Wir können Ihnen nicht weiterhelfen, da der nächste Schritt die Modellierung ist, aber wir müssen wissen, um welches Modell es sich handelt, um Ihnen helfen zu können.
Betreff: LinienunterschiedWenn Sie ein Paar Datentabellen hätten, eine pro Objekt, mit Spalten für Zeit und Entfernung, könnten Sie die Formeln speichern, die Positionen zwischen den Zeitpunkten vorhersagen würden. Das Subtrahieren der Formeln auf einmal würde eine Antwort liefern. Ich denke, Marks Frage ist, ob Sie glauben, dass ein lineares/quadratisches/anderes Modell von Fit Model eine ausreichend gute Schätzung einer Objektposition zwischen den Messungen liefern würde.
Betreff: LinienunterschiedNein, wir haben nur die Basisversion von JMP v16.
Betreff: LinienunterschiedDie einzige Möglichkeit, einen Vergleich mit zu verschiedenen Zeitpunkten beobachteten Kurven herzustellen, besteht darin, jede einzelne zu modellieren und die Modelle zu ausgewählten Zeitpunkten zu vergleichen. Das Modell kann so einfach wie eine lineare Interpolation oder komplex wie jeder andere Modelltyp in JMP sein. Haben Sie JMP Pro? Wenn ja, können Sie die Daten als „Funktionen“ behandeln und den Functional Data Explorer verwenden.
Ich werde erst dann ins Detail gehen, wenn ich von Ihnen höre, dass der generelle Ansatz sinnvoll ist.