Selezione casuale di sottoinsiemi per una data distribuzioneCiao ...
Sto cercando di selezionare casualmente da una colonna di dati per una data distribuzione normale. La distribuzione data è diversa da quella dei dati.
C'è un modo semplice per ottenere questo risultato con le opzioni correnti di Table Subset? Non riuscivo a vedere nulla che potesse aiutarmi.
Ho anche provato una formula, fondamentalmente NormalDensity (X, mu, sigma) per tracciare le densità dei "dati" rispetto alla distribuzione data.
Ma ancora non so come dire una selezione uniforme e casuale da questa formula, quindi il mio risultato è il più vicino possibile alla distribuzione data.
Grazie. Apprezzo il supporto.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneConsiglierei anche il corso gratuito Statistical Thinking for Industrial Problem Solving ( https://www.jmp.com/en_us/online-statistics-course.html ). Anche se potrebbe non essere necessario apprendere le statistiche, le dimostrazioni mostrano come eseguire analisi comuni in JMP. Penso che queste dimostrazioni possano mostrarti quanto bene può fare JMP in un corso di statistica, oltre a mostrare alcune tecniche di base per la manipolazione dei dati e la rappresentazione grafica.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneTi consiglio di dedicare del tempo al sito Web di JMP. C'è una voce di menu nella parte superiore della home page, Impara JMP , attraverso il quale puoi accedere a una qualsiasi delle molte risorse che abbiamo creato per aiutarti a imparare a utilizzare JMP. Un'altra area di apprendimento è il Vertice della scoperta sito nel Eventi menù. Ad esempio, la presentazione principale di John Sall negli ultimi anni ti darà alcuni spunti.
Insegni in un corso di statistica? Ci sono diverse sezioni dedicate agli istruttori. Parte del materiale potrebbe essere scaricato come compiti per i tuoi studenti.
Sono d'accordo con te che, alla versione 15, JMP è complesso e sofisticato. Alcune delle sue migliori caratteristiche non sono ovvie. Imparare molto e adottare un nuovo strumento è la tua mentalità. Ad esempio, insegno JMP e molti nuovi utenti vedono una tabella di dati JMP e pensano: "È solo un altro foglio di calcolo". Quel punto di partenza è dove inizia la frustrazione. (Non sto dicendo che fosse la tua impressione iniziale, ma è comune. BI pensa che tu apprezzi la differenza tra l'analisi statistica e l'analisi del foglio di calcolo perché usi MINITAB.) Le risorse che ho menzionato sopra hanno lo scopo di rivelare la mentalità di JMP in modo che abbia senso e tu possa anticipare rapidamente come JMP ti aiuterà a risolvere un nuovo problema.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneLo so, ma una ricerca di quello che stavo cercando mi ha portato a questa risposta.Sto cercando di determinare se ha senso passare a JMP per un corso di statistica.Sta diventando chiaro che JMP non è intuitivo e difficile per le cose semplici.Anche la risposta che hai dato a un semplice campione non è semplice o intuitiva.
La mia opinione su JMP finora è che la curva di apprendimento è alta, ma probabilmente ne vale la pena se stai eseguendo modelli statistici più complessi o progettazioni di esperimenti.Tuttavia, non sono sicuro che ci siano vantaggi per JMP rispetto ad altri prodotti come R o SPSS. JMP è come molti prodotti in questi giorni, progettati da esperti o programmatori di computer per essere utilizzati da esperti o programmatori di computer pur rimanendo relativamente inaccessibili a coloro che non sono in quei campi. Pochissimi prodotti svolgono un lavoro decente nel considerare e soddisfare un'ampia base di utenti.
Forse la mia opinione cambierà, dato che non ho ancora rinunciato a JMP, ma finora mi sta facendo apprezzare la semplice interfaccia di Minitab.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneLa richiesta originale qui non riguardava il semplice campionamento casuale di un'altra colonna.
Se è tutto ciò di cui hai bisogno, puoi usare il Funzione Col Shuffle() per generare una nuova colonna con selezione casuale da un'altra.

Ri: selezione casuale di sottoinsiemi per una data distribuzioneMi stai prendendo in giro.Ottenere un campione casuale da un'altra colonna e mostrartelo in una colonna separata è una selezione di menu in Minitab.La risposta ha richiesto due pagine di discussione e dozzine di righe di codice.Perché le cose semplici sono così difficili in JMP?
Ri: selezione casuale di sottoinsiemi per una data distribuzioneJeff
La tua modifica alla soluzione originale di Ian ha funzionato perfettamente. Ora posso estrarre dati casuali con una distribuzione prescritta. Sarebbe bello vedere questa opzione come sottoimpostazione della tabella ...
Il mio problema è risolto al 100%.
Grazie per il vostro sostegno.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneL'approccio che @ian_jmp found è stata la prima cosa che ho provato, ma a quanto pare l'ho abbandonato troppo presto poiché Ian ha trovato un modo per superare alcune carenze in cui mi sono imbattuto. Bel lavoro.
Per quanto riguarda l'eliminazione del ricampionamento delle righe, credo che Ian stesse suggerendo di aggiungere la riga:
bv[Loc Min( dist )] = .;
al ciclo for(). Così:
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 ) ) )
)
);
Ri: Selezione casuale di sottoinsiemi per una data distribuzioneMi dispiace, non avrò accesso a un computer per alcuni giorni a causa di una vacanza. Ma sono sicuro che qualcun altro può farlo. . .
Ri: selezione casuale di sottoinsiemi per una data distribuzioneIan
Miravo a ottenere ~ 46K di dati di sottocampioni, di cui 44K duplicati.
Potresti scrivermi quella riga per "bv" per il tuo suggerimento?
grazie di nuovo.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneSì, mi sono chiesto questo. In questo momento lo fa, ma se non vuoi duplicati, aggiungi semplicemente una riga in più che imposta l'elemento del vettore 'bv' che è stato trovato come '.' mancante.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneIan,
Ho dimenticato di fare una domanda. La tua selezione è fatta in modo univoco dalla tabella originale o ha la possibilità di avere selezioni duplicate nella sottotabella?
grazie
Ri: selezione casuale di sottoinsiemi per una data distribuzioneIan,
È brillante. In un certo senso ho pensato a un approccio simile, ma non sono stato in grado di farlo a causa della mia conoscenza di base della sceneggiatura.
Sono stato in grado di adattarlo ai miei dati e sto ottenendo ciò che voglio. Potrei forse espandere questo alla selezione della distribuzione a 2 parametri che dovrei essere in grado di fare dal tuo script.
Grazie per il vostro sostegno.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneJeff,
Grazie per i tuoi sforzi.
Il tuo suggerimento ha avuto una piccola possibilità. L'ho applicato ai miei dati e sfortunatamente poiché la selezione è casuale, non ha funzionato. L'ho eseguito per circa 3000 iterazioni e l'ho interrotto dopo 10 ore. Il movimento sulla media dei dati è stato insignificante.
Questa non è una tecnica semplice (a meno che non ti chiami Ian)... Immagino che una sorta di ottimizzatore sia coinvolto nel tentativo di estrarre casualmente dalla direzione che ha più senso. Gli GA possono essere eccessivi, ma certamente possono fare questo tipo di ottimizzazione.
Dal punto di vista statistico, questo è perfettamente ok per quello che faccio. Il 400+K rappresenta un big data di asset.. Sto cercando di trovare risorse simili a un sottogruppo oggetto di indagine.
grazie ancora.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneSe " Quindi, in conclusione, devo sottoselezionare da oltre 400.000 righe un numero di sottocampioni in modo che la distribuzione per il sottocampione selezionato sia il più vicino possibile alla distribuzione data " è quello che vuoi, forse potresti usare questo tipo di approccio, o qualcosa di simile?
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 ) ) )
)
);
Ri: selezione casuale di sottoinsiemi per una data distribuzione
A seconda del tuo scopo, ottenere un sottoinsieme come questo può essere statisticamente discutibile, ma un modo per farlo è forzarlo utilizzando Resample Freq() per generare campioni casuali e quindi controllare quel campione per vedere se soddisfa le caratteristiche desiderate. Ecco un prototipo che genera una tabella per simulare i dati originali e poi li ricampiona, usa la piattaforma di distribuzione per testare l'esempio.
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 ) );
);
Ri: selezione casuale di sottoinsiemi per una data distribuzioneSono solo libero di pensare qui, ma forse quello che potresti provare è determinare la forma della distribuzione, utilizzando la piattaforma di distribuzione, quindi trasformare i dati in una distribuzione normale.Quindi esegui l'output dei livelli e quindi il sottoinsieme con la stratificazione.Solo un pensiero.
Ri: selezione casuale di sottoinsiemi per una data distribuzioneJim, grazie per il tuo suggerimento.
Ma la tua proposta non ha un modo per forzare la selezione in base alla distribuzione data. Quindi non produrrebbe quello che sto cercando. Per convalidare, ho seguito i passaggi e ha prodotto un dist molto simile a quello originale.
Forse non mi sto spiegando in modo chiaro.
Ho più di 400.000 righe XN colonne di dati (matrice enorme). Se chiamo uno degli N parametri, come "X" per amor di discussione.
La distribuzione di X da questi dati: chiamala X.dist1.
Ho un secondo set di dati che ha Xagain, e questa volta con X.dist2
X.dist1 non è troppo lontano ma è diverso da X.dist2.
Dato che ho molti dati nel primo set di dati (400k+), sto quindi cercando di sottoselezionare il set di dati da 1 in modo che la distribuzione X dei dati selezionati sia la più vicina che posso ottenere a X.dist2.
Quindi stavo cercando alcune capacità in Table - Subset in cui posso specificare la normale caratteristica di distribuzione OR usando una formula e quindi usando Table-subset.
per la formula, metto le densità di dataset1 contro il mio X.dist2 desiderato.
Ma ora ho bisogno di un modo casuale uniforme di campionare dagli output delle formule in modo da forzare la distribuzione dei risultati in ~ X.dist2
O in qualsiasi altro modo...
Se devo utilizzare un sottoinsieme di tabelle, la soluzione deve specificare una distribuzione normale da un parametro da cui estrarre.
Oppure, ho bisogno di trovare una selezione casuale uniforme da un parametro (approccio formula).
Ri: selezione casuale di sottoinsiemi per una data distribuzioneCredo che tu possa ottenere ciò che desideri eseguendo un semplice processo in 2 fasi.
1. Apri la piattaforma di distribuzione per la colonna che hai in questione.Poi
Salva==>Numeri di livello.
Questo creerà una nuova colonna con una distribuzione presa direttamente dai dati effettivi
2. Creare un sottoinsieme dei dati e specificare
Casuale - frequenza di campionamento:
e anche
Stratifica, in base alla nuova colonna Livello creata nel passaggio precedente
Ri: selezione casuale di sottoinsiemi per una data distribuzioneIl mio vero obiettivo è confrontare N (altri) parametri da due set di dati già disponibili, non sto cercando di creare una distribuzione fittizia. (Forse ho frainteso la tua proposta).
La distribuzione data è un vincolo su un parametro importante che può influenzarne altri. Sto cercando di selezionare risorse con distribuzione simile da "dati" a una data distribuzione in modo da ridurre al minimo l'impatto di questo parametro influente. In questo contesto, la "distribuzione" si applica solo a un singolo parametro e non a più.
Quindi, in conclusione, devo sottoselezionare da oltre 400.000 righe un numero di sottocampioni in modo che la distribuzione per il sottocampione selezionato sia il più vicino possibile alla distribuzione data.Ri: selezione casuale di sottoinsiemi per una data distribuzioneCapisco... non ho capito bene il tuo post originale. Hai ragione, il mio suggerimento restituirà solo una distribuzione con parametri molto simili alla distribuzione originale. Se vuoi osservazioni di una variabile casuale con le stime dei parametri desiderati, perché non puoi semplicemente creare una colonna con quei parametri e andare avanti. Certo, le osservazioni specifiche non risiedono necessariamente nella colonna originale, ma ciò può o meno influenzare ciò che stai cercando di ottenere analiticamente o praticamente? Saranno almeno osservazioni plausibili, anche se non corrispondenze esatte.
Ri: selezione casuale di sottoinsiemi per una data distribuzionePeter .. grazie per il tuo suggerimento.
ma non sembra funzionare.
La media/stdev dei miei dati originali è: 12816 e 1726 da un campione molto ampio (400K +).
Sto cercando di selezionare un sottocampione più vicino a 14300 e 2050
Ho provato il tuo suggerimento sulla formula (ovvero le densità dei dati rispetto a 14300, 2050) e, a meno che non riesca a forzare questa dist casuale a essere selezionata in modo uniforme tra le densità, non credo di poter ottenere ciò di cui ho bisogno. In effetti, il sottocampionamento è risultato come previsto con la distribuzione originale.Ri: selezione casuale di sottoinsiemi per una data distribuzioneUna volta che hai la tua colonna della popolazione da cui vuoi campionare, prova questo flusso di lavoro:
1. Selezionare la colonna da cui si desidera campionare.
2. Dalla barra del menu principale di JMP, selezionare Righe -> Selezione riga -> Seleziona in modo casuale -> quindi la dimensione del campione o la frequenza di campionamento.
Ciò restituirà le colonne selezionate nella tabella di dati originale e da lì il sottoinsieme di righe ti darà una tabella di dati.