線路差異假設我有兩條線,分別是兩個不同移動物體的距離與時間。對象 1 和對象 2 的時間測量是在任意時間進行的,即對象 1 的測量時間與對象 2 的測量時間不同。
圖形產生器中有沒有辦法繪製這些曲線與時間之間的「差異」?
進階統計建模大規模客製化品質和工藝工程回覆:線路差異作為不同建議的組合,您還可以使用簡單的 interpolate() - interpolate() 來計算差異,然後使用平滑圖的 lambda 設定來調整曲線的粒度。

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 ) )
);
回覆:線路差異由於一些奇怪的許可問題*我今天才終於能夠嘗試這個。 它工作得很好,非常優雅!
兩個問題:
- JSL 是否強大到足以為我改變這個公式? 那麼整個過程可以寫成 .jsl 腳本嗎?
- 當我更改平滑器上的 lambda 時,我預計差異曲線會更新,但事實並非如此。 更深入地觀察,我發現「保存公式」實際上是保存樣條線參數,而不是保持與所使用的實際樣條線的連接。 我認為後者不太可能?
再次感謝!
******************************************
* 我最終被迫將 Mac 更新到 11.6,卻沒有意識到 JMP v14 無法在其上運行。 因此,我透過我的公司請求了 v16,在獲得 PO 後實際上花了幾個月的時間才為我真正獲得 v16 許可證。 在稅務證明、地址變更和採購訂單問題等方面進行了大量的來回討論。 我無法判斷問題出在我公司的供應鏈還是 JMP/SAS 的銷售部門,但如果你手頭上有錢,獲得許可證確實應該不那麼難。
回覆:線路差異這是一個低腳本替代方案,使用保存公式紅色小三角選單中的指令可用於平滑器或擬合線元素。

從 Craige 的 ab.jmp 表開始,使用 Overlay 取得兩條線/曲線,使用 Save Formula 取得一個新列,其中的公式如下所示:
If( :源表 == "a", 樣條線 Eval( ... ), :源表 == "b", 樣條線 Eval( ... ), . ))
進入新列的公式編輯器並更改公式以減去兩個樣條表達式:
樣條線評估( ... ) - 樣條線評估( ... )
並將其用作 GB 中的 Y。

回覆:線路差異是的,退休了,我從回答問題中學到了很多。
@XanGregg對於圖形產生器的建議。
回覆:線路差異哇,令人印象深刻的解決方案! 並且有很好的記錄,謝謝!!
唯一更好的辦法是,如果JMP 自己完成此操作,則無需中間腳本步驟,但除了按住Shift 鍵單擊圖形生成器中的兩條線並要求一條差異線(這在概念上從心智模型來看是混亂的)之外,從它正在做什麼的角度來看),我真的無法想像那會如何運作。
謝謝,克雷格!
(ps.你真的退休了嗎? 提供 JMP 支援是為了好玩嗎?)
回覆:線路差異我認為你想要的是所謂的分段線性插值。 我不確定哪個平台可能會為此生成公式,但您可以執行類似的操作。 如果您使用這個,請自行測試!
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 )} )
)
);像這樣輸入數據

像這樣的插值數據

產生這樣的圖表:
The green curve is blue - red; the ref line is at the first biggest difference.綠色曲線為藍-紅;參考線位於第一個最大差異。
如果這是一場比賽,a用71秒獲勝,b用99秒輸掉。 a 以 43 秒領先(好吧,也許吧。 您不能太確定 b 在原始資料中時間 43 的位置。)
您無法透過原始資料的簡單線性擬合得到這一點:
Original data with linear fit.線性擬合的原始資料。
回覆:線路差異@馬克貝利如果兩條線是線性的,則 2 個性別組的按體重預測的身高擬合模型最終的項估計值為 -2.079223。當簡化為線性迴歸時,這不是兩條線之間的差異嗎?

回覆:線路差異
@馬克貝利寫道:
確切地。 曲線或形狀的複雜性將決定所需模型的複雜性。 您能顯示數據圖的圖片嗎? 也許這些數據有一個理論模型?
我們無法為您提供進一步幫助,因為下一步是建模,但我們必須知道哪個模型才能為您提供幫助。
@馬克貝利, @Craige_Hales -- 是的,點之間的線性擬合就可以了。 我意識到由於線性插值,差異會有些彈性,但這很好,我們只是看粗略的幅度。
回覆:線路差異確切地。 曲線或形狀的複雜性將決定所需模型的複雜性。 您能顯示數據圖的圖片嗎? 也許這些數據有一個理論模型?
我們無法為您提供進一步幫助,因為下一步是建模,但我們必須知道哪個模型才能為您提供幫助。
回覆:線路差異如果您有一對資料表,每個物件一個,其中包含時間和距離列,您可以儲存預測時間之間位置的公式。 一次減去公式就可以得到答案。 我認為馬克的問題是,您是否認為擬合模型中的線性/二次/其他模型能夠在測量之間對物體位置提供足夠好的估計值。
回覆:線路差異不,我們只有基本的 JMP v16。
回覆:線路差異與不同時間觀察到的曲線進行比較的唯一方法是對每條曲線進行建模並在選定時間比較模型。 此模型可以像線性內插法一樣簡單,也可以像 JMP 中的任何模型類型一樣複雜。 您有 JMP Pro 嗎? 如果是這樣,您可以將資料視為“函數”並使用函數資料瀏覽器。
在我從您那裡得知一般方法有意義之前,我不會詳細介紹。