Wie gebe ich eine Korrelationsmatrix in Profiler für die Simulation an?Hallo,
Ich schreibe ein Skript, um multivariate Normaldaten mit einer bestimmten Anzahl von Zeilen, Mittelwert- / Standardabweichungsvektoren und Korrelationsstruktur aus einem Satz von Beispieldaten zu erstellen. Ich möchte den Simulator in der Profiler-Plattform nutzen, um die Datentabelle durch die folgenden Schritte zu generieren:
- Berechnen Sie den Stichprobenmittelwert und die Standardabweichung für jede Variable.
- Generieren Sie eine Korrelationsmatrix aus Beispieldaten.
- Simulieren Sie multivariate Daten mithilfe der zusammenfassenden Statistiken aus (1) und (2).
Derzeit generiert mein Skript die simulierte Datentabelle mit den entsprechenden Mitteln und Standardabweichungen für jede Variable, aber ich kann die Korrelationsstruktur zwischen Variablen nicht korrekt beibehalten. Ich glaube, die Ursache für mein Problem ist, wie ich die [ NxN Korrelationen] mit X Korrelationen Verwenden einer Variablen anstelle der expliziten Angabe der Korrelationsmatrix (z. B. [1 0,3 0, 0,3 1 0, 0 0 1]), aber meine Fähigkeiten zur Fehlerbehebung haben mir keine Lösung gelassen. Das unten stehende aktuelle Skript und die erwartete oder tatsächliche Ausgabe sowie Vorschläge zur Erreichung dieser Schritte sind willkommen:
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"});Erwartete vs. tatsächliche Leistung:
erwartetvsactual
DatentabelleSkriptingBetreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @eangello ,
Dies ist eine interessante Frage, und ich würde gerne versuchen, zu helfen, wenn ich kann, aber ich kann Ihr Problem nicht reproduzieren. Wenn ich versuche, Ihr Skript auszuführen, werde ich aufgefordert, eine Datentabelle aus dem Beispieldatenverzeichnis zu öffnen. Ein Problem hierbei ist, dass ich nicht weiß, mit welcher Datentabelle Sie arbeiten, und nicht dasselbe Problem bekomme. Können Sie die Datentabelle bereitstellen, mit der Sie arbeiten?
Wenn ich eine Datentabelle aus den Beispieldaten auswähle - z. B. die 2D-Gaußsche Prozessbeispiel.jmp-Datei - werden Sie im nächsten Dialogfenster aufgefordert, Spalten in Rollen umzuwandeln. Wenn ich dann auf OK klicke, wird die Fehlermeldung angezeigt, dass eine ungelöste Tabelle vorliegt name Name im Überschuss oder Auswertung von 'Button', Button (-1) / * ### * /. Dann kommt ein weiterer Fehler aus Zeile 124 in Ihrem Code, in der der Befehl sim.design << Simulator () send nicht gefällt.
Anscheinend haben Sie eine Datentabelle, in der dies funktioniert. Kannst du es teilen? Oder geben Sie weitere Details zu der Tabelle an, die Sie zum Generieren der Ausgabe verwenden, die Sie in Ihrem Beitrag angezeigt haben?
Vielen Dank!,
DS
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @DiedrichSchmidt ,
Ich habe meine Due Diligence vor dem Posten nicht durchgeführt - hier ist ein Beispiel von 10 Zeilen aus den Beispieldaten (4 X; TP1-TP4). Das aktuelle Skript ist auf 4 Variablen beschränkt, aber ich hoffe, dass ich dies skalieren kann N. Variablen in der Zukunft. Diese Beispieldatentabelle erstellt mein Problem neu. Ich glaube, der ungelöste Namensfehler stammt aus dem Dialogfeld (möglicherweise Schaltflächen zum Abbrechen / Entfernen), aber ich habe keine Grundursache gefunden.
Vielen Dank,
EA
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @eangello ,
Danke für die Datentabelle. Ich kann Ihr Problem nachbauen, wie Sie erwähnen. Eine Sache, die mir auffällt, ist, dass beim Ausführen des Simulators kein Histogramm neben dem Profiler erstellt wird, anders als im Beispiel "tiretread" im Hilfeindex für X-Korrelationen.
Ich denke, es gibt zwei Dinge:
1. Aufruf von tpListY
2. Corr.mat aufrufen
Ich bin mir nicht sicher warum, aber ich denke, Sie müssen die Liste für die X-Korrelationen in Ihrem Code explizit "buchstabieren" und dies schließt die Korrelationsmatrix ein. Anstatt tpListY aufzurufen, müssen Sie diese durch {TP1, TP2 ersetzen , TP3, TP4}. In ähnlicher Weise müssen Sie die tatsächliche 4x4- (oder NxN-) Korrelationsmatrix zwischen die eckigen Klammern [] setzen.
Ich dachte, dass etwas wie Parse (tpListY [1]) funktionieren würde, aber ich kann es nicht zum Laufen bringen, selbst wenn ein Eval () darum gewickelt ist. Ich kann es nur automatisch zum Laufen bringen, wenn ich den JSL-Code als {TP1, TP2, TP3, TP4} eingebe. Beachten Sie, dass beim Einfügen der NxN-Korrelationsmatrix tatsächlich das untere linke Dreieck der Matrix zum Ausfüllen der Tabelle verwendet wird.
Ich dachte auch, dass das Aufrufen der Elemente von corr.mat funktionieren könnte, wie in corr.mat [1] usw., aber das funktioniert auch nicht. Wenn ich das versuche, erhalte ich einen ungültigen Matrix-Token-Fehler und weiß nicht genau warum, da die Elemente von corr.mat Zahlen sind.
Der folgende Code (ich habe Ihre Funktion geändert, um sie ein wenig zu ändern) liefert die erwartete Ausgabe, hilft jedoch nicht bei Ihrem Wunsch, von einem 4x4-System auf ein NxN-System zu erweitern.
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"});Es muss eine Möglichkeit geben, dies zu tun, da Sie die Elemente tpMean und tpSD aufrufen können, um das multivariate Rauschen für die Faktoren auszufüllen. Ich denke, jemand mit mehr Erfahrung in JSL könnte erforderlich sein, um dies zu kommentieren.
Schließlich denke ich, dass Sie in Bezug auf eines der Schaltflächenfelder Recht haben, aber ich konnte es auch nicht genau bestimmen - ich habe mich mehr darauf konzentriert, die Probleme mit tpListY und corr.mat zu lösen!;)
Ich bin wirklich interessiert an dem, was Sie herausfinden.
Viel Glück,
DS
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @DiedrichSchmidt ,
Vielen Dank für die Hilfe bei der Fehlerbehebung, sehr geschätzt. Ich habe mit ähnlichen Funktionen herumgespielt wie Eval, Eval Expr (Ausdruck (x) ) , und Evalinsert und fand eine Lösung, indem er die Spalten- und Matrixvariablen zwang, vor dem Senden an Profiler (welche) ausgewertet zu werden X Korrelationen scheint zu akzeptieren). Ich habe dieselbe Lösung wie oben angewendet, um meinen Profiler für verschiedene Spaltennamen flexibel zu machen. Jetzt bleibt meine Korrelationsstruktur in den simulierten Daten erhalten.
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));
Danke noch einmal,
EA
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @eangello ,
Tolle Lösung, und ich wünschte, ich hätte daran gedacht, es so zu machen. Ich musste beim Schreiben eines Skripts etwas Ähnliches tun, um die Modelloptimierung zu automatisieren. Die Zeichen EvalInsert () und Escape für Anführungszeichen und ^^ zum Einfügen von Werten waren sehr hilfreich. Ich benutze es einfach nicht so oft und vergesse diese besondere Art, Dinge zu tun.
Warum müssen Sie aus Neugier solche simulierten Daten mit der angegebenen Korrelationsstruktur generieren? Ich bin ziemlich interessiert, da es mir einige Ideen gegeben hat, wie ich das in einige Dinge integrieren kann, an denen ich arbeite.
Vielen Dank!,
DS
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @DiedrichSchmidt ,
Ich simuliere häufig multivariate Datensätze für Modellierungszwecke (Modelloptimierung zwischen ihnen), die normalerweise auf einigen historischen Parametern basieren. Dieses Skript war nur eine einfache Lösung, um diese Scheindaten bereitzustellen. Ich habe momentan keinen spezifischen Anwendungsfall, aber ich beabsichtige, dieses Skript auf n-Dimensionen zu skalieren und es möglicherweise als Funktion zu verwenden Modul Ich kann in umfangreichere Skripte integrieren, die Techniken mit großen Stichproben verwenden. Angesichts der Einschränkungen beim Senden von Mittelwert / SD-Vektoren und Korrelationsmatrix an die Profiler-Plattform werde ich wahrscheinlich explizit die linearen Operationen schreiben, um die Simulation auf n-Dimensionen zu skalieren.
Grüße,
eangello
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @eangello ,
Genau das ging mir durch den Kopf, als mir klar wurde, was Sie mit der Korrelationsstruktur anfangen wollten. Ich möchte Ihre Idee ausleihen und sie an einige der spezifischen Probleme anpassen, mit denen ich konfrontiert bin. Ich habe in einem anderen Thread über die Verallgemeinerung auf N Eingaben geschrieben. Ich denke, ich bin ziemlich nah dran, aber nicht ganz da. Ich habe Schwierigkeiten, es zu vergrößern, wenn ich die X-Korrelationen () aufrufe und den Mittelwert und den Standardentwicklungswert für die Faktoren einstelle.
Im Anhang finden Sie eine Modelldatentabelle und ein Skript, an denen ich arbeite. Alle basieren auf Ihrem ursprünglichen Skript. Vielleicht kannst du die Fehler finden, die ich mache? Ich würde gerne sehen, dass dies für eine beliebige Anzahl von Spalten funktioniert. Wie Sie hervorheben, wäre dies für historische Daten sehr hilfreich.
Vielen Dank!,
DS
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @eangello ,
Ich glaube, ich konnte ein Skript erstellen, das auf N Spalten skalierbar ist. ich gebe @Frau ein RIESIGER Kreditbetrag für Hilfe bei der Verallgemeinerung des Korrelationsteils des Profilers. Dieser Thread ist Hier .
Es gibt zwei Skripte, eine eigenständige Version wie die von Ihnen implementierte, jedoch ohne die zusätzlichen Variablen, die Sie in Ihrem ursprünglichen Beitrag hatten, sowie ein Skript, das aus einer Datentabelle selbst ausgeführt werden kann. Das Standalone befindet sich unten und dasjenige, das aus der Datentabelle ausgeführt werden soll, befindet sich in der Datentabelle Gendt.jmp. Es funktioniert sowohl mit Ihrer Datentabelle mit 4 Spalten als auch mit der anderen Datentabelle, die ich mit 11 Spalten erstellt habe. Ich habe versucht, das eigenständige Skript auch für Datentabellen mit anderen Spaltentypen zu verallgemeinern.
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>
Ich denke auch, dass der Button Box-Fehler, den Sie erhalten, mit dem << Modal-Aufruf für das Dialogfenster zu tun hat. Ich habe das durch << Return Result ersetzt und bekomme den Fehler nicht mehr. Ich habe auch eine Schaltfläche zum Abrufen eingefügt, die Sie jedoch nicht benötigen.
Ich hoffe das hilft, das war echt cool und ich habe viel daraus gelernt. Ich weiß, dass ich dies definitiv für meine Arbeit verwenden kann, die ich mache!
Vielen Dank!,
DS
Betreff: Wie wird eine Korrelationsmatrix in Profiler für die Simulation angegeben?Hallo @DiedrichSchmidt ,
Ich hätte nie an diesen Ansatz gedacht, gut gemacht. Was das Dialogfenster betrifft, denke ich, dass Sie Recht haben, ich muss genauer hinsehen. Es stellte sich heraus, dass es weniger Kopfschmerzen bereitete, die Profiler-Plattform insgesamt zu meiden, obwohl es eine gute Idee war, dass es für mich nicht aufgeht. Hier ist das gleiche Ergebnis, aber mit weniger Aufwand (ähnlich den Schritten, die ich zur Implementierung in R unternehme) und nur dem mittleren Vektor und der Kovarianzmatrix, die als Eingaben benötigt werden.
//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));
Ich bevorzuge es, weniger Code zu verwenden, um den gleichen Job zu erledigen, daher war dies ansprechender als die Profiler-Route. Hoffentlich erleichtert dies die Implementierung an anderer Stelle.
Danke noch einmal,
eangello