シミュレーション用にプロファイラーで相関行列を指定するにはどうすればよいですか?こんにちは、
サンプルデータのセットから、指定された行数、平均/標準偏差ベクトル、相関構造を持つ多変量正規データを作成するスクリプトを作成しています。 プロファイラー プラットフォームのシミュレーターを利用して、次の手順でデータ テーブルを生成したいと考えています。
- 各変数のサンプル平均と標準偏差を計算します。
- サンプルデータから相関行列を生成します。
- (1) と (2) の要約統計量を使用して多変量データをシミュレートします。
現在、私のスクリプトは各変数の適切な平均値と標準偏差を使用してシミュレートされたデータ テーブルを生成していますが、変数間の相関構造を正しく維持することができません。 私の問題の原因は、[ NxN相関]とX相関相関行列を明示的に指定する代わりに変数を使用しました (例: [1 0.3 0, 0.3 1 0, 0 0 1])。しかし、私のトラブルシューティングスキルでは解決策がありません。 現在のスクリプトと予想される出力と実際の出力を以下に示します。これらの手順を達成する方法に関する提案は歓迎されます。
JSL:
names default to here(1);
Try( Close( Data Table(dt) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
ncol = NCol(dt);
//Dialog Window.
Dlg = New Window("New Window",
<< Modal,
BorderBox(left(3), top(2),
V List Box(
TextBox("Simulate multivariate data"),
HListBox(
VListBox(
PanelBox("Select variables",
colListData = ColListBox(all,nLines,(min(ncol,10)))
),
),
PanelBox("Cast Selected Variables",
LineupBox(NCol(2), Spacing(3),
ButtonBox("Variables", colListY << Append(colListData << Get Selected)),
colListY = ColListBox(nLines(6), "numeric"))
),
//specifications - not in use.
PanelBox("Enter Specifications",
Spacer Box(Size(10, 1)),
HListBox(
VListBox(
Spacer Box(Size(5, 10)),
lsl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl4 = Number Edit Box(, 3)
),
SpacerBox(Size(10,10)),
VListBox(
Spacer Box(Size(5, 10)),
usl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl4 = Number Edit Box(, 3)
)
),
),
PanelBox("Action",
LineupBox(NCol(1),
// OK button
Button Box("OK",
lsl_mat = J(4,1, .);
lsl_mat[1] = Eval(lsl1 << Get);
lsl_mat[2] = Eval(lsl2 << Get);
lsl_mat[3] = Eval(lsl3 << Get);
lsl_mat[4] = Eval(lsl4 << Get);
usl_mat = J(4,1, .);
usl_mat[1] = Eval(usl1 << Get);
usl_mat[2] = Eval(usl2 << Get);
usl_mat[3] = Eval(usl3 << Get);
usl_mat[4] = Eval(usl4 << Get);
// Store summary statistics
tpListY = colListY << Get Items;
tpMean = J(4, 1, 0);
tpSD = J(4, 1, 0);
for (i=1, i <= nitems(tpListY), i++,
one_col = tpListY[i];
Meani = Col Mean(Column(dt, one_col));
SDi = Col Std Dev(Column(dt, one_col));
tpMean[i] = Meani;
tpSD[i] = SDi;
);
Dlg << CloseWindow
),
// Cancel button
Button Box("Cancel", Dlg << CloseWindow),
Spacer Box(Size(10,10)),
// Remove button
Button Box("Remove", collistY << RemoveSelected)
)
),
)
)
)
);
//correlation matrix
corr = multivariate(
Y(Eval List(tpListY)),
estimation method("Row-wise"),
matrix format("Square"),
scatterplot matrix(0)
);
corr.run = corr << run;
corr.rep = corr.run << report;
corr.mat = corr.rep["Correlations"][matrix box(1)] << get(1);
//only used to launch profiler
prof.x = J(2,4 ,1);
prof.tbl = as table(prof.x, << column names(tpListY), << invisible);
prof.tbl << new column("Y",
Formula( :TP1 + :TP2 + :TP3 + :TP4)
);
prof.tbl = current data table();
random reset(1234);
//specify multivariate data from summary statistics
sim.design = Profiler(
Y(:Y),
Invisible
);
sim.design << Simulator(
1,
Factors(
TP1 << multivariate( tpMean[1], tpSD[1]),
TP2 << multivariate( tpMean[2], tpSD[2]),
TP3 << multivariate( tpMean[3], tpSD[3]),
TP4 << multivariate( tpMean[4], tpSD[4]),
),
X Correlations(
1,
tpListY,
corr.mat
),
N Runs(10000)
);
//Make data table
report( sim.design )["Simulate to Table"][button box( 1 )] << click( 1 );
sim.dt = data table( 1 );
sim.dt << set name( "Simulated multivariate data" );
sim.dt << delete columns({"Y","Obj"});予想される出力と実際の出力:
expectedvsactualexpectedvsactual期待されたものと実際のもの
自動化とスクリプト作成データの探索と視覚化Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
非常に素晴らしい! 確かに、短くてエレガントなコードが好きです (ただし、私はそれほど得意ではありません)。 好奇心からですが、平均値、標準偏差、および相関行列を使用した結果が、平均値と共分散行列のみを使用した場合と (ほぼ) 同じシミュレーション データを与えるかどうかを確認しましたか?
残念ながら、この別のアプローチはうまくいきませんでしたが、作業中の他のデータに移植できる優れたソリューションが見つかったことを嬉しく思います。 実際のデータに基づいて構築されたモデルと比較するために、シミュレートされたデータでいくつかのモデリングをテストしています。 実際のデータセットが比較的小さく、シミュレートされたデータにより、少なくとも早期にデプロイして、より多くのデータが入ってきたときに更新できるそれほどひどくないモデルを構築する機会が得られる場合、これが非常に役立つことがわかります。 。 つまり、十分な大きさのデータセットが生成されるまで何ヶ月も待つ必要はありません。 たとえ「完璧」ではなくても、モデルを導入することに価値がある場合があります。
議論と学びのポイントをありがとう!
幸運を!、
DS
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@SDF1 、
こんなアプローチは思いつきませんでした、見事に成功しました。 ダイアログ ウィンドウに関しては、おっしゃる通りだと思いますが、よく見てみる必要があります。 Profiler プラットフォームをすべて回避することで頭痛の種は少なくなりましたが、それは良いアイデアだったのですが、私にとってはうまくいきませんでした。 これは同じ結果ですが、手間が少なく (R で実装する手順と同様)、入力として必要なのは平均ベクトルと共分散行列のみです。
//tpListY is variables.<BR /><BR />cov = multivariate(
Y(eval list(tpListY)),
estimation method("Row-wise"),
matrix format("Lower Triangular"),
scatterplot matrix(1)
);
cov << covariance matrix(1);
cov.run = cov << run;
cov.rep = cov.run << report;
cov.mat = cov.rep["Covariance Matrix"][matrix box(1)] << get(1);
random reset(1234);
//generate X = (X1, . . . , Xn) where X ∼ MNn(µ, Σ) using the Cholesky decomposition of Σ
//to find (nxn) matrix, C, such that C*C` = Σ.
//let Z = (Z1, . . . , Zn)` where the Zi’s are IID N(µ, 1) for i = 1, . . . , n.
//mean.M is mean vector.
sim.n = 1e4;
dummy.mat = j(1,sim.n,1);
mean.mat = mean.M*dummy.mat;
n.means = n row(mean.M);
sim.C = cholesky(cov.mat);
sim.Z = j(n.means, sim.n, random normal());
sim.X = sim.C*sim.Z;
sim.X2 = sim.X + mean.mat;
sim.Xt = transpose(sim.X2);
as table(sim.Xt, << column names(tpListY));
私は同じ作業を行うのに使用するコードの量が少ないことを好むため、プロファイラー ルートよりもこの方法の方が魅力的でした。 これにより、他の場所での実装が容易になることを願っています。
再度、感謝します、
イーアンジェロ
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
N 列まで拡張可能なスクリプトを作成できたと思います。 私は与えます@MSプロファイラーの相関部分を一般化する際に多大な貢献をしていただきました。 そのスレッドはここ。
スクリプトは 2 つあります。1 つは実装したものと同様ですが、元の投稿にある追加の変数が含まれていないスタンドアロン バージョンで、もう 1 つはデータ テーブル自体から実行できるスクリプトです。 スタンドアロンは以下にあり、データ テーブルから実行するものは Gendt.jmp データ テーブルにあります。 これは、4 列のデータ テーブルと、11 列で作成した他のデータ テーブルの両方で機能します。 他の列タイプのデータ テーブル用のスタンドアロン スクリプトも一般化しようとしました。
Names Default To Here( 1 );
// Expression to clear all current settings
clearRoles = Expr( ColListY << RemoveAll );
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = ColListY << GetItems
);
//get data table
Try( Close( Data Table( dt ) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
//Find the number of columns in the data table
ncol = N Col( dt );
ColList = dt << Get Column Names( Numeric, Continuous );
//Dialog Window.
Dlg = New Window( "New Window",
<<RETURN result=""></RETURN>
また、受け取ったボタン ボックス エラーは、ダイアログ ウィンドウの <<モーダル呼び出しに関係していると思います。 これを << Return Result に置き換えたところ、エラーは発生しなくなりました。 リコールボタンも付けましたが、必ずしも必要ではありません。
これがお役に立てば幸いです。これは本当に素晴らしく、そこから多くのことを学びました。 これは私の仕事にも必ず活かせると思います!
ありがとう!、
DS
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
あなたが相関構造で何をしたいのかを理解したとき、まさにそれが私の頭をよぎりました。 あなたのアイデアを借りて、私が直面している特定の問題のいくつかに合わせて修正したいと思います。 N 入力への一般化については別のスレッドに投稿しました。 かなり近づいていると思いますが、まだそこまでではありません。 X Correlations() を呼び出して因子の平均値と標準偏差値を設定するときにスケールアップするのが困難です。
添付されているのは、私が作成しているモックアップ データ テーブルとスクリプトで、すべて元のスクリプトに基づいています。 もしかしたら、私が犯している間違いを見つけることができるでしょうか? あなたが指摘したように、これが任意の数の列で機能することを見てみたいと思います。これは履歴データにとって非常に役立ちます。
ありがとう!、
DS
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@SDF1 、
私は、モデリング (データ間のモデル調整) を目的として、通常はいくつかの履歴パラメーターに基づいて、多変量データセットを頻繁にシミュレートします。 このスクリプトは、このモック データを提供するための単純なソリューションにすぎません。 現時点では具体的な使用例はありませんが、このスクリプトを n 次元にスケールし、関数として使用する可能性があります。モジュール大規模サンプル手法を使用する、より広範なスクリプトに組み込むことができます。 平均値/SD ベクトルと相関行列をプロファイラー プラットフォームに送信する際の制約を考慮すると、シミュレーションを n 次元にスケールするために線形演算を明示的に記述することになるでしょう。
よろしく、
イーアンジェロ
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
素晴らしい解決策です。そのようにすることを覚えていればよかったです。 モデルのチューニングを自動化するスクリプトを作成するときにも、同様のことを行う必要がありました。 EvalInsert() と引用符のエスケープ文字、および値を挿入するための ^^ は非常に役に立ちました。 あまり頻繁に使用しないので、その特定の方法を忘れてしまいました。
好奇心から、指定された相関構造を使用してそのようなシミュレートされたデータを生成する必要があるのはなぜでしょうか。 それを私が取り組んでいるいくつかのことにどのように組み込むかについていくつかのアイデアを与えてくれたので、非常に興味があります。
ありがとう!、
DS
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@SDF1 、
トラブルシューティングにご協力いただき、ありがとうございました。 次のような同様の機能を試してみましたEval、Eval Expr( Expr(x) ) 、とエヴァリンサートそして、プロファイラーに送信する前に列変数と行列変数を強制的に評価することで解決策を見つけました(これはX相関受け付けてくれるようです)。 上記と同じソリューションを適用して、プロファイラーをさまざまな列名に柔軟に対応できるようにしました。 これで、相関構造がシミュレートされたデータ内に維持されます。
new.design = evalinsert(
"\[sim.design << Simulator(
1,
Factors(
Name( "^col1^" ) << multivariate( tpMean[1], tpSD[1]),
Name( "^col2^" ) << multivariate( tpMean[2], tpSD[2]),
Name( "^col3^" ) << multivariate( tpMean[3], tpSD[3]),
Name( "^col4^" ) << multivariate( tpMean[4], tpSD[4]),
),
X Correlations(
1,
^tpListY^,
^corr.mat^
),
N Runs(10000)) ]\");
eval(parse(new.design));
再度、感謝します、
EA
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
データ表ありがとうございます。 ご指摘の通り、問題を再現させていただきます。 私が気づいている点の 1 つは、シミュレーターを実行すると、X Correlations のヘルプ インデックスにある Tiretread の例とは異なり、プロファイラーの隣にヒストグラムが作成されないことです。
次の 2 つのことが起こっていると思います。
1. tpListY を呼び出す
2.corr.matの呼び出し
理由はわかりませんが、コード内で X 相関のリストを明示的に「詳しく記述する」必要があると思います。これには相関行列が含まれます。そのため、tpListY を呼び出す代わりに、それを {TP1, TP2 に置き換える必要があります。 、TP3、TP4}。 同様に、実際の 4x4 (または NxN) 相関行列を角括弧 [] の間に入れる必要があります。
Parse(tpListY[1]) のようなことを実行すれば機能すると思いましたが、Eval() をラップしても機能しません。 JSL コードを {TP1、TP2、TP3、TP4} として入力した場合にのみ、自動的に動作させることができます。 NxN 相関行列を入力する場合、実際には行列の左下の三角形を使用してテーブルを埋めることに注意してください。
また、corr.mat[1] などのように、corr.mat の要素を呼び出すことも機能するかもしれないと考えましたが、それも機能しません。 これを実行しようとすると、無効な行列トークン エラーが発生します。corr.mat の要素は数値であるため、その理由はよくわかりません。
以下のコード (関数を少し変更して変更しました) は期待どおりの出力を提供しますが、4x4 システムから NxN システムに拡張したいという要望には役に立ちません。
names default to here(1);
Try( Close( Data Table(dt) ) );
If( Is Empty( dt ),
Try( dt = Open(), Throw( "No data found" ) )
);
ncol = NCol(dt);
//Dialog Window.
Dlg = New Window("New Window",
<< Modal,
BorderBox(left(3), top(2),
V List Box(
TextBox("Simulate multivariate data"),
HListBox(
VListBox(
PanelBox("Select variables",
colListData = ColListBox(all,nLines,(min(ncol,10)))
),
),
PanelBox("Cast Selected Variables",
LineupBox(NCol(2), Spacing(3),
ButtonBox("Variables", colListY << Append(colListData << Get Selected)),
colListY = ColListBox(nLines(6), "numeric"))
),
//specifications - not in use.
PanelBox("Enter Specifications",
Spacer Box(Size(10, 1)),
HListBox(
VListBox(
Spacer Box(Size(5, 10)),
lsl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
lsl4 = Number Edit Box(, 3)
),
SpacerBox(Size(10,10)),
VListBox(
Spacer Box(Size(5, 10)),
usl1 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl2 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl3 = Number Edit Box(, 3),
Spacer Box(Size(5, 10)),
usl4 = Number Edit Box(, 3)
)
),
),
PanelBox("Action",
LineupBox(NCol(1),
// OK button
Button Box("OK",
lsl_mat = J(4,1, .);
lsl_mat[1] = Eval(lsl1 << Get);
lsl_mat[2] = Eval(lsl2 << Get);
lsl_mat[3] = Eval(lsl3 << Get);
lsl_mat[4] = Eval(lsl4 << Get);
usl_mat = J(4,1, .);
usl_mat[1] = Eval(usl1 << Get);
usl_mat[2] = Eval(usl2 << Get);
usl_mat[3] = Eval(usl3 << Get);
usl_mat[4] = Eval(usl4 << Get);
// Store summary statistics
tpListY = colListY << Get Items;
tpMean = J(4, 1, 0);
tpSD = J(4, 1, 0);
for (i=1, i <= nitems(tpListY), i++,
one_col = tpListY[i];
Meani = Col Mean(Column(dt, one_col));
SDi = Col Std Dev(Column(dt, one_col));
tpMean[i] = Meani;
tpSD[i] = SDi;
);
Dlg << CloseWindow
),
// Cancel button
Button Box("Cancel", Dlg << CloseWindow),
Spacer Box(Size(10,10)),
// Remove button
Button Box("Remove", collistY << RemoveSelected)
)
),
)
)
)
);
//correlation matrix
corr = multivariate(
Y(Eval List(tpListY)),
estimation method("Row-wise"),
matrix format("Square"),
scatterplot matrix(0)
);
corr.run = corr << run;
corr.rep = corr.run << report;
corr.mat = corr.rep["Correlations"][matrix box(1)] << get(1);
//only used to launch profiler
prof.x = J(200,4 ,1);
prof.tbl = as table(prof.x, << column names(tpListY), << invisible);
prof.tbl << new column("Y",
Formula( :TP1+:TP2^2-:TP3+:TP4*Random Normal(0,2))
);
prof.tbl = current data table();
random reset(1234);
//specify multivariate data from summary statistics
sim.design = Profiler( Y( :Y ), Invisible );
sim.design << Simulator(
1,
Factors(
TP1 << multivariate( tpMean[1], tpSD[1] ), TP2 << multivariate( tpMean[2], tpSD[2] ),
TP3 << multivariate( tpMean[3], tpSD[3] ), TP4 << multivariate( tpMean[4], tpSD[4] ),
),
Responses( Y << No Noise ),
Automatic Histogram Update( 1 ),
X Correlations( 1, {TP1, TP2, TP3, TP4},
[1 0.6401843997 0.670478399654806 0.6405126152, 0.6401843997 1 0.9443055859 0.8815992957, 0.6704783997 0.9443055859 1 0.9355872238, 0.6405126152 0.8815992957 0.9355872238 1]
),
N Runs( 10000 ),
Simulate
);
//Make data table
report( sim.design )["Simulate to Table"][button box( 1 )] << click( 1 );
sim.dt = data table( 1 );
sim.dt << set name( "Simulated multivariate data" );
sim.dt << delete columns({"Y","Obj"});因子の多変量ノイズを埋めるために tpMean および tpSD の要素を呼び出すことができるので、それを行う方法があるはずです。 これについては、JSL の経験が豊富な誰かがコメントする必要があるかもしれません。
最後に、ボタン ボックスの 1 つについてはあなたが正しいと思いますが、私もそれを正確に特定できませんでした。tpListY と corr.mat の問題を解決することに集中していました。 
あなたが何を知るかとても興味があります。
幸運を、
DS
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@SDF1 、
投稿する前に十分な注意を払っていませんでした。これはサンプル データからの 10 行のサンプルです (4 つの X、TP1 ~ TP4)。 現在のスクリプトは 4 つの変数に制限されていますが、これを次のようにスケールできることを期待しています。 N将来の変数。 このサンプル データ テーブルは私の問題を再現します。 未解決の名前エラーはダイアログ ボックス (おそらくキャンセル/削除ボタン) によるものだと思いますが、根本的な原因は見つかりませんでした。
ありがとう、
EA
Re: シミュレーション用のプロファイラーで相関行列を指定する方法は?やあ@eangello 、
これは興味深い質問で、できる限り解決したいと考えていますが、問題を再現することができません。 スクリプトを実行しようとすると、サンプル データ ディレクトリからデータ テーブルを開くように求められます。 ここでの問題の 1 つは、どのデータ テーブルを使用しているのかわからないため、同じ問題が発生しないことです。 使用しているデータテーブルを提供してもらえますか?
サンプル データ (2D ガウス プロセスの example.jmp ファイルなど) からデータ テーブルを選択すると、次のダイアログ ウィンドウで列をロールにキャストするように求められますが、[OK] をクリックすると、未解決のデータがあるというエラーが表示されます。 name 超過の名前、または「Button」の評価、Button(-1) /*###*/。 次に、コードの 124 行目で、sim.design << Simulator() send コマンドが気に入らないという別のエラーが発生します。
どうやら、これが機能するデータテーブルがあるようです。 共有してもらえますか? それとも、投稿で示した出力の生成に使用しているテーブルについて詳しく教えてください。
ありがとう!、
DS