Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzHallo
Ich analysiere einen sehr großen Datensatz mit mindestens etwa 2000 Parametern in Spalten. Meine Beispiele haben diese Parameterwerte für ~ 250.000 Zeilen. Mein Problem sind die Spalten und nicht die Zeilen.
Ich habe eine diskrete Klassifizierung für alle Stichproben definiert, zwei diskrete Werte, sagen wir Klasse A und B.
Ich analysiere Daten weiter in einer anderen Software, die dann fehlschlägt, wenn sie Parameter erkennt, die eine Varianz von Null haben (oder sehr nahe daran liegen).
Ich möchte diese Arbeit nicht manuell erledigen (wie Sie sich bei 2000 Spalten vorstellen können).
Ich suche nach einer möglichst automatisierten Möglichkeit, Spalten zu löschen, die eine Varianz von Null (oder unter einem definierten sehr kleinen Schwellenwert) für Klasse A oder B aufweisen. Ich gehe die Schritte durch, um die Arbeit abzuschließen, möchte aber nicht manuell eine Spalte auswählen, um den Löschvorgang durchzuführen.
Jede Hilfe wird geschätzt. Dank im Voraus.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzBrady,
Das folgende Skript ist eine geringfügige Änderung gegenüber Ihrem und sollte der Ausgangspunkt sein (mit einigen geringfügigen Änderungen an stdev im Vergleich zu einem Schwellenwert). Wie Sie wissen, benötige ich für den weiteren Fortschritt ein tatsächliches Skript, da dieser Löschvorgang automatisch vom Skript durchgeführt würde. Der interne Code der nächsten Phase – nach der JMP-Datenauswahl – weist insbesondere dann ein Problem auf, wenn eine Nullvarianz festgestellt wird. Ihre vorherige Version (d. h. unten) hat bewiesen, dass diese entfernt werden können.Ich versuche jedoch zu vermeiden, Parameter mit Mittelwertunterschieden, aber einer Varianz von Null zu löschen.
Ich kann keinen Schwellenwert verwenden, der vom tatsächlichen Parametermittelwert und der tatsächlichen Parameterverteilung abhängt. z.B Ich kann keinen praktischen Unterschied angeben, da dies eine eingehende Untersuchung aller 2000 Parameter erfordert und nicht machbar ist. Ich bin mir nicht sicher, ob ich es erwähnt habe, aber 2000 ist nur die Spitze des Eisbergs, weitere folgen. Ein einzelner Datensatz enthält jedoch etwa 2000 Parameter.
Ich kann p_value verwenden, um Parameter ein- oder auszufiltern, je nachdem, welche einen Fehler in unserem internen Code verursachen. Ich denke, unter diesem Gesichtspunkt ist der T-Test möglicherweise die bessere Option. Allerdings weiß ich nicht, wie ich den t-Test einfügen und einen p_value extrahieren soll ... also kann ich ihn als zusätzlichen Filter hinzufügen.
Ich habe das Gefühl, dass ich zwei Möglichkeiten habe ...
1) Entweder verwende ich den Code unten so wie er ist, ohne weiteren Mittelwertvergleich bei zwei Stichproben. Alle derartigen Fälle würden gelöscht, wenn auch nur die Mittelwerte unterschiedlich wären. Ich muss dann die Spaltennamen derjenigen aufzeichnen, die gelöscht wurden (dazu brauche ich Hilfe), damit ich am Ende der Gesamtstudie meine Aufmerksamkeit auf sie richten und sie in jmp analysieren kann, um etwaige Mittelwertunterschiede zu erkennen. Dies wäre prozentual gesehen ein viel kleinerer Satz von Parameteranalysen. Ich gehe davon aus, dass Fälle mit Nullvarianz nur einen sehr geringen Teil des Datensatzes ausmachen.
2) Oder meine zweite Option besteht darin, einen T-Test oder einen anderen Test hinzuzufügen, der einen normalisierten Schwellenwert zur Feinabstimmung der Population signifikanter Unterschiede bietet. Z.B. Ich kann p_value verwenden, um die Signifikanz zu bestätigen oder abzulehnen.
Was denken Sie ?
Danke
-------------------------------------------------- -------------------------------------------------- -------------
Namen standardmäßig hier( 1 );
dt = aktuelle Datentabelle();
dtcol1 = Spalte(dt, 1);
dt1 = dt << subset(rows(dt< dt2 = dt << subset(rows(dt<
// Alle kontinuierlichen Datenspalten abrufen
colList = dt << Spaltennamen abrufen (numerisch, kontinuierlich);
// Schleife über alle Spalten und finde diejenigen ohne Varianz
For( i = N Items( collist ), i >= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) >= 0,01 & Col Std Dev( Column( dt2, colList[i] ) ) >= 0,01,
colList = Remove( colList, i, 1 )
)
);
// Die Spalten ohne Abweichung löschen
dt<
close(dt1, nosave);
close(dt2, nosave);
Hinweis: Die Schwellenwerte für stdevs sind nicht festgelegt. 0,01 ist nur ein Beispiel. Werde das noch feinjustieren.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von Nullvarianz<>
Dennoch möchte ich etwas klarstellen: Sie haben ca. 250.000 Datenzeilen in zwei Gruppen, von denen ich (standardmäßig) annehme, dass sie ungefähr die gleiche Größe haben. Wenn ja, hat ein t-Test mit 125.000 Stichproben in jeder Gruppe eine Trennschärfe von 0,9, um einen Unterschied von weniger als 1/50 Sigma zu erkennen. Da Sie diesen Punkt (Mittelwerttest) erst erreichen, wenn einer oder beide Sigma-Werte sehr niedrig sind, ist ein so kleiner (relativ zum Sigma) Unterschied Ihrer Meinung nach von praktischer Bedeutung? Wenn Sie also zwei Prozesse mit einem Sigma von ungefähr = 1 Einheit hätten, wäre dann ein Mittelwertunterschied von 0,018 Einheiten für Sie von Bedeutung? So empfindlich wird der T-Test sein, wenn jede Gruppe 125.000 Elemente enthält.
Wenn in Ihrem Fall ein so kleiner Unterschied nicht wichtig ist, ist ein Äquivalenztest (der in seiner einfachsten Form aus zwei simultanen, einseitigen t-Tests besteht) besser geeignet, mit dem Sie angeben können, wie groß der Unterschied sein soll IST sinnvoll. Mittel, die sich um weniger als diesen Betrag unterscheiden, gelten als praktisch gleichwertig. Bei diesem Ansatz würde eine bestimmte Spalte gelöscht, solange die Mittelwerte praktisch gleich sind und mindestens eine der Gruppenstandardabweichungen unter dem Schwellenwert liegt.
Hier einige Informationen und ein Beispiel:
http://www.jmp.com/support/help/Equivalence_Test.shtml
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzDanke Duane.
Ich versuche innerhalb des Skripts durch bestimmte Ausgaben und Vergleiche festzustellen, ob der Parameter in Bezug auf die Klassen A und B unterschiedlich ist. Ich versuche nicht, eine Zwischenergebnistabelle zu analysieren, um dann eine Entscheidung zu treffen.
Ich habe 2000 Parameterspalten in einem bestimmten Datensatz und viele Datensätze vergleichbarer Größe.
Die Prozedur muss für einen bestimmten Parameter automatisch die zugehörigen Spalten löschen, die zwischen den beiden Klassen A und B als nahezu identisch befunden wurden.
Ursprünglich habe ich dies als eine Null-Varianz-Suchlogik aufgeschrieben, aber das Problem besteht darin, dass zwei Parameter mit Null-Varianz, aber mit unterschiedlichen Mittelwerten nicht gelöscht werden sollten. Zu diesem Zeitpunkt begann ich, die Logik so zu ändern, dass sie einen Test zum Vergleich des 2-Stichproben-Mittelwerttests enthielt.
Mein Problem ist, dass ich im Skripting sehr neu bin und nicht weiß, wie ich einen Parameter aus den Ergebnissen einer bestimmten Plattform aufrufen soll.
Mein anderes Problem in unseren Daten besteht darin, dass Sie alle Parameter im Skript angegeben haben. Einige dieser Parameter könnten sich sogar als sehr zeitaufwändig erweisen (vielleicht gibt es eine recht einfache Möglichkeit).
Bradys Skript ist eigentlich nahezu perfekt, außer dass ich einen Mittelwerttest mit zwei Stichproben hinzufügen muss und wissen muss, wie ich die Ausgabe als zusätzlichen Filter verwenden kann.
Vielen Dank für Ihre Hilfe.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzDie Berechnung exakter Tests kann sehr lange dauern, und wenn Sie 250.000 Zeilen in Ihrer Datentabelle haben, würde ich wetten, dass sie in dieser Situation nicht berechnet werden.Ich empfehle stattdessen die Verwendung von
Summarize YByX()
Befehl, der alle Fit Y By X-Kombinationen berechnet und eine Datentabelle mit p-Werten und LogWorth-Werten für jede y/x-Kombination erstellt.Anschließend können Sie die richtigen Spalten für die weitere Untersuchung bestimmen.Sie müssen in einem separaten Schritt testen, ob die Varianz Null ist.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzBrady
Ich habe dies an einem Beispieldatensatz (noch nicht dem riesigen) getestet, um den Mechanismus zu verstehen. Ich konnte es ändern, um einen Schwellenwert für st festzulegen. Entwickler anstatt nach 0 zu fragen. Mein verbleibendes Problem ist, dass ich in bestimmten Fällen keine Daten löschen möchte
stdev<=threshold (dh nahe 0) UND Mittelwert der Daten (von Parametern in Bezug auf Klasse A und
sind unterschiedlich.
Daher muss ich als weitere zusätzliche Einschränkung einen Test hinzufügen, um die Mittelwerte mit A und B zu vergleichen.
Ich dachte an den Kolmogorov-Smirnov-Test ... in diesem Fall kann ich einfach sagen: „Löschen Sie den Parameter, wenn KS <= Schwellenwert (praktisch nahe bei 0)“
Tatsächlich versuche ich, unterschiedliche Parameter für den nächsten Schritt herunterzuwählen. Also begann ich zu denken, dass es vielleicht das Beste wäre, einfach KS anzuwenden (keine Notwendigkeit für stdev).
JMP-Hilfe bietet
Namen standardmäßig hier( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Oneway( Y( :Height ), X( :sex ) );
obj << Kolmogorov Smirnov Exact Test( 1 );
Könnte dies auf meinen Fall übersetzt werden als (innerhalb der aktuellen Schleife)
obj=Oneway( Y(:Column( dt1, colList[i] ), X( Column( dt2, colList[i] ) ) );
obj << Kolmogorov Smirnov Exact Test( 1 );
aber ich weiß nicht, wie ich den KS-Wert aus diesem obj-Objekt extrahieren kann.
Übrigens glaube ich nicht, dass mich die CPU-Zeit für 2000 Spalten stören wird, da ich bereit bin, alles zu tun, um eine manuelle Bearbeitung der Daten zu vermeiden.
vielen Dank.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzJim,
Danke für deine Anleitung hier. Ich werde es ausprobieren. Danke nochmal.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzIhr Verständnis ist richtig, Brady.Das Einzige, was ich betonen muss, ist, dass dies mit 250.000 Zeilen zu einer Matrix von 2000 x 250.000 wird.
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzUnd dieser Block benötigt im Vergleich zum vorherigen eine weitere Zehntelsekunde weniger ... aufgrund der Auswahlumkehr im Vergleich zur zweimaligen Auswahl. Größere Gewinne an größeren Tischen.
dtcol1 = column(dt, 1);
dt << select where(ascolumn(dtcol1) == dtcol1[1]);
dt1 = dt << subset(selected rows(1), invisible, selected columns(0));
dt << Invert Row Selection;
dt2 = dt << subset(selected rows(1), invisible, selected columns(0));
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzAllerdings habe ich meinen Code ein wenig getestet, und obwohl er explizite Schleifen vermeidet, was gut ist, ist die Funktion << alle Werte als Matrix abrufen () einfach zu teuer, wenn die Tabelle groß wird, und die Gewinne (falls vorhanden) von vstd() vs. Table Ops, sind zu winzig, um dies auszugleichen.
Bei einer Tabelle Ihrer Größe wird eine Änderung von Jims Code (um Ihre Gruppen zu berücksichtigen) schneller sein. Ausschlaggebend hierfür ist die Tatsache, dass JMP-Tabellenoperationen sehr schnell sind. Ich bin nicht einmal davon überzeugt, dass die Matrixoperationen, die auch sehr schnell sind, schneller sind als die Spaltenfunktionen.
Das anfängliche Unterteilen der Tabellen in zwei Untertabellen – eine für jede Gruppe – zahlt sich mehr als aus (vorausgesetzt, Sie verfügen über genügend Arbeitsspeicher für alle drei Tabellen), da das wiederholte Erstellen von Teilmengen von Zeilen teuer ist.
Der folgende Code (wiederum eine leichte Modifikation von Jims, um Ihre beiden Gruppen zu berücksichtigen) lief für mich in etwa 2,5 Sekunden für 100.000 Zeilen und 1.000 Spalten, während die Routine, die ich zuerst eingereicht habe, über 6 Sekunden dauerte.
Dies wird auf einem Tisch Ihrer Größe immer noch etwas langsam erscheinen ... hoffentlich hat jemand anderes eine bessere Idee.
Names Default To Here( 1 );
dt = current datatable();
dtcol1 = column(dt, 1);
dt1 = dt << subset(rows(dt<<GET rows="" where="">= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) != 0 & Col Std Dev( Column( dt2, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE></GET>
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzAltug,
Wenn ich Ihr Problem richtig verstehe:
- Sie haben eine Spalte (z. B. mit dem Namen „Gruppe“) mit zwei Werten (z. B. „A“ und „B“).
- Sie haben 2000 Spalten mit numerischen Daten.
- Sie möchten jede Spalte löschen, in der die Standardabweichung der Zeilen der Gruppe „A“ ODER der Zeilen der Gruppe „B“ unter einem bestimmten Schwellenwert liegt (oder beides).
Für eine Tabelle Ihrer Größe wird hier die Leistung (und die Speichernutzung) ein Problem darstellen. Ich bin mir nicht sicher, ob das Folgende auf einem Tisch Ihrer Größe funktioniert oder schnell funktioniert, aber versuchen Sie es.
Erstellen Sie zunächst eine Tabelle, in der die Spalte „a/b“ die erste Spalte ist und die übrigen Spalten die interessierenden Parameterspalten sind.
Dann versuchen Sie es hier.<BR />
Prost,
Brady
dt = Current Data Table();
mat = dt << Get All Columns As Matrix(); //this get the A/B column as 1s and 2s. which is which not important.
//create subtables... note A & B will be reversed if B occurs first in dt; the result is unaffected.
matA = mat[loc(mat[0,1]==1), 0];
matB = mat[loc(mat[0,1]==2), 0];
//compute stddevs for each column in each subtable
stdvA = vstd(matA);
stdvB = vstd(matB);
//locate columns of sufficiently low variance
cols = loc(stdvA == 0 | stdvB == 0);
//delete them. Ignore row (1) of the cols vector; it is 1 (corresponding to column 1 in dt).
try(dt << delete columns((dt << get column names)[cols[2::nrow(cols)]]));
Betreff: Big Data / Automatische Spalteneliminierung aufgrund von NullvarianzHier ist ein einfaches Beispielskript, das genau das tut, was Sie wollen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\semiconductor capability.jmp" );
// Get all continuous data columns
colList = dt << get column names( numeric, continuous );
// Loop across all columns and find those with no variance
For( i = N Items( collist ), i >= 1, i--,
If( Col Std Dev( Column( dt, colList[i] ) ) != 0,
colList = Remove( colList, i, 1 )
)
);
// Delete the columns with no variance
dt<<DELETE columns=""></DELETE>