Erstellen Sie eine Formel, um Spalten der Designmatrix zu generieren<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich bin ein Anfänger in der Verwendung von JMP und kann in der JMP-Community keine ähnlichen Antworten auf meine Fragen finden. Angenommen, ich habe eine Datentabelle mit mehreren Spalten, und der Benutzer muss die Spalte aus der Datentabelle auswählen, und dann wird eine Entwurfsmatrix entsprechend der ausgewählten Spalte generiert. Die ausgewählte Spalte und die Designmatrix werden in einer neuen Datentabelle erstellt. Aber das ist nicht genug. Wenn der Benutzer den Wert in der ausgewählten Spalte in der neuen Datentabelle ändern möchte, wird die Designmatrix entsprechend aktualisiert. Mein Problem ist, dass ich die Designmatrix mit dem folgenden Code nicht korrekt aktualisieren kann:
// Erstellen Sie ein Fenster, um eine Spalte auszuwählen
// Etwas Code weglassen, um das Fenster zu erstellen
CheckAndConvert = Ausdr(
selectedColumns = c << Items abrufen;
// Wenn Eingaben gültig sind, fahren wir fort
Wenn (N Elemente (ausgewählte Spalten) > 0,
gewinnen << Fenster schließen;
A = Spalte (ausgewählte Spalten);
s = A << GetAsMatrix; // Extrahiere die Select-Spalte in s
// erstelle die neue Datentabelle "Design Matrix"
dt = Neue Tabelle ("Designmatrix");
dt << New Column("slice", Numeric, Values(s[0, 1])); // s in die Spalte "slice" in der neuen Datentabelle kopieren
// Erstellen Sie entsprechende Spalten der Designmatrix und fügen Sie sie der neuen Datentabelle hinzu
For( i=1, i<=Col Max(dt:slice), i++,
dt << New Column("X"||Char(i), Numerisch,
Nach Last,
Formel(
If(dt:slice == i, 1,
0
)
)
);
);
);
);
PS: Ich kann die richtige Antwort erhalten, wenn ich den Code ausführe, ohne den Wert in der Slice-Spalte zu ändern, aber ich kann X-Spalten nicht aktualisieren, wenn ich den Wert von Slice ändere. Beachten Sie, dass die Anzahl der X-Spalten der Maximalwert in der Slice-Spalte ist, der nicht mit unterschiedlichen Werten festgelegt ist. In den folgenden Bildern zeige ich die Beispiele zur Auswahl von Spalte 1 und Spalte 2 in den Testdaten.
Vielen Dank im Voraus,
Pulong
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenEntschuldigen Sie. Ich habe Ihre Anfrage noch einmal gelesen und festgestellt, dass keine der JSL-Funktionen in diesem Fall helfen wird. Sie sollen die Spalten für die Effekte kategorialer Faktoren für die lineare Regression bilden.
Hier ist ein Skript, das die Matrix mit den Faktorstufen nimmt und die Matrix mit einer Spalte für jeden Term in einem quadratischen Polynom erstellt:
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
Es ist nicht so schwer, eigene Funktionen zu erstellen.
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenSiehe Hilfe > Skripting-Index. Ändern Sie den Browser, um Funktionen anzuzeigen. Wählen Sie dann die Funktionsgruppe Matrix aus. Hier finden Sie mehrere Funktionen, um aus der Designmatrix (Faktorstufen) die Modellmatrix (für Terme) zu machen.
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generieren
Ich glaube, ich habe eine ähnliche - wenn nicht identische - Frage.
Ich möchte eine Designmatrix aus Prädiktorvariablen ähnlich wie x2fx in Matlab erstellen.
Zum Beispiel: durch Auswählen von Prädiktorvariablen und Spezifizieren des Designtyps (Wechselwirkungen 2. Ordnung) und dann Generieren der Designtabelle.
Siehe Beispiel von Matlab unten: (aber ich möchte dies in JMP tun).
Beispiel 1
Das Folgende konvertiert 2 Prädiktoren<FONT face="Courier New" size="3"> X1</FONT> Und<FONT face="Courier New" size="3"> X2</FONT> (die Spalten von<FONT face="Courier New" size="3"> X</FONT> ) in eine Entwurfsmatrix für ein vollständig quadratisches Modell mit Termen<FONT face="Courier New" size="3"> Konstante</FONT> ,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , Und<FONT face="Courier New" size="3"> X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenIch weiß Ihre Hilfe sehr zu schätzen.
Ich habe heute schon eine Lösung für mein Problem gefunden.
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenOk vielen Dank.
Es klingt also so, als ob das fehlende Stück darin besteht, die Zellen einer (numerischen) Spalte in einem Berichtsfenster bearbeiten zu können, in diesem Fall können Sie 'NumberColEditBox()' verwenden. Für eine Zeichenspalte können Sie 'StringColEditBox' verwenden. Durch die Kombination der beiden können Sie jede Tabelle in einem Editorfenster darstellen, das Ihr Code steuert (obwohl Sie wahrscheinlich Zeilenstatus- und Ausdrucksspalten überspringen müssten):
NamesDefaultToHere ( 1 ) ;
// Verwenden Sie eine numerische Spalte
dt = Offen ( "$SAMPLE_DATA/Große Klasse.JMP" ) ;
cName = "Höhe" ;
cVals = Spalte ( dt , cName ) << getValues ;
// Benutzeroberfläche
nw = Neues Fenster ( "Zellen bearbeiten" , ceb = NumberColEditBox ( cName , cVals ) , ButtonBox ( "Aktualisieren" , updateCells )) ;
// Skript aktualisieren
updateCells =
Ausdruck (
nw << Fenster schließen ;
neuVals = ceb << getAlsMatrix ;
dt << Starten Sie DataUpdate ;
Spalte ( dt , cName ) << setValues ( neuVals ) ;
dt << EndDataUpdate ;
) ;
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenDanke für deine Antwort. Ihr Verständnis für den Workflow ist genau das, was ich tue.
Siehe "Define Slice":
Ich habe das Fenster bereits entworfen, um diese Aufgabe zu erfüllen.
Betrachten Sie "Update Slice":
Die Schwierigkeit liegt in der automatischen Aktualisierung auf jede Änderung, die der Benutzer vornimmt. Ich kann die Designmatrix generieren, aber ich weiß nicht, wie ich die Designmatrix automatisch aktualisieren kann, wenn der Benutzer Änderungen an der Slice-Spalte vornimmt. Wenn ich außerdem weiß, wie die Designmatrix automatisch aktualisiert wird, ist es kein Problem, andere Spalten basierend auf der Designmatrix automatisch zu generieren, indem ich den Code ein wenig verändere.
Danke,
Pulong
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenVielen Dank für deine ausführlichere Erklärung. Vielleicht kann ich es in anderen Worten wiedergeben, um sicherzugehen, dass ich es verstanden habe?
Angenommen, die erste Tabelle (die alle möglichen Slices enthält) heißt dt0. Denken Sie an Ihre wichtigsten Schritte oben:
- Der Benutzer wählt eine Spalte (ein Segment) in dt0 aus und erstellt eine neue Tabelle (nennen Sie diese dt1), die nur dieses Segment enthält, plus die Spalten der Designmatrix (plus die anderen abgeleiteten Spalten, die Sie erwähnen, aber nicht buchstabieren). .
- Sie möchten, dass der Benutzer später die Slice-Spalte in dt1 ändern und die anderen Spalten in dt1 „automatisch“ aktualisieren kann.
Ich stelle mir vor, dass Ihr endgültiges Add-In zwei Menüoptionen hätte: „Define Slice“ und „Update Slice“. Wenn meine Beschreibung von 1. oben richtig ist, kann dieses 'Design Slice'-Skript leicht erhalten werden, indem der Code optimiert wird, den ich bereits vorgeschlagen habe: Die Tabelle dt1 könnte in einem freigegebenen Ordner abgelegt werden, damit andere sie abrufen können, und Sie können alles hinzufügen Metadaten, die Sie der Tabelle oder den darin enthaltenen Spalten hinzufügen möchten.
Das Skript „Update Slice“ könnte dem Benutzer alle verfügbaren Tabellen im freigegebenen Ordner anzeigen und es ihm ermöglichen, eine auszuwählen. Zu diesem Zeitpunkt würden sie die Tabelle jedoch nicht direkt bearbeiten: Stattdessen würde ihnen ein Berichtsfenster angezeigt, in dem sie die Werte der Slice-Spalte in der Tabelle ändern könnten. Hier könnte „Ändern“ bedeuten, dass vorhandene Werte aktualisiert oder neue Zeilen angehängt werden. Wenn sie in diesem Bericht auf OK klicken, um anzuzeigen, dass sie zufrieden sind, könnte dt1 automatisch aktualisiert werden, um alle ihre Änderungen widerzuspiegeln, und Sie könnten auch die Metadaten nach Bedarf aktualisieren. Natürlich wäre dieser 'Update'-Code mit 'Define Slice' üblich.
Sofern ich es nicht falsch verstanden habe, scheint dieser Arbeitsablauf vernünftig zu sein, vielleicht sogar besser, als den Benutzern freien Zugriff auf dt1 selbst zu gewähren.
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenDa dies das erste Mal ist, dass ich JMP verwende, werde ich versuchen, mein Problem in der Sprache des JMP-Skripts zu beschreiben. Kurz gesagt, ich habe eine Datentabelle, in der es eine "Slice" -Spalte gibt, und ich möchte die Designmatrix basierend auf der Slice-Spalte generieren und auch einige andere Spalten basierend auf der Designmatrix generieren. Was ich tun muss, ist ein JMP-Add-In zu entwickeln, das diese Aufgabe umsetzt, damit auch andere Kollegen mein Add-In für Computerexperimente verwenden können.
Zuerst möchte ich ein Fenster entwickeln, um die Slice-Spalte auszuwählen, eine Datentabelle mit der Slice-Spalte und der Designmatrix zu generieren und die Formel zu speichern um die Designmatrix automatisch zu aktualisieren, wenn einige Werte in der Slice-Spalte später geändert werden . (Ich muss die Formel speichern, weil mein Projektmanager es verlangt hat, aber ich könnte ihn überzeugen, ohne die Formelspalten zu verwenden, wenn ich eine bessere Lösung finde.)
Jetzt kann ich das Fenster erstellen und die Datentabelle generieren, die die Slice-Spalte und die Designmatrix enthält, aber die Designmatrix kann nicht aktualisiert werden, wenn ich die Werte in der Slice-Spalte ändere.
In Bezug auf die geschnittene Spalte:
Ich weiß, dass die Designfunktion in JMP die Designmatrix automatisch generieren kann, aber es ist nicht hilfreich, wenn ich Formelspalten möchte. Also habe ich meine eigene Funktion geschrieben, um meine Designmatrix zu generieren, wie in meinem Skript gezeigt. Angenommen, ich habe die Slice-Spalte a = [1, 1, 2, 3]'. Dann wird die Designmatrix als generiert
100
100
0 1 0
0 0 1.
Die Slice-Spalte kann unterschiedlich groß sein, und daher ist es schwierig zu wissen, wie viele Spalten die Designmatrix haben wird, indem man sich die Slice-Spalte manuell ansieht. Außerdem können die Werte in der geschnittenen Spalte beliebig geändert werden.
Ich denke, die wichtigsten Schritte zum Erstellen der Designmatrix sind die folgenden:
1. Wählen Sie die Slice-Spalte aus, klicken Sie auf die Schaltfläche "OK", dann wird eine neue Tabelle generiert, die die Slice-Spalte und die Designmatrix enthält. Natürlich beinhaltet dieser Schritt einen manuellen Eingriff.
2. Wenn ich einige Werte in der Slice-Spalte in der neuen Tabelle manuell ändere, wird die ursprüngliche Designmatrix automatisch gelöscht und die entsprechende neue Designmatrix generiert.
Zweitens muss ich auch einige Spalten basierend auf der Designmatrix generieren, und ich habe auch das Skript geschrieben, um sie zu generieren, aber ich weiß nicht, wie ich sie als Formelspalten speichern kann. Dieses Problem wird kein Problem sein, wenn ich weiß, wie die Formelspalten für die Designmatrix gespeichert werden.
Wenn es mir schließlich gelungen wäre, die Designmatrix und einige Spalten zu erstellen, würde ich sie als Add-In packen und unter vielen verschiedenen Umständen testen.
Danke für Ihren Vorschlag. Sag Bescheid, wenn ich mich verständlich mache.
Pulong
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenIch könnte mich sicherlich irren (je nachdem, wie allgemein Ihre Lösung sein soll), aber ich glaube nicht, dass Formelspalten der beste Weg sind, dies zu versuchen. Die Tatsache, dass eine Spalte in Ihrer Quelltabelle (im Allgemeinen) mehreren Spalten zugeordnet ist, und die Tatsache, dass die Anzahl solcher Spalten die (variable) Anzahl von Ebenen in der Quellspalte ist, erschweren dies.
Bevor Sie einen weiteren Vorschlag machen, könnten Sie vielleicht den Workflow, den Sie sich vorstellen, etwas detaillierter beschreiben? Geben Sie auch an, welche Schritte manuelle Eingriffe erfordern.
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenVielen Dank für Ihre freundliche Hilfe.
Ich muss eine Designmatrix aus einer Spalte generieren, damit ich die Designmatrix auch aktualisieren kann, wenn sich die Werte in der Spalte ändern. Tatsächlich möchte ich eine Formel erstellen, um die Designmatrix basierend auf ausgewählten Spalten zu generieren, und die Formel speichern, damit ich die Designmatrix aktualisieren kann, wenn einige Werte in den ausgewählten Spalten geändert werden.
In meinem Code wird die Designmatrix generiert, aber ich kann die aktualisierte Designmatrix nicht abrufen, wenn ich einen bestimmten Wert in der ausgewählten Spalte ändere, was das Problem ist, mit dem ich zu kämpfen habe. Ich wäre Ihnen sehr dankbar, wenn Sie mir einen Vorschlag zu meinem Problem machen könnten.
Danke,
Pulong
Betreff: Erstellen Sie eine Formel, um Spalten der Designmatrix zu generierenIch war mir nicht ganz sicher, wonach du suchst. Aber wenn Sie neu bei JMP sind, kann Ihnen der folgende Code einige Ideen geben.
NamesDefaultToHere ( 1 ) ;
// Tabelle testen
dt = NeueTabelle ( "Prüfen" ,
NeueSpalte ( "C1" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 1 , 5 ))) ,
NeueSpalte ( "C2" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 1 , 5 ))) ,
NeueSpalte ( "C3" , Numerisch , Kontinuierlich , Formel ( Zufällige Ganzzahl ( 1 , 5 ))) ,
Zeilen hinzufügen ( 10 )
) ;
// Benutzeroberfläche
Neues Fenster ( "Design aktualisieren" ,
PanelBox ( "Wählen Sie eine Spalte aus, um das Design zu sehen" ,
lub = LineUpBox ( NCol ( 2 ) ,
Klasse = ColListBox ( dt , Alle , Numerisch , MaxItems ( 1 ) , MinItems ( 1 ) , clbScript ) )
)
) ;
// Skript zum dynamischen Aktualisieren der Lineup-Box lb abhängig von der Auswahl in clb
clbScript =
Ausdruck (
// Holen Sie sich die Werte in der ausgewählten Spalte
Wert = Spalte ( dt , Klasse << getSelected ) << getAlsMatrix ;
// Vorhandene Matrixbox löschen
Versuchen ( mb << löschen ) ;
// Erhalte die Designmatrix in einer Matrixbox
mb = MatrixBox ( Design ( Wert )) ;
// Neue Matrixbox anhängen
lub << anhängen ( mb ) ;
) ;