Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenIch habe ein Skript, das den Rsquared-Wert für einen Parameter im Vergleich zu vielen Parametern findet.Einmal in einer Tabelle ist es einfach, nach den besten Werten zu sortieren.Es hat im Laufe der Jahre sehr gut funktioniert, aber wenn ich versuche, es zu pushen, um den Wert für Zehntausende oder mehr Parameter zu finden, dauert es sehr lange.Ich habe mich gefragt, ob jemand einen schnellen Weg in JSL kennt, um dies zu tun.
Dinge, die ich versucht habe, aber alle zu lange dauern:
1. Erstellen eines bivariaten Berichts und Lesen des Rsq aus dem Anzeigebaum.
xy = Bivariat (J( Säule (bzw)), X( auswerten (Fakt)), Fit Polynomial(Grad), unsichtbar);
Dieser Befehl funktioniert tatsächlich schneller als ich erwarten würde, aber das Schleifen durch den Anzeigebaum zum Abrufen der Werte dauert die meiste Zeit.
2. Mit Modell anpassen -> StepWise -> Alle möglichen Modelle von 1 Term.
Dies scheint nur für Datenzeilen zu passen, die keine fehlenden Daten für alle Begriffe enthalten, und ich habe möglicherweise viele fehlende Daten für einige Begriffe.Also für meine Bedürfnisse nicht geeignet.
3. Summieren von Quadraten mit einer Funktion wie der folgenden.
GetRsquared = function ({x,y}, {sx,sy,ssxx,ssyy,ssxy,nr,np,i},
sx=0;
sy=0;
ssxx=0;
ssyy=0;
ssxy=0;
nr=nrows(y);
np=nr;
for( i=1, i<=nr, i++,
if(is missing(x[i]),np--,
if(is missing(y[i]),np--,
sx=sx+x[i];
sy=sy+y[i];
ssxx=ssxx+x[i]*x[i];
ssyy=ssyy+y[i]*y[i];
ssxy=ssxy+x[i]*y[i]
)));
ssxx=ssxx-sx*sx/np;
ssyy=ssyy-sy*sy/np;
ssxy=ssxy-sx*sy/np;
r2=ssxy*ssxy/ssxx/ssyy
);
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenVielen Dank für Ihre Hilfe.Ich möchte hier zusammenfassen, nur damit es einen Rekord für zukünftige JMP-Entdecker gibt.
Ich habe versucht, einen Weg zu finden, um schnell alle R-Quadrat-Werte eines Terms im Vergleich zu vielen Termen bis zu ~ 100.000 Termen zu bestimmen.
In meiner Testversion habe ich 2.000 Begriffe angepasst und ein HP EliteBook mit Windows 7, 64-Bit-Betriebssystem, Intel Core i5-4300U-CPU mit 190 GHz, 2,50 GHz und 16 GB RAM verwendet.
Meine ursprüngliche Methode, entweder 1) eine bivariate Anpassung zu wiederholen und das R-Quadrat aus dem Anzeigebaum zu lesen, oder 2) Brute-Force-Berechnungen, beide dauerten ~ 37 Sekunden auf meinem Laptop.Das sind ~ 30 Minuten für 100.000 Begriffe!Und dies für mehr als einen Antwortbegriff tun wollen!
Die Methode zur Verwendung der Multivariate-Plattform verbrauchte etwa 15 Minuten lang alle Ressourcen meines Computers und stürzte dann aufgrund von unzureichendem Arbeitsspeicher ab.Versuchen Sie das nicht zu Hause.
Die Methode zur Verwendung von Response Screening von KarenC dauerte 1 Sekunde!Das ist eindeutig die Lösung.Ich habe eine Antwort von mikedriscoll nur deshalb als Lösung markiert, weil er die Diskussion zusammenfasst und den zu verwendenden Code zeigt.
Um vollständig zu sein, hier ist der Code, den ich am Ende verwendet habe.
dt ist meine ursprüngliche Datentabelle.
resp ist eine Zeichenfolge, die die interessierende y-Spalte benennt.
Tatsache ist eine Liste von Zeichenfolgen, die die x interessierenden Spalten benennen.
dt1 = dt << Response Screening(Y(column(resp)), X(eval(fact)));
// Note: This is not a normal table and JMP will not recognize dt1 as a table
// The 'table' is called "Pvalues". Hopefully you don't already have a table of that name.
// Of course you can write more code to make this error proof.
// To immediately move this information to a normal JMP table I took a subset.
dt2 = Data Table( "PValues" ) << Subset( All rows, Selected columns only( 0 ) );
// Now I can do other things, like ...
dt2 << Sort( By( :RSquare ), Order( Descending ), Replace Table );
rsq = dt2:RSquare<< get as matrix;
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenSie können die Response Screening-Plattform von JSL aus aufrufen ... von dort aus können Ihnen meine JSL-Kenntnisse nicht weiterhelfen.
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenAls Antwort auf Ihre erste Frage zu meinem Skript hat Multivariate nur die "Y" -Variablen, also verkette ich X's und Y's und lasse es berechnen. Ich erinnere mich nicht, was ich für die Überlappung mache, aber ich denke, ich handhabe es irgendwie.
Das Response-Screening, auf das Karen hingewiesen hat, ergibt viel mehr Sinn für das, was ich zu tun versuchte.Es kann anscheinend geskriptet werden. Führen Sie es als Test aus und sehen Sie sich dann das rote Dreieck aus der Berichtsausgabe an, nicht die Tabelle. Das obere rote Dreieck. Klicken Sie auf Skript speichern -> zum Skriptfenster und Sie können es sehen. Ich weiß nicht, wie ich den Verweis auf die Tabelle und die r-Werte erhalten soll, aber ich würde wahrscheinlich eine Liste der offenen Tabellen erhalten, bevor das Skript ausgeführt wurde ... und dann die neue finden, nachdem sie generiert wurde.
Antwortscreening ( Y( .... ), X(.... ) )
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenIch bin auch überrascht, dass es in der neuen Datentabelle keinen "Source" -Eintrag gibt.Ich schlage vor, dass Sie einen Eintrag in der JMP-Wunschliste hinzufügen und darum bitten, dass dies hinzugefügt wird.
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenKaren,
Das ist sehr schnell und scheint alle Parameter zu bekommen, die ich mir jemals wünschen könnte.
Meine Anwendung ist Teil eines Skripts, das andere Dinge mit den Ergebnissen macht.
Glaubst du, es kann gescriptet werden?
Ich bin überrascht, dass es keine Quellvariable für die Tabelle gibt.
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenMike,
Danke für die Antwort.Ich habe das versucht.Wird hier nur das R der Terme aufgezeichnet, die allen Daten gemeinsam sind?Ich frage mich, ob es robust gegenüber schlechten Datenspalten ist.
Klopfen
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenKürzlich habe ich Analysieren> Screening> Response Screening (nicht JSL, nur die Benutzeroberfläche) verwendet, um RSq-Werte zu erhalten.Dies funktioniert für einen vs. viele Parameter oder viele vs. viele Parameter. Es ist schnell. Am Ende erhalten Sie andere Informationen, die RSq-Werte befinden sich jedoch in der generierten pvalue-Tabelle. Bonus-Tipp: In der P-Wert-Tabelle können Sie Zeilen (Paare von Parametern) auswählen und das Tabellenskript „Fit Selected Items“ ausführen, um bivariate Anpassungen zu erhalten. Ich liebe das, weil ich immer eine Beziehung sehen möchte, die zahlenmäßig stark erscheint, bevor ich es wirklich glaube.
Betreff: Eine schnelle Möglichkeit, eine Tabelle mit R²-Werten zu erstellenIch habe ein Skript, das so ziemlich dasselbe macht. Früher wurde die bivariate verwendet, jetzt verwende ich multivariate (siehe Teilmenge des Skripts unten).Ich habe kürzlich einen Fehler gefunden, den ich noch nicht behoben habe, wahrscheinlich mit Sonderzeichen im Spaltennamen. Aber insgesamt sollte das funktionieren. Ich kann mich nicht erinnern, ob ich es für so große Datensätze verwendet habe, aber für die Daten, mit denen ich gearbeitet habe, war dies viel schneller.Beachten Sie, dass zum Erhalten einer generischen Anzahl von x gegenüber einer generischen Anzahl von y tatsächlich für (num_x + num_y) gegenüber (num_x + num_y) berechnet wird, was immer noch schneller ist als das Schleifen durch die bivariate.
Bearbeiten: Karens Methode sieht viel effizienter / eleganter aus als diese. Wenn ich jemals mein Skript aktualisieren muss, würde ich diese Methode auf jeden Fall ausprobieren.
numX = nitems(xParamNames);
numy = nitems(yParamNames);
yxParamNames = concat(yParamNames, xParamNames);
mvObj = Multivariate(
// Y(evallist(yParamList)
Y(evallist(yxParamNames)
),
Estimation Method( "Row-wise" ),
Matrix Format( "Square" ),
Scatterplot Matrix(0
)
);
corrMatrixObj = mvObj << xpath( "//OutlineBox[ text() = 'Correlations']//MatrixBox");
corrMatrix = corrMatrixObj << get();
corrMatrix = corrMatrix[1];
corrMatRows = 1::numY;
corrMatCols = (numY+1)::(numY+numX);
sub_corrMatrix = corrMatrix[corrMatRows,corrMatCols];
myRsqr = aslist(power(sub_corrMatrix,2)); // rsqr is corr matrix to the power 2. rest of script expects a list.
mvObj<< closewindow();