Sélection aléatoire de sous-ensembles pour une distribution donnéeBonjour ...
J'essaie de sélectionner au hasard dans une colonne de données pour une distribution normale donnée. La distribution donnée est différente de celle des données.
Existe-t-il un moyen simple d'accomplir cela avec les options actuelles de Table Subset ? Je ne voyais rien qui puisse m'aider.
J'ai également essayé une formule, essentiellement NormalDensity (X, mu, sigma) pour tracer les densités des "données" par rapport à la distribution donnée.
Mais je ne sais toujours pas comment dire uniformément et sélectionner au hasard dans cette formule pour que mon résultat soit aussi proche que possible de la distribution donnée.
Merci. Appréciez le soutien.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe recommanderais également le cours gratuit Statistical Thinking for Industrial Problem Solving ( https://www.jmp.com/en_us/online-statistics-course.html ). Bien que vous n'ayez pas besoin de connaître les statistiques, les démonstrations montrent comment effectuer des analyses courantes dans JMP. Je pense que ces démonstrations peuvent vous montrer à quel point JMP peut réussir dans un cours de statistiques, ainsi que certaines techniques de base de manipulation de données et de représentation graphique.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe vous recommande de passer du temps sur le site Web de JMP. Il y a un élément de menu en haut de la page d'accueil, Apprendre JMP , grâce auquel vous pouvez accéder à l'une des nombreuses ressources que nous avons créées pour vous aider à apprendre à utiliser JMP. Un autre domaine d'apprentissage est la Sommet Découverte place dans le Événements menu. Par exemple, la présentation liminaire de John Sall au cours des dernières années vous donnera un aperçu.
Vous enseignez un cours de statistiques? Il y a plusieurs sections qui sont consacrées aux instructeurs. Une partie du matériel pourrait être déchargée en tant que devoirs pour vos élèves.
Je suis d'accord avec vous qu'à la version 15, JMP est complexe et sophistiqué. Certaines de ses meilleures caractéristiques ne sont pas évidentes. Beaucoup d'apprentissage et d'adoption d'un nouvel outil est votre état d'esprit. Par exemple, j'enseigne JMP et de nombreux nouveaux utilisateurs voient un tableau de données JMP et pensent : "C'est juste une autre feuille de calcul". C'est à ce point de départ que commence la frustration. (Je ne dis pas que c'était votre première impression, mais c'est courant. BI pense que vous appréciez la différence entre l'analyse statistique et l'analyse de feuille de calcul parce que vous utilisez MINITAB.) Les ressources que j'ai mentionnées ci-dessus sont destinées à révéler l'état d'esprit de JMP afin qu'il ait du sens et que vous puissiez rapidement anticiper comment JMP vous aidera à résoudre un nouveau problème.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe le sais, mais une recherche de ce que je cherchais m'a amené à cette réponse.J'essaie de déterminer si le passage à JMP pour un cours de statistiques a du sens.Il devient clair que JMP n'est pas intuitif et difficile pour les choses simples.Même la réponse que vous avez donnée à un simple échantillon n'est ni simple ni intuitive.
Mon point de vue sur JMP jusqu'à présent est que la courbe d'apprentissage est élevée, mais qu'elle en vaut probablement la peine si vous effectuez une modélisation statistique ou une conception d'expériences plus complexes.Cependant, je ne sais pas si JMP présente des avantages par rapport à d'autres produits tels que R ou SPSS. JMP est comme beaucoup de produits de nos jours, conçus par des experts ou des programmeurs informatiques pour être utilisés par des experts ou des programmeurs informatiques tout en restant relativement inaccessibles à ceux qui ne sont pas dans ces domaines. Très peu de produits font un travail décent en considérant et en répondant à une large base d'utilisateurs.
Peut-être que mon opinion changera, car je n'ai pas encore abandonné JMP, mais jusqu'à présent, cela me fait apprécier l'interface simple de Minitab.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeLa demande initiale ici n'était pas pour un simple échantillonnage aléatoire d'une autre colonne.
Si c'est tout ce dont vous avez besoin, vous pouvez utiliser le Fonction Col Shuffle() pour générer une nouvelle colonne avec une sélection aléatoire à partir d'une autre.

Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeVous vous moquez de moi.Obtenir un échantillon aléatoire d'une autre colonne et vous l'afficher dans une colonne distincte est une sélection de menu dans Minitab.La réponse à cela a pris deux pages de discussion et des dizaines de lignes de code.Pourquoi les choses simples sont-elles si difficiles dans JMP ?
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJef
Votre modification sur la solution originale de Ian a parfaitement fonctionné. Je peux maintenant extraire des données aléatoires avec une distribution prescrite. Ce serait bien de voir cela comme une option sous Table Subsetting ...
Mon problème est résolu à 100%.
Merci pour votre aide.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeL'approche qui @ian_jmp trouvé était la première chose que j'ai essayée, mais je l'ai abandonné trop tôt apparemment car Ian a trouvé un moyen de surmonter certaines lacunes que j'ai rencontrées. Bon travail.
Quant à l'élimination du rééchantillonnage des lignes, je crois que Ian suggérait d'ajouter la ligne :
bv[Loc Min( dist )] = .;
à la boucle for(). Ainsi :
Names Default To Here( 1 );
// Make a big table
dt1 = New Table( "Big",
New Column( "Values", Numeric, Continuous, Formula( Random Uniform( -3, 3 ) ) ),
New Column("Row", Formula(Row()))
);
dt1 << addRows( 40000 );
dt1 << runFormulas;
Column( dt1, "Values" ) << deleteFormula;
// Make a small table
dt2 = New Table( "Small",
New Column( "Values", Numeric, Continuous, Formula( Random Normal( 0, 1 ) ) )
);
dt2 << addRows( 40 );
dt2 << runFormulas;
Column( dt2, "Values" ) << deleteFormula;
// For each value in dt2, find a value in dt1 that's closest
bv = Column( dt1, "Values" ) << getValues;
sv = Column( dt2, "Values" ) << getValues;
selectedRows = J( N Row( sv ), 1, . );
For( i = 1, i <= N Row( sv ), i++,
dist = (bv - sv[i]) ^ 2;
selectedRows[i] = Loc Min( dist );
//the line below prevents rows from the "Big" table from being re-sampled
bv[Loc Min( dist )] = .;
);
// Subset dt1
dt3 = dt1 << subset( rows( selectedRows ), LinkToOriginalDataTable( 1 ) );
// Look at the distributions
New Window( "Compare Distributions",
H List Box(
dt1 << Distribution( Continuous Distribution( Column( :Values ) ) ),
dt2 << Distribution( Continuous Distribution( Column( :Values ) ) ),
dt3 << Distribution( Continuous Distribution( Column( :Values ) ) )
)
);
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe suis désolé - je n'aurai pas accès à un ordinateur pendant quelques jours en raison de vacances. Mais je suis sûr que quelqu'un d'autre peut le faire. . .
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeIan
Je visais à obtenir ~ 46K de données de sous-échantillons, dont 44K étaient des doublons.
Pourriez-vous m'écrire cette ligne pour "bv" pour votre suggestion ?
merci encore.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeOui, je me suis posé la question. En ce moment, c'est le cas, mais si vous ne voulez pas de doublons, ajoutez simplement une ligne supplémentaire qui définit l'élément du vecteur 'bv' qui a été trouvé comme manquant '.'.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeIan,
J'ai oublié de poser une question. Votre sélection est-elle effectuée uniquement à partir de la table d'origine ou cela risque-t-il d'avoir des sélections en double dans la sous-table ?
Merci
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeIan,
C'est génial. J'ai en quelque sorte pensé à une approche similaire, mais je n'ai pas pu le faire en raison de mes connaissances de base en script.
J'ai pu l'adapter à mes données et j'obtiens ce que je veux. Je pourrais peut-être étendre cela à la sélection de distribution à 2 paramètres, ce que je devrais pouvoir faire à partir de votre script.
Merci pour votre aide.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJeff,
Merci pour votre effort.
Votre suggestion a eu une petite chance. Je l'ai appliqué à mes données et malheureusement comme la sélection est aléatoire, cela n'a pas fonctionné. Je l'ai exécuté pendant environ 3000 itérations et je l'ai arrêté après 10 heures. Le mouvement sur la moyenne des données était insignifiant.
Ce n'est pas une technique simple (sauf si vous vous appelez Ian) .. J'imagine qu'une sorte d'optimiseur est impliqué essayant de tirer au hasard dans la direction où cela a plus de sens. Les GA sont peut-être exagérés, mais peuvent certainement faire ce genre d'optimisation.
D'un point de vue statistique, c'est parfaitement correct pour ce que je fais. Le 400+K représente un grand nombre d'actifs. J'essaie de trouver des actifs similaires à un sous-groupe faisant l'objet d'une enquête.
Merci encore.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeSi " En fin de compte, je dois sous-sélectionner parmi plus de 400 000 lignes un certain nombre de sous-échantillons afin que la distribution du sous-échantillon sélectionné soit aussi proche que possible de la distribution donnée. " est ce que vous voulez, peut-être pourriez-vous utiliser ce type d'approche, ou quelque chose de proche ?
NamesDefaultToHere(1);
// Make a big table
dt1 = NewTable("Big", NewColumn("Values", Numeric, Continuous, Formula(RandomUniform(-3,3))));
dt1 << addRows(40000);
dt1 << runFormulas;
Column(dt1, "Values") << deleteFormula;
// Make a small table
dt2 = NewTable("Small", NewColumn("Values", Numeric, Continuous, Formula(RandomNormal(0,1))));
dt2 << addRows(40);
dt2 << runFormulas;
Column(dt2, "Values") << deleteFormula;
// For each value in dt2, find a value in dt1 that's closest
bv = Column(dt1, "Values") << getValues;
sv = Column(dt2, "Values") << getValues;
selectedRows = J(NRow(sv), 1, .);
for(i=1, i<=NRow(sv), i++,
dist = (bv - sv[i])^2;
selectedRows[i] = LocMin(dist);
);
// Subset dt1
dt3 = dt1 << subset(rows(selectedRows), LinkToOriginalDataTable(1));
// Look at the distributions
NewWindow("Compare Distributions",
HListBox(
dt1 << Distribution( Continuous Distribution( Column( :Values ) ) ),
dt2 << Distribution( Continuous Distribution( Column( :Values ) ) ),
dt3 << Distribution( Continuous Distribution( Column( :Values ) ) )
)
);
Re : Sélection aléatoire de sous-ensembles pour une distribution donnée
Selon votre objectif, obtenir un sous-ensemble comme celui-ci peut être statistiquement discutable, mais une façon de le faire est de le forcer brutalement en utilisant Resample Freq() pour générer des échantillons aléatoires, puis en vérifiant cet échantillon pour voir s'il répond aux caractéristiques souhaitées. Voici un prototype qui génère une table pour simuler vos données d'origine, puis les rééchantillonne, utilise la plate-forme de distribution pour tester l'échantillon.
dt = New Table( "original",
Add Rows( 1000 ),
//:parameter will have a random normal distribution with mean=0
//and a stddev=1
New Column( "parameter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Random Normal() )
),
New Column( "Row", Numeric, "Continuous", Format( "Best", 12 ), Formula( Row() ) ),
//The Resample Freq() function generates a frequence count for sample with replacement
//the .05 argument is the sample rate, i.e. we want a sample size of 5% of the original table
New Column( "Resample Freq",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( Resample Freq( 0.05 ) ),
)
);
//Generate a distribution of :parameter using the resample frequency as a Freq column to get
//Automatic Recalc will cause the Distribution to rerun when the Resample Freq column is re-evaluated
//to get a new sample
New Window( "Dist comparison",
H List Box(
dt << Distribution( Continuous Distribution( Column( :parameter ) ) ),
dist = dt << Distribution(
Automatic Recalc( 1 ),
Freq( :Resample Freq ),
Continuous Distribution( Column( :parameter ) )
)
)
);
//set the minimum mean value we will accept for the subsample
target_mean_min = .249;
//set the minimum mean value we will accept for the subsample
target_mean_max = .251;
//how many iterations are we willing to try before giving up?
max_iter = 1000;
iter = 1;
While(
//Report( dist )[Number Col Box( 2 )][1] is the mean value from the Distribution report
!(target_mean_min <= Report( dist )[Number Col Box( 2 )][1] <= target_mean_max) &
iter <= max_iter,
//get a new sample
Column( "Resample Freq" ) << eval formula;
iter++;
);
If(
//check to see if we exited because we hit max_iter or got a good sample
iter > max_iter & !(target_mean_min <= Report( dist )[Number Col Box( 2 )][1] <=
target_mean_max)
,
Print( "No result in " || Char( max_iter ) || " random samples." ),
//got a good sample so get the subset
dt << select where( :resample freq != 0 );
dt << Subset( Selected Rows( 1 ), Selected columns only( 0 ) );
);
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe suis juste libre de penser ici, mais peut-être que vous pourriez essayer, c'est de déterminer la forme de distribution, en utilisant la plate-forme de distribution, puis de transformer les données en une distribution normale.Ensuite, faites la sortie des niveaux, puis le sous-ensemble avec stratification.Juste une pensée.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJim, merci pour votre suggestion.
Mais votre proposition n'a pas de moyen de forcer la sélection en fonction de la distribution donnée. Il ne produirait donc pas ce que je recherche. Pour valider, j'ai suivi les étapes et cela a produit une distribution très similaire à celle d'origine.
Peut-être que je n'explique pas de manière claire.
J'ai plus de 400k lignes XN colonnes de données (énorme matrice). Si j'appelle l'un des paramètres N, comme "X" pour l'argument.
La distribution de X à partir de ces données - appelez-la X.dist1.
J'ai un deuxième jeu de données qui a Xagain, et cette fois avec X.dist2
X.dist1 n'est pas trop loin mais est différent de X.dist2.
Étant donné que j'ai beaucoup de données dans le premier ensemble de données (400k +), j'essaie donc de sous-sélectionner l'ensemble de données à partir de 1 afin que la distribution X des données sélectionnées soit la plus proche possible de X.dist2.
Par conséquent, je cherchais une certaine capacité sous Table - Sous-ensemble où je peux spécifier la caractéristique de distribution normale OU en utilisant une formule, puis en utilisant Table-sous-ensemble.
pour la formule, j'ai mis les densités de dataset1 contre mon X.dist2 souhaité.
Mais maintenant, j'ai besoin d'un moyen aléatoire uniforme d'échantillonnage à partir des sorties de formules afin de forcer la distribution des résultats à être ~ X.dist2
OU de toute autre manière...
Si je dois utiliser un sous-ensemble de table, la solution doit spécifier une distribution normale à partir d'un paramètre à extraire.
Ou sinon, j'ai besoin de trouver une sélection aléatoire uniforme à partir d'un paramètre (approche par formule).
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe crois que vous pouvez obtenir ce que vous voulez en suivant un processus simple en 2 étapes.
1. Ouvrez la plate-forme de distribution pour la colonne que vous avez en question.Alors
Enregistrer ==> Numéros de niveau.
Cela créera une nouvelle colonne avec une distribution tirée directement des données réelles
2. Créez un sous-ensemble de données et spécifiez
Aléatoire - taux d'échantillonnage :
et aussi
Stratifier, en fonction de la nouvelle colonne Niveau créée à l'étape ci-dessus
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeMon véritable objectif est de comparer N (autres) paramètres à partir de deux jeux de données déjà disponibles, je n'essaie pas de créer une distribution fictive. (Peut-être que je comprends mal votre proposition).
La distribution donnée est une contrainte sur un paramètre important qui peut en influencer d'autres. J'essaie de sélectionner des actifs avec une distribution similaire de "données" à une distribution donnée afin de minimiser l'impact de ce paramètre influent. Dans ce contexte, la "distribution" ne s'applique qu'à un seul paramètre, et non multiple.
Donc, en fin de compte, je dois sous-sélectionner à partir de 400K + lignes un certain nombre de sous-échantillons afin que la distribution du sous-échantillon sélectionné soit aussi proche que possible de la distribution donnée.Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeJe vois... Je n'ai pas bien compris votre message d'origine. Votre droit, ma suggestion renverra simplement une distribution avec des paramètres très similaires à la distribution d'origine. Si vous voulez des observations d'une variable aléatoire avec les estimations de paramètre souhaitées, pourquoi ne pouvez-vous pas simplement créer une colonne avec ces paramètres et passer à autre chose. Bien sûr, les observations spécifiques ne résideront pas nécessairement dans la colonne d'origine, mais cela peut ou non influencer ce que vous essayez de réaliser analytiquement ou pratiquement ? Ce seront au moins des observations plausibles, mais pas des correspondances exactes.
Re : Sélection aléatoire de sous-ensembles pour une distribution donnéePeter .. merci pour votre suggestion.
mais cela ne semble pas fonctionner.
La moyenne/stdev de mes données d'origine sont : 12816 et 1726 à partir d'un très grand échantillon (400K +).
J'essaie de sous-sélectionner un sous-échantillon plus proche de 14300 et 2050
J'ai essayé votre suggestion sur la formule (c'est-à-dire les densités des données par rapport à 14300, 2050) et à moins que je ne puisse forcer cette distribution aléatoire à être sélectionnée uniformément parmi les densités, je ne pense pas pouvoir obtenir ce dont j'ai besoin. En fait, le sous-échantillonnage est sorti comme prévu avec la distribution d'origine.Re : Sélection aléatoire de sous-ensembles pour une distribution donnéeUne fois que vous avez votre colonne de population à partir de laquelle vous souhaitez échantillonner, essayez ce workflow :
1. Sélectionnez la colonne à partir de laquelle vous souhaitez échantillonner.
2. Dans la barre de menus principale de JMP, sélectionnez Lignes -> Sélection de ligne -> Sélectionner au hasard ->, puis votre taille d'échantillon ou taux d'échantillonnage.
Cela renverra les colonnes sélectionnées dans votre table de données d'origine, et à partir de là, le sous-ensemble de lignes vous donnera une table de données.