Big Data/Eliminazione automatica delle colonne a causa della varianza zeroCiao
Sto analizzando un set di dati molto ampio, con un minimo di circa 2000 parametri in colonne. I miei campioni hanno questi valori di parametro per ~ 250.000 righe. Il mio problema è con le colonne, anziché con le righe.
Ho una classificazione discreta definita per tutti i campioni, due valori discreti, diciamo classe A e B.
Sto analizzando ulteriormente i dati in un software diverso che poi fallisce se rileva parametri che hanno una varianza pari a zero (o molto vicina).
Non voglio fare questo lavoro manualmente (come puoi immaginare da 2000 colonne)..
Sto cercando un modo il più automatizzato possibile per eliminare colonne che hanno una varianza pari a zero (o inferiore a una soglia molto piccola definita) per la classe A o B. Eseguo i passaggi per completare il lavoro, ma non voglio selezionare manualmente alcuna colonna per eseguire l'eliminazione.
Qualsiasi aiuto sarà apprezzato. grazie in anticipo.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroBrady,
Di seguito lo script che è una leggera modifica rispetto alla tua e dovrebbe essere il punto di partenza (con alcune piccole modifiche su stdev confrontate con una soglia). Come sai, ho bisogno di uno script vero e proprio per procedere ulteriormente poiché questa eliminazione verrebbe eseguita automaticamente dallo script. Il codice interno della fase successiva, dopo la selezione dei dati JMP, presenta problemi in particolare quando si incontra una varianza pari a zero. La tua versione precedente (ovvero di seguito) ha dimostrato che questi possono essere rimossi.Sto cercando di evitare di eliminare i parametri con differenze medie ma con varianza pari a zero.
Non è possibile utilizzare una soglia che dipenda dalla media e dalla distribuzione dei parametri effettivi. per esempio Non posso specificare la differenza pratica, poiché ciò richiede un esame approfondito di tutti i 2000 parametri, cosa non fattibile. Non sono sicuro di averlo menzionato, ma il 2000 è solo la punta dell'iceberg, ne arriveranno altri. Tuttavia, un singolo set di dati contiene circa 2000 parametri.
Posso usare p_value per filtrare i parametri dentro o fuori a seconda di quali causano un errore nel nostro codice interno. Penso che da questo punto di vista, il t-test potrebbe essere un'opzione migliore. Tuttavia, non so come inserire il t-test ed estrarre un p_value.... quindi posso aggiungerlo come filtro aggiuntivo.
Sento di avere due opzioni...
1) Utilizzerò il codice seguente così com'è senza ulteriori confronti delle medie a 2 campioni. Eliminerebbe tutti questi casi se anche i mezzi fossero diversi. Devo quindi registrare i nomi delle colonne di quelle che sono state cancellate (ho bisogno di aiuto con quello), in modo che alla fine dello studio complessivo, posso rivolgere la mia attenzione su di esse e analizzarle in jmp per rilevare eventuali differenze medie. Si tratterebbe di un insieme molto più piccolo di analisi dei parametri, in termini percentuali, mi aspetto che i casi di varianza pari a zero costituiscano una parte minima del set di dati.
2) Oppure la mia seconda opzione è aggiungere un test t o qualsiasi altro test che offra una soglia normalizzata per mettere a punto la popolazione delle differenze significative. Per esempio. Posso usare p_value per confermare o rifiutare il significato.
Cosa ne pensi ?
Grazie
-------------------------------------------------- -------------------------------------------------- -------------
Nomi predefiniti qui (1);
dt = tabella dati corrente();
dtcol1 = colonna(dt, 1);
dt1 = dt << subset(righe(dt< dt2 = dt << subset(righe(dt<
// Ottieni tutte le colonne di dati continue
colList = dt << ottieni i nomi delle colonne (numerico, continuo);
// Passa attraverso tutte le colonne e trova quelle senza varianza
For( i = N elementi( collista ), i >= 1, i--,
If( (Col Std Dev( Column( dt1, colList[i] ) ) ) >= 0,01 & Col Std Dev( Column( dt2, colList[i] ) ) >= 0,01,
colLista = Rimuovi( colLista, i, 1 )
)
);
// Elimina le colonne senza varianza
dt<
chiudi(dt1, nosalva);
chiudi(dt2, nosalva);
nota: le soglie sugli stdev non sono stabilite. 0,01 è solo un esempio. Lo perfezioneremo.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zero<>
Comunque, c'è qualcosa che vorrei chiarire: hai circa 250.000 righe di dati in due gruppi, che presumo (per impostazione predefinita) abbiano più o meno la stessa dimensione. Se è così, un test t con 125.000 campioni in ciascun gruppo ha una potenza = 0,9 per rilevare una differenza inferiore a 1/50 del sigma. Dato che stai arrivando a questo punto (test significa) solo quando uno o entrambi i livelli sigma sono molto bassi, una differenza così piccola (rispetto a sigma) ritieni sia di importanza pratica? Cioè, se avessi 2 processi con sigma approssimativamente = 1 unità, ti importerebbe una differenza nella media di 0,018 unità? Ecco quanto sarà sensibile il test t quando ci sono 125.000 elementi in ciascun gruppo.
Se nel tuo contesto una differenza così piccola non è importante, ti sarebbe utile un test di equivalenza (che è nella sua forma più semplice 2 test t simultanei e unilaterali), che ti consente di specificare quanto è grande la differenza È significativo. Le medie che differiscono meno di tale importo sono considerate praticamente equivalenti. Utilizzando questo approccio, una determinata colonna verrebbe eliminata purché le medie siano praticamente equivalenti e almeno una delle deviazioni standard del gruppo sia inferiore alla soglia.
Ecco alcune informazioni e un esempio:
http://www.jmp.com/support/help/Equivalence_Test.shtml
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zerograzie Duane.
Sto cercando di determinare all'interno dello script tramite output e confronti specifici se il parametro è diverso rispetto alle classi A e B. Non cerco di analizzare una tabella intermedia di risultati per poi prendere una decisione.
Ho 2000 colonne di parametri in un determinato set di dati e molti set di dati di dimensioni comparabili.
La procedura necessita di eliminare automaticamente le colonne correlate trovate come quasi identiche tra le due classi A e B, per un dato parametro.
Inizialmente l'ho scritto come logica di ricerca della varianza zero, ma il problema è che due parametri con varianza zero ma con mezzi diversi non dovrebbero essere eliminati. È stato allora che ho iniziato a cambiare la logica per includere un test per confrontare il test della media di 2 campioni.
Il mio problema è che sono molto alle prime armi con gli script e non so come richiamare un parametro dai risultati di una determinata piattaforma.
L'altro mio problema nei nostri dati è dove hai specificato tutti i parametri nello script, farne alcuni in questo modo potrebbe anche rivelarsi molto dispendioso in termini di tempo (forse c'è un modo abbastanza semplice).
Lo script di Brady in realtà è quasi perfetto, tranne per il fatto che devo aggiungere un test di 2 campioni per i mezzi e sapere come posso utilizzare il suo output come filtro aggiuntivo.
Grazie per l'aiuto.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroI test esatti possono richiedere molto tempo per essere calcolati e, dato che hai 250.000 righe nella tabella dati, scommetto che non verranno calcolati in questa situazione.Io consiglio, invece, di utilizzare il
Summarize YByX()
comando che calcola tutte le combinazioni Adatta Y per X e produce una tabella dati di valori p e valori LogWorth per ciascuna combinazione y/x.È quindi possibile determinare le colonne corrette per effettuare ulteriori indagini.Sarà necessario testare la varianza zero in un passaggio separato.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroBrady
L'ho testato su un set di dati di esempio (non ancora quello enorme) per comprendere il meccanismo. Sono stato in grado di modificarlo per mettere una soglia su st. dev. invece di chiedere 0. Il mio problema rimanente è che non voglio eliminare i dati nei casi in cui
stdev<=soglia (cioè vicino a 0) E la media dei dati (del parametro rispetto alla classe A e
sono diversi.
Quindi devo aggiungere un test per confrontare le medie rispetto ad A e B come ulteriore vincolo aggiuntivo.
Stavo pensando al test di Kolmogorov-Smirnov... in tal caso posso semplicemente affermare "elimina il parametro se KS <= soglia (praticamente vicino a 0)"
In effetti, quello che sto cercando di fare è deselezionare parametri diversi per il passaggio successivo. Quindi ho iniziato a pensare che forse la cosa migliore da fare è semplicemente applicare KS (non è necessario stdev).
La guida di JMP fornisce
Nomi predefiniti qui (1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Unidirezionale( Y( :Altezza ), X( :sesso ) );
obj << Test esatto di Kolmogorov Smirnov( 1 );
questo potrebbe essere tradotto nel mio caso come (all'interno del ciclo corrente)
obj=Unidirezionale( Y(:Colonna( dt1, colLista[i] ), X( Colonna( dt2, colLista[i] ) ) );
obj << Test esatto di Kolmogorov Smirnov( 1 );
ma non so come estrarre il valore KS da questo oggetto obj.
A proposito, non credo che il tempo della CPU per 2000 colonne mi disturberà poiché sono disposto a fare qualsiasi cosa per evitare qualsiasi tocco manuale sui dati.
grazie mille.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroJim,
grazie per la tua guida qui. Lo proverò. grazie ancora.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroHai capito bene, Brady.Unica cosa da sottolineare, con 250.000 righe, questa diventa una matrice di 2000 x 250.000.
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroE questo pezzo rispetto al precedente richiede un altro decimo di secondo... a causa dell'inversione della selezione rispetto alla doppia selezione. Guadagni maggiori su tavoli più grandi.
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));
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroComunque, ho testato un po' il mio codice e, sebbene eviti il loop esplicito, il che è positivo, la funzione << ottieni tutti i valori come matrice () è semplicemente troppo costosa quando la tabella diventa grande e i guadagni (se presenti) di vstd() rispetto alle operazioni da tavolo, sono troppo minuscoli per compensare questo.
Per un tavolo delle tue dimensioni, una modifica del codice di Jim (per consentire i tuoi gruppi) sarà più veloce. Fondamentale è il fatto che le operazioni sulle tabelle JMP sono davvero veloci. Non sono nemmeno convinto che le operazioni di matrice, che sono anche molto veloci, siano più veloci delle funzioni di colonna.
Sottoimpostare inizialmente le tabelle per creare due sottotabelle, una per ciascun gruppo, è più che ripagante (supponendo che tu abbia memoria sufficiente per ospitare tutte e 3 le tabelle), poiché prendere ripetutamente sottoinsiemi di righe è costoso.
Il codice seguente (di nuovo, una leggera modifica di quello di Jim, per consentire i tuoi due gruppi) è stato eseguito per me in circa 2,5 secondi per 100.000 righe e 1.000 colonne, mentre la routine che ho inviato per la prima volta ha richiesto più di 6 secondi.
Sembrerà comunque un po' lento su un tavolo della tua taglia... spero che qualcun altro abbia un'idea migliore.
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>
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroAltug,
Se ho capito bene il tuo problema:
- Hai una colonna (denominata Gruppo, ad esempio), con 2 valori ("A" e "B", ad esempio).
- Hai 2000 colonne con dati numerici.
- Desideri eliminare qualsiasi colonna in cui la deviazione std delle righe appartenenti al gruppo "A", OPPURE le righe appartenenti al gruppo "B" è al di sotto di una soglia (o entrambe).
Le prestazioni (e l'utilizzo della memoria) saranno un problema qui per una tabella delle tue dimensioni. Non sono sicuro che quanto segue funzionerà, o funzionerà rapidamente, su un tavolo delle dimensioni che hai, ma provalo.
Innanzitutto, crea una tabella in cui la colonna "a/b" è la prima colonna e le restanti colonne sono le colonne dei parametri di interesse.
Allora prova questo.<BR />
Saluti,
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)]]));
Ri: Big Data/Eliminazione automatica delle colonne a causa della varianza zeroEcco un semplice script di esempio che farà quello che vuoi.
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>