リストから列を合計する動的数式列を生成するために必要なJSLコードこんにちは、みんな、
この質問は投稿に関連していますここにこれにより、他の列のリストを合計するための非動的列が適切に生成されます。
私が抱えている問題は、他にN個の列のリストがあり、それが動的な数式である場合に、(JSLを使用して)列を合計する方法です。
データテーブルに列のリスト(ColListなど)があり、ColListのN個の項目を単純に合計する数式を使用して新しい列を生成したいと思います。 私が考えていたのは次のようなものです。
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));ColListは列のリストであるため、これは明らかに機能しません:ColList = {"col1"、 "col2"、...、 "colN"}。 私は文字列を作成し、Eval(Parse())とEval Insert()を次のように使用しようとしました:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));しかし、それでも運はありません。 JSLコードは数式を使用して列を生成しますが、実際の数式ではなくEval(ColList)が数式に表示されるため、行の値は空になります。Sum(:col1、:col2 、: col3、...、:colN)。
列のリスト{""}からコロン付きの列への参照に移動するときに何が間違っているのか理解できません:。
どんな助けでも大歓迎です。
ありがとう!、
DS
分析データ表スクリプティングRe:リストから列を合計する動的数式列を生成するために必要なJSLコードこれを行うにはいくつかの方法があります。 EvalExpr()を使用して目的の式の変数を作成してから、NameExpr()を使用して(評価されていない)式をFormula()引数に転送することをお勧めします。
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
Re:リストから列を合計する動的数式列を生成するために必要なJSLコードこんにちは@MS 、
それは完璧な解決策です、ありがとう! シンプルでエレガントなのが好きです。
リストが{"A"、 "B"、 "C"、...}のように構成されている場合、自分のやり方でコードを変更しても問題が発生するため、コードを少し変更する必要がありました。 ただし、リストが{A、B、C、...}のように構成されている場合は、式が適切に評価されます。 2つのリストはわずかに異なる方法で生成され、引用符は実際にEval()を破棄します。
ありがとう!、
DS
Re:リストから列を合計する動的数式列を生成するために必要なJSLコードこんにちは@MS 、
私はあなたのスクリプティング方法が助けになることを望んでいる関連する質問があります(したがって別の投稿ではありません)。 それはポストと関係がありますここに。 私が今やろうとしているのは、基本的に、プロファイル内のシミュレーターに情報を「フィード」するときに、元の投稿に配置されたものを4x4相関行列から任意のNxN行列に一般化することです。
他の元の投稿から、NxN相関行列を生成できるスクリプトがあり、入力から「予測」列(他のN列の合計)を生成できます。 私が苦労しているのは次のとおりです。Simulator()関数を呼び出すとき、それを渡すために次のものがあります。
Simulator(state = 0 | 1、、)
したがって、他の元の投稿から、因子の正しいリスト( "tpListY")と相関行列( "corr.mat")を渡すソリューション、JSLコードでは、送信する呼び出しをEval Insert()でラップする必要がありました。プロファイラーレポートへのSimulator()を実行し、その周りでEval(Parse())を実行します。
ここでの課題は、Simulator()を呼び出してファクターを定義するときに、そのColListでこれを実行できるように、これを正しく一般化する方法です。
ColListは次のようになります:ColList = {A、B、C、D、...}そして各列A、B、C、...に関連する平均と標準偏差があります。
各因子に正しい平均と標準偏差を挿入するようにシミュレーターを呼び出すための正しい構文は何ですか? 例:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));元のデータテーブルから、相関行列(corr_mat)の生成に使用された列数(N)を使用して2番目のモックアップが作成されます。 そのモックアップテーブルは、列を合計して:Pred列を作成し、プロファイラーに送信するダミー関数として使用されるテーブルです。 変数MmeanとMSDは、N列Aの平均と標準偏差を含むベクトルです。
各列とそれに対応する平均を明示的に記述する必要はなく、これをより自動化して、任意の数の列を処理できるようにしたいと思います。
これについて行くための良い方法は何でしょうか?
また、Eval(corr_mat)が実際にX相関エントリに相関行列の値を入力するのに問題があります。
添付のデータテーブルとスクリプトは、私が何をしようとしているのかを理解するのに役立つはずです。
ありがとう!、
DS
更新、申し訳ありませんが間違ったファイルを追加しました、今正しいデータテーブルを持っています。
Re:リストから列を合計する動的数式列を生成するために必要なJSLコードこれが1つのアプローチです。 最初にFactors()を繰り返し構築し、次に2番目のステップでX Correlations()の評価された引数を含む完全なSimulator()式を作成します。
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
ただし、X相関行列は(ほとんどの場合)無視されているようです。 レポートではゼロのみ。
また、相関関係がプロファイラーに手動で入力され、スクリプトを保存して実行すると、相関関係は失われます。 保存されたスクリプトに保存されている場合でも。 理由はわかりません。
Re:リストから列を合計する動的数式列を生成するために必要なJSLコードこんにちは@MS 、
解決策をありがとうございました。 使用しているデータテーブルでは問題なく機能します。 使用するデータテーブルの多くが他のデータ型を持っているという事実を考慮して、少し変更する必要があったので、数値の連続データのみを考慮する必要があります。 とにかく、それは正しく機能し、多変量平均、標準開発、およびX相関を正しく入力します。 それが問題なら、私はJMP 16EAを使用しています。
ご協力いただきありがとうございます! また、相関行列に関する元のリクエストの別のスレッドに投稿したので、N次元にスケールアップするコードの恩恵を受けることができます。
ありがとう!、
DS