Big Data / Eliminación automática de columnas debido a la variación ceroHola
Estoy analizando un conjunto de datos muy grande, con un mínimo de alrededor de 2000 parámetros en columnas. Mis muestras tienen estos valores de parámetros para ~ 250k filas. Mi problema son las columnas, no las filas.
Tengo una clasificación discreta definida para todas las muestras, dos valores discretos, digamos clase A y B.
Estoy analizando los datos más a fondo en un software diferente que luego falla si detecta parámetros que tienen una variación cero (o muy cercana).
No quiero hacer este trabajo manualmente (como se puede imaginar a partir de 2000 columnas).
Estoy buscando una forma lo más automatizada posible de eliminar columnas que tienen una variación cero (o por debajo de un umbral muy pequeño definido) para la clase A o B. Sigo los pasos para completar el trabajo, pero no quiero seleccionar manualmente ninguna columna para realizar la eliminación.
Cualquier ayuda será apreciada. gracias de antemano.
Re: Big Data / Eliminación automática de columnas debido a variación ceroBrady,
A continuación se muestra el script, que es una ligera modificación del suyo y debería ser el punto de partida (con alguna modificación menor en stdev que se compara con un umbral). Como sabe, necesito un script real para seguir avanzando, ya que el script realizaría esta eliminación automáticamente. El código interno de la siguiente fase, después de la selección de datos de JMP, presenta un problema particular cuando se encuentra una variación cero. Su versión anterior (es decir, a continuación) demostró que se pueden eliminar.Sin embargo, estoy tratando de evitar eliminar parámetros con diferencias medias pero con variación cero.
No puedo utilizar un umbral que dependa de la media y distribución de los parámetros reales. p.ej No puedo especificar diferencias prácticas, ya que esto requiere un examen en profundidad de los 2000 parámetros, algo que no es factible. No estoy seguro de haberlo mencionado, pero el año 2000 es sólo la punta del iceberg, hay más por venir. Sin embargo, un único conjunto de datos contiene aproximadamente 2000 parámetros.
Puedo usar p_value para filtrar parámetros dentro o fuera dependiendo de cuáles causan una falla en nuestro código interno. Creo que desde ese punto de vista, la prueba t puede ser una mejor opción. Sin embargo, no sé cómo insertar la prueba t y extraer un valor p... así que puedo agregarlo como filtro adicional.
Siento que tengo dos opciones...
1) O usaré el siguiente código tal como está sin más comparación de medios de 2 muestras. Se eliminarían todos esos casos si incluso los medios fueran diferentes. Luego necesito registrar los nombres de las columnas de aquellas que se eliminaron (necesito ayuda con eso), para que al final del estudio general, pueda centrar mi atención en ellas y analizarlas en jmp para detectar la diferencia de medias, si corresponde. Este sería un conjunto mucho más pequeño de análisis de parámetros, en términos porcentuales, espero que los casos de varianza cero sean una porción mínima del conjunto de datos.
2) O mi segunda opción es agregar una prueba t o cualquier otra prueba que ofrezca un umbral normalizado para ajustar la población de diferencias significativas. P.ej. Puedo usar p_value para confirmar o rechazar la importancia.
Qué opinas ?
gracias
-------------------------------------------------- -------------------------------------------------- -------------
Nombres predeterminados aquí (1);
dt = tabla de datos actual();
dtcol1 = columna(dt, 1);
dt1 = dt << subconjunto(filas(dt< dt2 = dt << subconjunto(filas(dt<
// Obtener todas las columnas de datos continuas
colList = dt << obtener nombres de columnas (numérico, continuo);
// recorre todas las columnas y encuentra aquellas que no tienen variación
Para (i = N elementos (collista), i >= 1, i--,
If( (Col Std Dev( Columna( dt1, colList[i] ) ) ) >= 0.01 & Col Std Dev( Columna( dt2, colList[i] ) ) >= 0.01,
listacol = Eliminar( Listacol, i, 1 )
)
);
// Elimina las columnas sin variación
dt<
cerrar(dt1, nosguard);
cerrar(dt2, nosguard);
nota: los umbrales en stdevs no están establecidos. 0,01 es sólo un ejemplo. Afinaré eso.
Re: Big Data / Eliminación automática de columnas debido a variación cero<>
Además, hay algo que me gustaría aclarar: tienes ~250.000 filas de datos en dos grupos, que supongo (de forma predeterminada) son aproximadamente del mismo tamaño. Si es así, una prueba t con 125.000 muestras en cada grupo tiene un poder = 0,9 para detectar una diferencia de menos de 1/50 de sigma. Dado que solo está llegando a este punto (medias de prueba) cuando uno o ambos niveles de sigma son muy bajos, ¿cree que una diferencia tan pequeña (en relación con sigma) es de importancia práctica? Es decir, si tuviera 2 procesos con sigma aproximadamente = 1 unidad, ¿le importaría una diferencia en las medias de 0,018 unidades? Así de sensible será la prueba t cuando haya 125.000 elementos en cada grupo.
Si en su entorno una diferencia tan pequeña no es importante, sería mejor que realizara una prueba de equivalencia (que en su forma más simple es 2 pruebas t unilaterales, simultáneas), que le permite especificar qué tan grande es la diferencia. ES significativo. Las medias que difieren en menos de esta cantidad se consideran prácticamente equivalentes. Con este enfoque, se eliminaría una columna determinada siempre que las medias sean prácticamente equivalentes y al menos una de las desviaciones estándar del grupo esté por debajo del umbral.
Aquí hay alguna información y un ejemplo:
http://www.jmp.com/support/help/Equivalence_Test.shtml
Re: Big Data / Eliminación automática de columnas debido a variación cerogracias Duane.
Estoy tratando de determinar dentro del script a través de resultados y comparaciones específicas si el parámetro es diferente a las clases A y B. No pretendo analizar una tabla intermedia de resultados para luego tomar la decisión.
Tengo 2000 columnas de parámetros en un conjunto de datos determinado y muchos conjuntos de datos de tamaño comparable.
El procedimiento necesita eliminar automáticamente las columnas relacionadas que se encuentran casi iguales entre las dos clases A y B, para un parámetro determinado.
Inicialmente escribí esto como lógica de búsqueda de varianza cero, pero el problema es que dos parámetros con varianza cero pero con medios diferentes no deben eliminarse. Fue entonces cuando comencé a cambiar la lógica para incluir una prueba para comparar la prueba de media de 2 muestras.
Mi problema es que soy muy novato en secuencias de comandos y no sé cómo llamar un parámetro a partir de los resultados de una plataforma determinada.
Mi otro problema con nuestros datos es dónde especificó todos los parámetros en el script; hacer algunos como este incluso podría llevar mucho tiempo (tal vez haya una manera bastante fácil).
El script de Brady en realidad es casi perfecto, excepto que necesito agregar una prueba de medias de 2 muestras y saber cómo puedo usar su salida como filtro adicional.
Gracias por tu ayuda.
Re: Big Data / Eliminación automática de columnas debido a variación ceroLas pruebas exactas pueden tardar mucho en calcularse y, dado que tiene 250.000 filas en su tabla de datos, apuesto a que no se calcularán en esta situación.Recomiendo, en cambio, utilizar el
Summarize YByX()
comando que calcula todas las combinaciones Ajustar Y por X y produce una tabla de datos de valores p y valores LogWorth para cada combinación y/x.Luego podrá determinar las columnas correctas para investigar más a fondo.Deberá probar la varianza cero en un paso separado.
Re: Big Data / Eliminación automática de columnas debido a variación ceroBrady
Probé esto en un conjunto de datos de muestra (aún no en el enorme) para comprender el mecanismo. Pude modificarlo para poner un umbral en st. desarrollador en lugar de pedir 0. Mi problema restante es que no quiero eliminar datos en los casos en que
stdev<=umbral (es decir, cerca de 0) Y la media de los datos (del parámetro relacionado con las clases A y
son diferentes.
Por lo tanto, necesito agregar una prueba para comparar las medias con A y B como una restricción adicional adicional.
Estaba pensando en la prueba de Kolmogorov-Smirnov... en cuyo caso puedo simplemente decir "eliminar el parámetro si KS <= umbral (prácticamente cerca de 0)"
De hecho, lo que intento hacer es seleccionar parámetros que sean diferentes para el siguiente paso. Entonces comencé a pensar que tal vez lo mejor que podía hacer era simplemente aplicar KS (no es necesario stdev).
La ayuda de JMP proporciona
Nombres predeterminados aquí (1);
dt = Abrir( "$SAMPLE_DATA/Big Class.jmp" );
obj = Unidireccional( Y( :Altura ), X( :sexo ) );
obj << Prueba exacta de Kolmogorov Smirnov( 1 );
¿Podría traducirse esto a mi caso como (dentro del bucle actual)?
obj=Oneway( Y(:Columna( dt1, colList[i] ), X( Columna( dt2, colList[i] ) ) );
obj << Prueba exacta de Kolmogorov Smirnov( 1 );
pero no sé cómo extraer el valor KS de este objeto obj.
Por cierto, no creo que el tiempo de CPU para 2000 columnas me vaya a molestar, ya que estoy dispuesto a hacer cualquier cosa para evitar cualquier toque manual en los datos.
Muchas gracias.
Re: Big Data / Eliminación automática de columnas debido a variación ceroJim,
gracias por tu orientación aquí. Lo intentaré. Gracias de nuevo.
Re: Big Data / Eliminación automática de columnas debido a variación ceroTu comprensión es correcta, Brady.Lo único que hay que destacar es que con 250.000 filas, esto se convierte en una matriz de 2000 x 250.000.
Re: Big Data / Eliminación automática de columnas debido a variación ceroY este fragmento frente al anterior resta otra décima de segundo... debido a la inversión de selección frente a la selección doble. Mayores ganancias en mesas más grandes.
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));
Re: Big Data / Eliminación automática de columnas debido a variación ceroAltug, he probado un poco mi código y, aunque evita los bucles explícitos, lo cual es bueno, la función << obtener todos los valores como matriz () es simplemente demasiado costosa cuando la tabla se hace grande y las ganancias (si las hay) de vstd() vs. operaciones de mesa, son demasiado minúsculos para compensar esto.
Para una tabla de su tamaño, una modificación del código de Jim (para permitir sus grupos) será más rápida. Para esto es fundamental el hecho de que las operaciones de la tabla JMP son realmente rápidas. Ni siquiera estoy convencido de que las operaciones matriciales, que también son muy rápidas, sean más rápidas que las funciones de columna.
Subconjunto de las tablas inicialmente para crear dos subtablas, una para cada grupo, se amortiza con creces (suponiendo que tenga suficiente memoria para albergar las 3 tablas), ya que tomar subconjuntos de filas una y otra vez es costoso.
El siguiente código (de nuevo, una ligera modificación del de Jim, para permitir sus dos grupos) se ejecutó en aproximadamente 2,5 segundos para 100.000 filas y 1.000 columnas, mientras que la rutina que envié por primera vez tardó más de 6 segundos.
Esto todavía parecerá un poco lento en una mesa de tu tamaño... con suerte, alguien más tendrá una idea mejor.
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>
Re: Big Data / Eliminación automática de columnas debido a variación ceroAltug,
Si entiendo su problema correctamente:
- Tienes una columna, (llamada Grupo, por ejemplo), con 2 valores ("A" y "B", por ejemplo).
- Tienes 2000 columnas con datos numéricos.
- Desea eliminar cualquier columna donde la desviación estándar de las filas que pertenecen al grupo "A", O las filas que pertenecen al grupo "B", esté por debajo de algún umbral (o ambos).
El rendimiento (y el uso de la memoria) será un problema aquí para una tabla de su tamaño. No estoy seguro de si lo siguiente funcionará o funcionará rápidamente en una mesa del tamaño que usted tiene, pero pruébelo.
Primero, cree una tabla donde la columna "a/b" sea la primera columna y las columnas restantes sean las columnas de parámetros de interés.
Entonces prueba esto.<BR />
Salud,
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)]]));
Re: Big Data / Eliminación automática de columnas debido a variación ceroAquí hay un script de ejemplo simple que hará lo que desee.
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>