Col Cumulative Sum 不呼叫目前行的值您好,我對編寫 JMP 腳本還很陌生,主要在工作中使用「編輯公式」。我一直在瀏覽與Col Cumulative Sum相關的解決方案,但找不到適合我的特定問題的解決方案。我的資料表的簡化版本如下。
| 排 | 星期 | Col Cumulative Sum | 我的希望 |
| 1 | 1 | 1 | 0 |
| 2 | 2 | 3 | 1 |
| 3 | 3 | 6 | 3 |
| 4 | 4 | 10 | 6 |
| 5 | 5 | 15 | 10 |
| 6 | 6 | 21 | 15 |
如果“週”的當前行值是固定的或如果我有兩個單獨的列“週”和“我的願望”,則下面的公式有效。
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
問題是前一行的「Week」值是固定的,但目前行的值不是固定的。我只有一欄「週」可以使用。我正在開發一個公式,根據先前的模擬值來模擬進展。我正在根據前一行的值模擬當前行的“週”值。
假設我正在處理「週」列中的第 4 行。我想累積所有先前的“週”值的總和,而不調用函數中當前的“週”值。否則,在我的例子中,它會產生非法引用或循環問題。
我嘗試使用下標而不是滯後,因為滯後函數呼叫當前行的“週”值。它不起作用。
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
我希望我的解釋夠清楚。提前感謝您的寶貴時間和專業知識。我使用 JMP Pro 17。
自動化和腳本編寫預測建模和機器學習回覆:Col 累積和而不呼叫目前行的值您可以從累計總和中扣除當前週值
Col Cumulative Sum(:Week) - :Week

回覆:Col 累積和而不呼叫目前行的值您好,我透過論壇和觀看講座影片學習了很多有關編寫 JSL 腳本的知識。我有一個關於以下腳本的後續問題。我用第二行得到了相同的結果。我可以知道為什麼你會選擇第一行而不是第二行嗎?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
另外,有沒有辦法避免修改“R”列並保留原始值?我希望修改後的 R 值保留在「案例」列內,而不出現在任何地方。我嘗試為修改後的 R 分配一個不同的變數名稱“Rx”,如下所示。但是,這種方法需要我建立一個名為「Rx」的空列才能運作。
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
非常感謝您的時間和專業知識。
回覆:Col 累積和而不呼叫目前行的值「模擬案例」是資料表中的矩陣還是列?
我不明白
您的解決方案似乎過於複雜。
sim cases = [3,5,2,8];
sum1 = sum(sim cases);
sum2 = sum(([1 1 1 1]*sim cases)[1]);
show(sum1,sum2);
sum1 和 sum2 都提供相同的值
sum1 = 18;
sum2 = 18;
我鼓勵您閱讀幫助下拉式選單下提供的發現 JMP 文件。
回覆:Col 累積和而不呼叫目前行的值這是我的解決方案,但是它與您的解決方案不符。我相信您顯示的第 3 行計算結果不正確。
Names Default To Here( 1 );
dt = New Table( "Example",
Add Rows( 4 ),
New Column( "R",
Numeric,
"Continuous",
Set Values( [., 1.4, 1.67, 2.3] )
),
New Column( "Cases",
Expression,
"None",
Set Values( {[1, 1, 2, 1], Empty(), Empty(), Empty()} )
)
);
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) );
:R[i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * :R[i];
casesSum = casesSum + sum(casesMatrix);
);
// Row 3 R does not seem to be correct
// I can not come up with .71, I come up with .96192
show(1.4 * (1 - (5 * 4/100)) );
show(1.67 * (1 - (10.6 * 4/100)) );

回覆:Col 累積和而不呼叫目前行的值你建議的第二行很棒。我使用我所使用的語法的原因只是一個老習慣。
在不建立空列的情況下使用 Rx 的方法是將其用作記憶體變數引用。這是執行此操作的程式碼
// The calculation script
casesSum = 0;
For(i=2,i<=nrows(dt),i++,
Eval( casesMatrix = Expr( :cases[i - 1] ) );
Rx = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
:Cases[i] = casesMatrix * Rx;
casesSum = casesSum + sum(casesMatrix);
);
回覆:Col 累積和而不呼叫目前行的值當我在公式中使用 (:Week) 時,我遇到了非法引用問題。當前行(:週)尚未完全計算。理論上我只能回想起上一行的(:週)。
回覆:Col 累積和而不呼叫目前行的值如果我理解正確,我認為這可能是解決方案
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
回覆:Col 累積和而不呼叫目前行的值我會使用單獨的列來避免各種問題,但我不確定您想要實現什麼,因為您的範例中有完整的資料。如果 Col Cumulative Sum 不適合您,也許是這樣的(使用滯後和變數計算值)
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
回覆:Col 累積和而不呼叫目前行的值感謝您對使用索引下標的建議。我現在遇到“對像不可訂閱”的問題。
我的week範例過於簡化,我有一個 4 行 1 列的矩陣Sim Cases來代替week 。為了將其轉換為一個總數值,我將矩陣乘以 [1 1 1 1] 並添加下標 [ 1 ]。然後是索引下標。
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
我認為原始 4x1 矩陣的結果數值不接受 [ 1 ] 之後的任何下標。或者可能是因為再次非法引用(遞迴)。
回覆:Col 累積和而不呼叫目前行的值是的,一開始,我嘗試在 JMP 資料表中透過分隔列來模擬我通常在 Excel 電子表格中所做的操作。然後我會呼叫不同列的前一行的值。 JMP 資料表的行為與 Excel 電子表格不同,我遇到了週期性問題。
因此,我不斷改變策略,我目前的理解是將每個必要的變數保留在一列中,以避免週期性問題。
回覆:Col 累積和而不呼叫目前行的值再一次問好。我正在重新表達我的問題,希望能夠消除挫折感。
| 排 | R | 案例 |
| 1 | . | [1,1,2,1] |
| 2 | 1.4 | |
| 3 | 1.67 | |
| 4 | 2.3 | |
我有 2 列, R和Cases 。透過將目前行中的R與前一行中的Cases相乘來計算Cases 。此外, R需要根據前一行的Cases總和進行修改(減少)。
列Cases中的R (row2) = R (row2) * 修飾符
修飾符= 1 - ( (從第1行到目前行之前的行的案例累計和* 4 ) /總人口)
Total Population 是一個參數,為 100。
得到的修改器 與 row1 中的Cases相乘以建立 row2 中的Cases 。
例如,我期待修改後的R (row2) 為 1.12,案例(第 2 行)為 [1.12, 1.12, 2.24, 1.12]
1.4 * 1 - ( 5 * 4 / 100 ) = 1.12
1.12 * [1, 1, 2, 1] = [1.12, 1.12, 2.24, 1.12]
然後,我期望修改後的R (row3) 為 0.71, Cases (row3) 為 [0.8, 0.8, 1.6, 0.8]
1.67 * 1 - ( 10.6 * 4 / 100 ) = 0.71
10.6來自第 1 行中的5 個案例和第 2 行中的5.6 個案例。
0.71 * [1.12, 1.12, 2.24, 1.12] = [0.8, 0.8, 1.6, 0.8]
我在獲取綠色值時遇到問題。我目前編寫 JMP 腳本的嘗試如下。
If( Row() == 1,
Matrix( {1, 1, 2, 1} ),
:R * (1 - (Summation( i = 1, N Row() - 1, Sum( :Cases ) ) * 4) / Total Population) * Lag( :Cases, 1 )
)
我嘗試使用Index 、 Lag 、 Row() - 1 、 Colcumulative sum 、 Summation等來取得修飾符,但沒有任何效果。我主要得到
1) 非法引用或
2) 不可取消訂閱
再次感謝您的寶貴時間和專業知識。
回覆:Col 累積和而不呼叫目前行的值非常感謝。 for迴圈似乎是這裡的關鍵。我還沒有學習函數Eval 、 Eval Expr和Expr 。
你是對的,我在例子中的計算是錯誤的。
回覆:Col 累積和而不呼叫目前行的值我會繼續學習JMP。現在,我將只使用 Excel 電子表格。感謝大家的回應。
Sim Cases是一列,我在建立新行時使用前一行的Sim Cases 。所以我猜它既是一列,也是同一列內的變數。
回覆:Col 累積和而不呼叫目前行的值JMP 表格和電子表格的行為方式完全不同,這篇舊文章可能值得一讀, 《JMP 不是電子表格》 ,因為它提供了一些範例和解釋。您可以在 JMP 中執行大部分操作,但可能需要一些時間才能了解 JMP 中的列+行與 Excel 中的單一儲存格的行為方式。
回覆:Col Cumulative Sum 不呼叫目前行的值該腳本以 txnelson 的解決方案為起點並對其進行了一些修改。該腳本的目的只是為您提供使用其他技術進行學習的其他範例(對於每一行而不是 For 循環,從 :R 獲取矩陣值以及一些其他更改)
Names Default To Here(1);
dt = New Table("Example",
Add Rows(4),
New Column("R", Numeric, "Continuous", Set Values([., 1.4, 1.67, 2.3])),
New Column("Cases", Expression, "None", Set Values({[1, 1, 2, 1], Empty(), Empty(), Empty()}))
);
r_m = :R << Get values;
casesSum = 0;
For Each Row(dt,
If(Row() == 1, Continue()); // skip first row
casesMatrix = Lag(:cases, 1);
r_m[Row()] = r_m[Row()] * (1 - (Sum(casesMatrix) + casesSum) * 4 / 100);
:Cases = casesMatrix * r_m[Row()];
casesSum = casesSum + Sum(casesMatrix);
);