Big Data / Élimination automatique des colonnes en raison d'une variance nulleBonjour
J'analyse un très grand ensemble de données, au minimum environ 2000 paramètres en colonnes. Mes échantillons ont ces valeurs de paramètres pour environ 250 000 lignes. Mon problème concerne les colonnes, par opposition aux lignes.
J'ai une classification discrète définie pour tous les échantillons, deux valeurs discrètes, disons classe A et B.
J'analyse plus en détail les données dans un autre logiciel qui échoue ensuite s'il détecte des paramètres qui ont une variance nulle (ou très proche).
Je ne veux pas faire ce travail manuellement (comme vous pouvez l'imaginer à partir de 2000 colonnes).
Je recherche un moyen aussi automatisé que possible de supprimer des colonnes qui ont une variance nulle (ou inférieure à un très petit seuil défini) pour la classe A ou B. Je passe par les étapes pour terminer le travail, mais je ne veux pas sélectionner manuellement une colonne pour effectuer la suppression.
Toute aide serait appréciée. Merci d'avance.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleBrady,
Le script ci-dessous est une légère modification du vôtre et devrait être le point de départ. (avec quelques modifications mineures sur stdev comparées à un seuil). Comme vous le savez, j'ai besoin d'un véritable script pour progresser car cette suppression serait effectuée automatiquement par le script. Le code interne de la phase suivante – après la sélection des données JMP – rencontre particulièrement un problème lorsqu'un écart nul est rencontré. Votre version précédente (c'est-à-dire ci-dessous) prouvait que ceux-ci pouvaient être supprimés.J'essaie cependant d'éviter de supprimer des paramètres avec des différences moyennes mais avec une variance nulle.
Je ne peux pas utiliser un seuil qui dépend de la moyenne et de la distribution réelles des paramètres. par exemple Je ne peux pas préciser de différence pratique, car cela nécessite un examen approfondi de l’ensemble des 2 000 paramètres, ce qui n’est pas réalisable. Je ne sais pas si je l'ai mentionné, mais 2000 n'est que la pointe de l'iceberg, d'autres à venir. Cependant, un seul ensemble de données contient environ 2 000 paramètres.
Je peux utiliser p_value pour filtrer les paramètres entrants ou sortants en fonction de ceux qui provoquent un échec dans notre code interne. Je pense que de ce point de vue, le test t pourrait être une meilleure option. Cependant, je ne sais pas comment insérer le test t et extraire une p_value.... donc je peux l'ajouter comme filtre supplémentaire.
J'ai l'impression que j'ai deux options...
1) Soit j'utiliserai le code ci-dessous tel quel, sans autre comparaison de moyens à 2 échantillons. Cela supprimerait tous ces cas même si les moyens sont différents. Je dois ensuite enregistrer les noms de colonnes de celles qui ont été supprimées (besoin d'aide pour cela), afin qu'à la fin de l'étude globale, je puisse porter mon attention sur elles et les analyser dans jmp pour détecter la différence de moyenne le cas échéant. Il s'agirait d'un ensemble beaucoup plus restreint d'analyses de paramètres, en pourcentage, je m'attends à ce que les cas à variance nulle représentent une partie très minime de l'ensemble de données.
2) Ou ma deuxième option consiste à ajouter un test t ou tout autre test offrant un seuil normalisé pour affiner la population de différences significatives. Par exemple. Je peux utiliser p_value pour confirmer ou rejeter la signification.
Qu'en penses-tu ?
merci
-------------------------------------------------- -------------------------------------------------- -------------
Noms par défaut ici ( 1 );
dt = table de données actuelle ();
dtcol1 = colonne (dt, 1);
dt1 = dt << subset(rows(dt< dt2 = dt << subset(rows(dt<
// Récupère toutes les colonnes de données continues
colList = dt << obtenir les noms de colonnes (numérique, continu) ;
// Boucle sur toutes les colonnes et trouve celles sans variance
Pour (i = N éléments (collist), i >= 1, i--,
Si( (Col Std Dev( Column( dt1, colList[i] ) ) ) >= 0,01 & Col Std Dev( Column( dt2, colList[i] ) ) >= 0,01,
colListe = Supprimer( colListe, je, 1 )
)
);
// Supprime les colonnes sans écart
dt<
fermer (dt1, nosave);
fermer (dt2, nosave);
note : les seuils sur les stdevs ne sont pas réglés. 0,01 n'est qu'un exemple. Je vais affiner cela.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulle<>
Cependant, il y a quelque chose que j'aimerais clarifier : vous avez environ 250 000 lignes de données réparties en deux groupes, qui, je suppose (par défaut), sont à peu près de la même taille. Si tel est le cas, un test t avec 125 000 échantillons dans chaque groupe a une puissance = 0,9 pour détecter une différence inférieure à 1/50ème sigma. Étant donné que vous n'arrivez à ce point (moyens de test) que lorsque l'un ou les deux niveaux de sigma sont très faibles, une différence si petite (par rapport au sigma) est-elle, selon vous, d'une importance pratique ? Autrement dit, si vous aviez 2 processus avec sigma = 1 unité, une différence de moyenne de 0,018 unité serait-elle importante pour vous ? C'est à quel point le test t sera sensible lorsqu'il y aura 125 000 éléments dans chaque groupe.
Si dans votre environnement, une si petite différence n'est pas importante, vous seriez mieux servi par un test d'équivalence (qui est dans sa forme la plus simple 2 tests t simultanés unilatéraux), qui vous permet de spécifier l'ampleur d'une différence. EST significatif. Les moyennes qui diffèrent de moins de ce montant sont considérées comme pratiquement équivalentes. En utilisant cette approche, une colonne donnée serait supprimée tant que les moyennes sont pratiquement équivalentes et qu'au moins un des écarts types du groupe est inférieur au seuil.
Voici quelques informations et un exemple :
http://www.jmp.com/support/help/Equivalence_Test.shtml
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nullemerci Duane.
J'essaie de déterminer dans le script via des sorties et des comparaisons spécifiques si le paramètre est différent des classes A et B. Je ne cherche pas à analyser un tableau intermédiaire de résultats pour ensuite prendre la décision.
J'ai 2000 colonnes de paramètres dans un ensemble de données donné et de nombreux ensembles de données de taille comparable.
La procédure doit supprimer automatiquement les colonnes associées trouvées comme étant presque identiques entre les deux classes A et B, pour un paramètre donné.
J'ai initialement écrit cela comme une logique de recherche de variance nulle, mais le problème est que deux paramètres avec variance nulle mais avec des moyens différents ne doivent pas être supprimés. C'est à ce moment-là que j'ai commencé à changer la logique pour inclure un test permettant de comparer le test de moyenne à 2 échantillons.
Mon problème est que je suis très novice en matière de script et que je ne sais pas comment appeler un paramètre à partir des résultats d'une plateforme donnée.
Mon autre problème dans nos données est l'endroit où vous avez spécifié tous les paramètres dans le script, en faire de ce genre pourrait même s'avérer très long (il existe peut-être un moyen assez simple).
Le script de Brady est en fait presque parfait, sauf que je dois ajouter un test de moyenne à 2 échantillons et savoir comment utiliser sa sortie comme filtre supplémentaire.
Merci pour votre aide.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleLes tests exacts peuvent prendre beaucoup de temps à calculer, et étant donné que votre table de données contient 250 000 lignes, je parierais qu'ils ne seront pas calculés dans cette situation.Je recommande plutôt d'utiliser le
Summarize YByX()
commande qui calcule toutes les combinaisons Fit Y By X et produit un tableau de données de valeurs p et de valeurs LogWorth pour chaque combinaison y/x.Vous pouvez ensuite déterminer les colonnes correctes pour approfondir vos recherches.Vous devrez tester la variance nulle dans une étape distincte.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleBrady
J'ai testé cela sur un exemple d'ensemble de données (pas encore énorme) pour comprendre le mécanisme. J'ai pu le modifier pour mettre un seuil sur st. dév. plutôt que de demander 0. Mon problème restant est que je ne souhaite pas supprimer de données dans les cas où
stdev<=threshold (c'est-à-dire proche de 0) ET la moyenne des données (du paramètre par rapport aux classes A et
sont différentes.
Par conséquent, je dois ajouter un test pour comparer les moyennes par rapport à A et B comme contrainte supplémentaire supplémentaire.
Je pensais au test de Kolmogorov-Smirnov...auquel cas je peux simplement indiquer "supprimer le paramètre si KS <= seuil (pratiquement proche de 0)"
En fait, ce que j'essaie de faire est de sous-sélectionner les paramètres différents pour l'étape suivante. J'ai donc commencé à penser que la meilleure chose à faire était peut-être simplement d'appliquer KS (pas besoin de stdev).
L'aide de JMP fournit
Noms par défaut ici ( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
obj = Oneway( Y( :Hauteur ), X( :sexe ) );
obj << Test exact de Kolmogorov Smirnov( 1 );
cela pourrait-il être traduit dans mon cas par (dans la boucle actuelle)
obj=Oneway( Y(:Column( dt1, colList[i] ), X( Column( dt2, colList[i] ) ) );
obj << Test exact de Kolmogorov Smirnov( 1 );
mais je ne sais pas comment extraire la valeur KS de cet objet obj.
D'ailleurs, je ne pense pas que le temps CPU pour 2000 colonnes va me déranger car je suis prêt à tout faire pour éviter toute manipulation manuelle des données.
Merci beaucoup.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleJim,
merci pour vos conseils ici. Je vais l'essayer. merci encore.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleVotre compréhension est correcte Brady.Seule chose à souligner, avec 250 000 lignes, cela devient une matrice de 2 000 x 250 000.
Re : Big Data / Élimination automatique des colonnes en raison d'une variance nulleEt ce morceau par rapport au précédent prend encore un dixième de seconde... en raison de l'inversion de sélection par rapport à la double sélection. Des gains plus importants sur des tables plus 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 / Élimination automatique des colonnes en raison d'une variance nulleSinon, j'ai un peu testé mon code, et bien qu'il évite les boucles explicites, ce qui est bien, la fonction << obtenir toutes les valeurs sous forme de matrice () est tout simplement trop chère lorsque la table devient grande, et les gains (le cas échéant) de vstd() par rapport aux opérations de table, sont trop minuscules pour compenser cela.
Pour un tableau de votre taille, une modification du code de Jim (pour tenir compte de vos groupes) sera plus rapide. Le fait que les opérations sur les tables JMP soient très rapides est essentiel. Je ne suis même pas convaincu que les opérations matricielles, qui sont également très rapides, soient plus rapides que les fonctions colonnes.
Sous-définir initialement les tables pour créer deux sous-tables - une pour chaque groupe - est plus que rentable (en supposant que vous disposez de suffisamment de mémoire pour héberger les 3 tables), car prendre des sous-ensembles de lignes encore et encore coûte cher.
Le code ci-dessous (encore une fois, une légère modification de celui de Jim, pour tenir compte de vos deux groupes) s'est exécuté pour moi en 2,5 secondes environ pour 100 000 lignes et 1 000 colonnes, alors que la routine que j'ai soumise pour la première fois prenait plus de 6 secondes.
Cela semblera encore un peu lent sur une table de votre taille... j'espère que quelqu'un d'autre aura une meilleure idée.
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 / Élimination automatique des colonnes en raison d'une variance nulleAltug,
Si je comprends bien ton problème :
- Vous disposez d'une colonne (nommée Groupe par exemple) avec 2 valeurs ("A" et "B" par exemple).
- Vous disposez de 2000 colonnes avec des données numériques.
- Vous souhaitez supprimer toute colonne où l'écart type des lignes appartenant au groupe "A", OU des lignes appartenant au groupe "B" est inférieur à un certain seuil (ou les deux.)
Les performances (et l'utilisation de la mémoire) seront ici un problème pour une table de votre taille. Je ne sais pas si ce qui suit fonctionnera, ou fonctionnera rapidement, sur une table de la taille que vous avez, mais essayez-le.
Tout d’abord, créez un tableau dans lequel la colonne « a/b » est la première colonne et les colonnes restantes sont les colonnes de paramètres qui vous intéressent.
Alors essayez ceci.<BR />
Acclamations,
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 / Élimination automatique des colonnes en raison d'une variance nulleVoici un exemple de script simple qui fera ce que vous voulez.
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>