シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは、
サンプルデータのセットから、指定された行数、平均/標準偏差ベクトル、および相関構造を持つ多変量正規データを作成するスクリプトを作成しています。 プロファイラープラットフォームのシミュレーターを利用して、次の手順でデータテーブルを生成したいと思います。
- 各変数のサンプル平均と標準偏差を計算します。
- サンプルデータから相関行列を生成します。
- (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"});期待される出力と実際の出力:
期待されるvsactual
データ表スクリプティングRe:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@eangello 、
これは興味深い質問です。できる限りサポートさせていただきたいのですが、問題を再現することはできません。 スクリプトを実行しようとすると、サンプルデータディレクトリからデータテーブルを開くように求められます。 ここでの1つの問題は、使用しているデータテーブルがわからないため、同じ問題が発生しないことです。 使用しているデータテーブルを提供できますか?
サンプルデータからデータテーブルを選択した場合(たとえば、2Dガウス過程example.jmpファイル)、次のダイアログウィンドウで列をロールにキャストするように求められますが、[OK]をクリックすると、未解決のエラーが発生します。 name'Button '、Button(-1)/ * ### * /の超過または評価の名前。 次に、sim.design << Simulator()sendコマンドが気に入らないコードの124行目から別のエラーが発生します。
どうやら、これが機能するデータテーブルがあります。 共有できますか? または、投稿に表示した出力を生成するために使用しているテーブルの詳細を教えてください。
ありがとう!、
DS
Re:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@DiedrichSchmidt 、
投稿する前にデューデリジェンスを行っていませんでした。これは、サンプルデータ(4 X、TP1-TP4)からの10行のサンプルです。 現在のスクリプトは4つの変数に制限されていますが、これを次のようにスケーリングできることを望んでいます。 N将来の変数。 このサンプルデータテーブルは私の問題を再現します。 未解決の名前エラーはダイアログボックス(おそらくキャンセル/削除ボタン)からのものだと思いますが、根本的な原因は見つかりませんでした。
ありがとう、
EA
Re:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@eangello 、
データテーブルをありがとう。 あなたが言うように私はあなたの問題を再現することができます。 私が気づいていることの1つは、シミュレーターを実行すると、X相関のヘルプインデックスの疲れた例とは異なり、プロファイラーの横にヒストグラムが作成されないことです。
私は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:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@DiedrichSchmidt 、
トラブルシューティングにご協力いただきありがとうございます。 私はのような同様の機能で遊んだEval、Eval Expr(Expr(x) )。 、そしてEvalinsertそして、プロファイラーに送信する前に列変数と行列変数を評価するように強制することで解決策を見つけました(これは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 、
素晴らしい解決策です。そのようにすることを忘れないでください。 モデルの調整を自動化するスクリプトを作成するときも、同様のことをしなければなりませんでした。 EvalInsert()と引用符のエスケープ文字、および値を挿入するための^^は非常に役に立ちました。 私はそれをそれほど頻繁に使用せず、物事のその特定の方法を忘れました。
好奇心から、なぜ指定された相関構造でそのようなシミュレートされたデータを生成する必要があるのですか。 それを私が取り組んでいるいくつかのものに組み込む方法についてのいくつかのアイデアを私に与えてくれたので、私は非常に興味があります。
ありがとう!、
DS
Re:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@DiedrichSchmidt 、
私は、モデリングの目的で多変量データセットを頻繁にシミュレートします(それらの間のモデルの調整)。通常、いくつかの履歴パラメーターに基づいています。 このスクリプトは、このモックデータを提供するための単純なソリューションでした。 現在、特定のユースケースはありませんが、このスクリプトをn次元にスケーリングし、機能として使用する可能性があります。モジュール大規模なサンプル手法を使用する、より広範なスクリプトに組み込むことができます。 平均/標準偏差ベクトルと相関行列をプロファイラープラットフォームに送信する際の制約を考えると、シミュレーションをn次元にスケーリングするために、線形演算を明示的に記述することに頼る可能性があります。
よろしく、
eangello
Re:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@eangello 、
あなたが相関構造で何をしたいのかを理解したとき、まさにそれが私の頭に浮かんだことです。 私はあなたのアイデアを借りて、私が直面している特定の問題のいくつかにそれを修正したいと思います。 N個の入力への一般化について別のスレッドに投稿しました。 私はかなり近いと思いますが、そこには完全ではありません。 X Correlations()を呼び出して、因子の平均値と標準偏差値を設定するときに、スケールアップするのに問題があります。
添付されているのは、私が作業しているモックアップデータテーブルとスクリプトで、すべて元のスクリプトに基づいています。 多分あなたは私が犯している間違いを見つけることができますか? ご指摘のとおり、これが任意の数の列で機能することを望んでいます。履歴データに非常に役立ちます。
ありがとう!、
DS
Re:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@eangello 、
N列にスケーラブルなスクリプトを作成できたと思います。 私は与える@MSプロファイラーの相関部分を一般化するのに役立つ莫大な金額のクレジット。 そのスレッドはここに。
2つのスクリプトがあります。実装したものと同様のスタンドアロンバージョンですが、元の投稿にあった追加の変数は含まれていません。また、データテーブル自体から実行できるスクリプトもあります。 スタンドアロンは以下にあり、データテーブルから実行するものは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:シミュレーション用のプロファイラーで相関行列を指定する方法は?こんにちは@DiedrichSchmidt 、
私はそのアプローチを考えたことはありませんでした。 ダイアログウィンドウについては、あなたが正しいと思いますが、よく見る必要があります。 プロファイラープラットフォームを一斉に回避することは頭痛の種ではないことが判明しましたが、それが私にとってうまくいかなかったのは素晴らしいアイデアでした。 これは同じ結果ですが、煩わしさが少なく(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));
私は同じ仕事を成し遂げるためにより少ないコードを使用することを好むので、これはプロファイラールートよりも魅力的でした。 うまくいけば、これにより他の場所での実装が容易になります。
再度、感謝します、
eangello