Col 現在の行の値を呼び出さない累積合計こんにちは。私は 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 |
以下の数式は、「Week」の現在の行の値が固定されている場合、または「Week」と「My Wish」という 2 つの別々の列がある場合に機能します。
If( Row() != 1,
Lag( Col Cumulative Sum( :Week ), 1 ),
0
)
問題は、前の行の「週」の値は固定されているが、現在の行の値は固定されていないことです。そして、作業する列「週」は 1 つだけです。前回のシミュレーション値に基づいて進行をシミュレーションする式を開発しています。前の行の値に基づいて、現在の行の「週」値をシミュレートしています。
「週」列の行 4 で作業しているとします。関数で現在の「週」値を呼び出さずに、以前のすべての「週」値を累積的に合計したいと考えています。そうしないと、私の場合、不正な参照または循環の問題が発生します。
lag 関数は現在の行の「Week」値を呼び出すため、lag の代わりに添字を使用してみました。うまく行かなかった。
If( Row() != 1,
Col Cumulative Sum( :Week )[Row() - 1],
0
)
私の説明が十分に分かりやすかったと思います。事前にお時間をいただき、専門知識をいただきましてありがとうございます。 JMPプロ17を使用しています。
自動化とスクリプト予測モデリングと機械学習Re: 現在の行の値を呼び出さずに列の累積合計を計算する累積合計から現在の週の値を差し引くことができます
Col Cumulative Sum(:Week) - :Week

Re: 現在の行の値を呼び出さずに列の累積合計を計算するこんにちは。フォーラムや講義ビデオを見て、JSL スクリプトの書き方についてたくさん学んできました。次のスクリプトに関して追加の質問があります。2 行目でも同じ結果になりました。2 行目ではなく 1 行目を選択した理由を教えていただけますか?
Eval( Eval Expr( casesMatrix = Expr( :cases[i - 1] ) ) )
Eval( casesMatrix = :cases[i - 1] )
さらに、列「R」を変更せずに元の値を維持する方法はありますか? 変更された R 値を列「Cases」内に残し、どこにも表示しないようにします。以下のように、変更された R に別の変数名「Rx」を割り当ててみました。ただし、この方法では、「Rx」という名前の空の列を作成する必要があります。
:Rx [i] = :R[i] * (1 - (Sum( casesMatrix )+casesSum) * 4 / 100);
あなたの時間と専門知識に事前に感謝いたします。
Re: 現在の行の値を呼び出さずに列の累積合計を計算する「Sim Cases」はデータ テーブル内のマトリックスですか、それとも列ですか?
理解できません
ソリューションを過度に複雑にしているようです。
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 の理解」ドキュメントを読むことをお勧めします。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するこれが私の解決策ですが、あなたの解決策とは一致しません。示されている計算は行 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)) );

Re: 現在の行の値を呼び出さずに列の累積合計を計算する2 行目は素晴らしいとおっしゃいました。私が使用した構文を使用する理由は、単に古い習慣です。
空の列を作成せずに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);
);
Re: 現在の行の値を呼び出さずに列の累積合計を計算する私の理解が正しければ、これが解決策かもしれないと思う
If( Row() != 1,
Sum( :Week[Index( 1, Row() - 1 )] ),
0
)
Re: 現在の行の値を呼び出さずに列の累積合計を計算するさまざまな問題を回避するために別々の列を使用しますが、例には完全なデータが含まれているため、何を達成しようとしているのか正確にはわかりません。Col Cumulative Sum が機能しない場合は、次のような方法があります (Lag と変数を使用して値を計算します)
If(Row() == 1,
val = 0,
val = val + Lag(:Week);
);
val;
Re: 現在の行の値を呼び出さずに列の累積合計を計算するインデックスサブスクリプトの使用に関するご提案ありがとうございます。現在、「オブジェクトがサブスクリプト化できない」という問題が発生しています。
私のweek の例は過度に単純化されていたため、 weekの代わりに 4 行 1 列の行列Sim Casesを使用しました。これを 1 つの要約された数値に変換するために、行列に [1 1 1 1] を掛けて、添え字 [ 1 ] を追加しました。その後にIndex添え字が続きました。
Sum( ([1 1 1 1] * :Sim Cases)[1][Index( 1, Row() - 1 )] )
元の 4x1 行列から得られる数値は、[ 1 ] の後の添え字を受け入れないのではないかと思います。あるいは、これも不正な参照 (再帰) が原因である可能性があります。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するはい、最初は、列を分離して Excel スプレッドシートで通常行っていることを JMP データ テーブルでエミュレートしようとしました。次に、別の列の前の行の値を呼び出します。JMP データ テーブルは Excel スプレッドシートのように動作せず、周期的な問題が発生しています。
そのため、私は戦略を変え続けており、現在の私の理解では、循環的な問題を回避するために、必要なすべての変数を 1 つの列に保持することになります。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するこんにちは。フラストレーションが解消されることを願って、質問を言い換えます。
| 行 | R | 事例 |
| 1 | . | [1、1、2、1] |
| 2 | 1.4 | |
| 3 | 1.67 | |
| 4 | 2.3 | |
RとCases の2 つの列があります。Casesは、現在の行のRと前の行のCasesを掛けて計算されます。さらに、 R は前の行のCasesの合計に基づいて変更 (削減) する必要があります。
列CasesのR (行 2) = R (行 2) * 修飾子
修飾子 = 1 - ( (行1から現在の行の前の行までの症例の累積合計* 4 ) /総人口)
総人口はパラメータであり、100 です。
結果として得られる修飾語 行 1 のケースと乗算されて、行 2 にケースが作成されます。
たとえば、私は修正されたR (行2)を期待しています 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 (行3)は0.71、ケース(行3)は[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 、 Col 累積合計、 Summationなどを試しましたが、何も機能しませんでした。主に次のいずれかが表示されます。
1) 違法な参照または
2) 添え字なし
貴重なお時間と専門知識に改めて感謝申し上げます。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するありがとうございます。 forループがここで鍵となるようです。 Eval 、 Eval Expr 、およびExpr関数はまだ学習していません。
そしておっしゃる通り、私の例の計算は間違っていました。
Re: 現在の行の値を呼び出さずに列の累積合計を計算する数式で (:Week) を使用した瞬間に、不正な参照の問題が発生します。現在の行 (:Week) はまだ完全に計算されていません。理論的には、前の行から (:Week) を呼び出すことしかできません。
Re: 現在の行の値を呼び出さずに列の累積合計を計算する私は JMP を学習し続けます。今のところは、Excel スプレッドシートだけを使い続けます。皆さんの回答に感謝します。
Sim Casesは列であり、新しい行を作成する際に前の行のSim Casesを使用しています。つまり、これは列であると同時に、同じ列内の変数でもあると思います。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するJMP テーブルとスプレッドシートの動作はまったく異なります。この古い投稿「JMP はスプレッドシートではありません」は、いくつかの例と説明を提供しているので、一読すると良いでしょう。ほとんどのことは JMP で実行できますが、JMP の列と行の動作と Excel の単一セルの動作の違いを理解するには、多少時間がかかる場合があります。
Re: 現在の行の値を呼び出さずに列の累積合計を計算するこのスクリプトは、txnelsonのソリューションを出発点として、いくつかの変更を加えています。このスクリプトの目的は、他の手法(Forループの代わりにFor Each Rowを使用する、: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);
);