Selección aleatoria de subconjuntos para una distribución dadaHola ...
Estoy tratando de seleccionar aleatoriamente de una columna de datos para una distribución normal dada. La distribución dada es diferente a la de los datos.
¿Hay una manera fácil de lograr esto con las opciones actuales de Table Subset? No pude ver nada que pudiera ayudarme.
También probé una fórmula, básicamente NormalDensity (X, mu, sigma) para trazar las densidades de los "datos" contra la distribución dada.
Pero todavía no sé cómo decir seleccionar de manera uniforme y aleatoria de esta fórmula para que mi resultado sea lo más cercano posible a la distribución dada.
Gracias. Agradezco el apoyo.
Re: Selección aleatoria de subconjuntos para una distribución dadaTambién recomendaría el curso gratuito Pensamiento estadístico para la resolución de problemas industriales ( https://www.jmp.com/en_us/online-statistics-course.html ). Aunque es posible que no necesite aprender las estadísticas, las demostraciones muestran cómo realizar análisis comunes en JMP. Creo que esas demostraciones pueden mostrarle lo bien que JMP puede desempeñarse en un curso de estadística, además de mostrar algunas técnicas básicas de manipulación de datos y gráficos.
Re: Selección aleatoria de subconjuntos para una distribución dadaLe recomiendo que pase tiempo en el sitio Web de JMP. Hay un elemento de menú en la parte superior de la página de inicio, Aprende JMP , a través del cual puede acceder a cualquiera de los muchos recursos que creamos para ayudarlo a aprender a usar JMP. Otra área de aprendizaje es la Cumbre de descubrimiento sitio en el Eventos menú. Por ejemplo, la presentación principal de John Sall durante los últimos años le dará algunas ideas.
¿Estás dando un curso de estadística? Hay varias secciones dedicadas a los instructores. Parte del material podría descargarse como tareas para sus alumnos.
Estoy de acuerdo contigo en que, en la versión 15, JMP es complejo y sofisticado. Algunas de sus mejores características no son obvias. Mucho de aprender y adoptar una nueva herramienta es su forma de pensar. Por ejemplo, enseño JMP y muchos usuarios nuevos ven una tabla de datos de JMP y piensan: "Es solo otra hoja de cálculo". Ese punto de partida es donde comienza la frustración. (No digo que esa haya sido tu impresión inicial, pero es común. B Creo que aprecia la diferencia entre el análisis estadístico y el análisis de hoja de cálculo porque usa MINITAB). Los recursos que mencioné anteriormente están destinados a revelar la mentalidad de JMP para que tenga sentido y pueda anticipar rápidamente cómo JMP lo ayudará a resolver un nuevo problema.
Re: Selección aleatoria de subconjuntos para una distribución dadaLo sé, pero una búsqueda de lo que estaba buscando me llevó a esta respuesta.Estoy tratando de determinar si cambiar a JMP para un curso de estadística tiene sentido.Cada vez es más claro que JMP es poco intuitivo y difícil para las cosas simples.Incluso la respuesta que dio a una muestra simple no es simple ni intuitiva.
Mi opinión sobre JMP hasta ahora es que la curva de aprendizaje es alta, pero probablemente valga la pena si está haciendo modelos estadísticos más complejos o diseño de experimentos.Sin embargo, no estoy seguro de si JMP tiene ventajas sobre otros productos como R o SPSS. JMP es como muchos productos en estos días, diseñado por expertos o programadores de computadoras para ser utilizado por expertos o programadores de computadoras mientras permanece relativamente inaccesible para aquellos que no están en esos campos. Muy pocos productos hacen un trabajo decente al considerar y atender a una amplia base de usuarios.
Tal vez mi opinión cambie, ya que aún no me he rendido con JMP, pero hasta ahora me está haciendo apreciar la interfaz simple de Minitab.
Re: Selección aleatoria de subconjuntos para una distribución dadaLa solicitud original aquí no era para un muestreo aleatorio simple de otra columna.
Si eso es todo lo que necesita, puede usar el Función Col Shuffle() para generar una nueva columna con selección aleatoria de otra.

Re: Selección aleatoria de subconjuntos para una distribución dadaTienes que estar bromeando.Obtener una muestra aleatoria de otra columna y mostrársela en una columna separada es una selección de menú en Minitab.La respuesta a esto tomó dos páginas de discusión y docenas de líneas de código.¿Por qué las cosas simples son tan difíciles en JMP?
Re: Selección aleatoria de subconjuntos para una distribución dadajeff
Su modificación en la solución original de Ian funcionó perfectamente. Ahora puedo extraer datos aleatorios con una distribución prescrita. Sería bueno ver esto como una opción en Subconjuntos de tablas...
Mi problema esta 100% solucionado.
gracias por su apoyo.
Re: Selección aleatoria de subconjuntos para una distribución dadael enfoque que @ian_jmp found fue lo primero que intenté, pero aparentemente lo abandoné demasiado pronto, ya que Ian encontró una manera de superar algunas deficiencias con las que me encontré. Buen trabajo.
En cuanto a eliminar el remuestreo de filas, creo que Ian estaba sugiriendo agregar la línea:
bv[Loc Min( dist )] = .;
al bucle for(). Así:
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: Selección aleatoria de subconjuntos para una distribución dadaLo siento, no tendré acceso a una computadora durante unos días debido a unas vacaciones. Pero estoy seguro de que alguien más puede hacerlo. . .
Re: Selección aleatoria de subconjuntos para una distribución dadaian
Mi objetivo era obtener ~46K de datos de submuestra, de los cuales 44K han sido duplicados.
¿Podría escribirme esa línea para "bv" para su sugerencia?
Gracias de nuevo.
Re: Selección aleatoria de subconjuntos para una distribución dadaSí, me preguntaba sobre esto. En este momento lo hace, pero si no quiere duplicados, simplemente agregue una línea adicional que establezca el elemento del vector 'bv' que se encontró que falta '.'.
Re: Selección aleatoria de subconjuntos para una distribución dadaian,
Olvidé hacer una pregunta. ¿Su selección se realiza únicamente a partir de la tabla original o tiene la posibilidad de tener selecciones duplicadas en la subtabla?
Gracias
Re: Selección aleatoria de subconjuntos para una distribución dadaian,
Esto es brillante. De alguna manera pensé en un enfoque similar, pero no pude hacerlo debido a mi conocimiento básico del script.
Pude adaptarlo a mis datos y estoy obteniendo lo que quiero. Tal vez pueda expandir esto a la selección de distribución de 2 parámetros que debería poder hacer desde su secuencia de comandos.
gracias por su apoyo.
Re: Selección aleatoria de subconjuntos para una distribución dadajeff,
Gracias por tu esfuerzo.
Su sugerencia tenía una pequeña posibilidad. Lo apliqué a mis datos y, lamentablemente, dado que la selección es aleatoria, no funcionó. Lo ejecuté durante unas 3000 iteraciones y lo detuve después de 10 horas. El movimiento en la media de los datos fue insignificante.
Esta no es una técnica simple (a menos que su nombre sea Ian) .. Me imagino que algún tipo de optimizador está involucrado tratando de tirar al azar de la dirección en la que tiene más sentido. Los GA pueden ser una exageración, pero ciertamente pueden hacer este tipo de optimización.
Desde una perspectiva estadística, esto está perfectamente bien para lo que hago. El 400+K representa un gran dato de activos. Estoy tratando de encontrar activos que sean similares a un subgrupo bajo investigación.
gracias de nuevo.
Re: Selección aleatoria de subconjuntos para una distribución dadaSi " Entonces, en resumen, necesito subseleccionar de más de 400 000 filas una cantidad de submuestras para que la distribución de la submuestra seleccionada sea lo más cercana posible a la distribución dada. " es lo que quieres, ¿tal vez podrías usar este tipo de enfoque, o algo parecido?
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: Selección aleatoria de subconjuntos para una distribución dada
Dependiendo de su propósito, obtener un subconjunto como este puede ser estadísticamente cuestionable, pero una forma de hacerlo es usar fuerza bruta usando Resample Freq() para generar muestras aleatorias y luego verificar esa muestra para ver si cumple con las características deseadas. Aquí hay un prototipo que genera una tabla para simular sus datos originales y luego los vuelve a muestrear, usa la plataforma de distribución para probar la muestra.
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: Selección aleatoria de subconjuntos para una distribución dadaSolo estoy pensando libremente aquí, pero tal vez lo que podría intentar es determinar la forma de distribución, utilizando la plataforma de distribución, luego transformar los datos en una distribución normal.Luego haga la salida de los Niveles y luego el subconjunto con estratificación.Solo un pensamiento.
Re: Selección aleatoria de subconjuntos para una distribución dadaJaime, gracias por tu sugerencia.
Pero su propuesta no tiene una forma de forzar la selección de acuerdo con la distribución dada. Entonces no produciría lo que estoy buscando. Para validar, seguí los pasos y produjo un dist muy similar al original.
Tal vez no me estoy explicando de una manera clara.
Tengo más de 400k filas XN columnas de datos (matriz enorme). Si llamo a uno de N parámetros, como "X" por el bien del argumento.
La distribución de X a partir de estos datos, llámelo X.dist1.
Tengo un segundo conjunto de datos que tiene Xagain, y esta vez con X.dist2
X.dist1 no está demasiado lejos pero es diferente a X.dist2.
Dado el hecho de que tengo muchos datos en el primer conjunto de datos (400k+), por lo tanto, estoy tratando de subseleccionar el conjunto de datos de 1 para que la distribución X de los datos seleccionados sea lo más cercano que puedo llegar a X.dist2.
Por lo tanto, estaba buscando alguna capacidad en Table - Subset donde puedo especificar la característica de distribución normal O usar una fórmula y luego usar Table-subset.
para la fórmula, pongo densidades de dataset1 contra mi X.dist2 deseado.
Pero ahora necesito una forma aleatoria uniforme de muestreo de los resultados de las fórmulas para forzar que la distribución de resultados sea ~ X.dist2
O de cualquier otra forma...
Si debo usar un subconjunto de tabla, la solución debe especificar una distribución normal de un parámetro para extraer.
O de lo contrario, necesito encontrar una selección aleatoria uniforme de un parámetro (enfoque de fórmula).
Re: Selección aleatoria de subconjuntos para una distribución dadaCreo que puedes obtener lo que quieres haciendo un proceso simple de 2 pasos.
1. Abra la Plataforma de distribución de la columna que tiene en cuestión.Entonces
Guardar==>Números de nivel.
Esto creará una nueva columna con una distribución tomada directamente de los datos reales
2. Cree un subconjunto de los datos y especifique
Aleatorio - frecuencia de muestreo:
y también
Estratificar, según la nueva columna Nivel creada en el paso anterior
Re: Selección aleatoria de subconjuntos para una distribución dadaMi objetivo real es comparar N (otros) parámetros de dos conjuntos de datos ya disponibles, no estoy tratando de crear una distribución ficticia. (Tal vez estoy malinterpretando su propuesta).
La distribución dada es una restricción sobre un parámetro importante que puede influir en otros. Estoy tratando de seleccionar activos con una distribución similar de "datos" a una distribución determinada para minimizar el impacto de este parámetro influyente. En este contexto, la "distribución" solo se aplica a un único parámetro y no a varios.
Entonces, en resumen, necesito subseleccionar de más de 400K filas una cantidad de submuestras para que la distribución de la submuestra seleccionada sea lo más cercana posible a la distribución dada.Re: Selección aleatoria de subconjuntos para una distribución dadaYa veo... No entendí completamente tu publicación original. Tiene razón, mi sugerencia solo devolverá una distribución con parámetros muy similares a la distribución original. Si desea observaciones de una variable aleatoria con las estimaciones de parámetros deseadas, ¿por qué no puede simplemente crear una columna con esos parámetros y continuar? Claro, las observaciones específicas no residirán necesariamente en la columna original, pero eso puede o no influir en lo que está tratando de lograr analítica o prácticamente. Al menos serán observaciones plausibles, aunque no coincidencias exactas.
Re: Selección aleatoria de subconjuntos para una distribución dadaPedro.. gracias por tu sugerencia.
pero eso no parece funcionar.
La media / desviación estándar de mis datos originales son: 12816 y 1726 de una muestra muy grande (400K +).
Estoy tratando de seleccionar una submuestra que está más cerca de 14300 y 2050
Probé su sugerencia sobre la fórmula (es decir, densidades de los datos wrt 14300, 2050) y, a menos que pueda obligar a que esta distribución aleatoria se seleccione uniformemente entre las densidades, no creo que pueda obtener lo que necesito. De hecho, el submuestreo resultó como se esperaba con la distribución original.Re: Selección aleatoria de subconjuntos para una distribución dadaUna vez que tenga la columna de población de la que desea muestrear, pruebe este flujo de trabajo:
1. Seleccione la columna de la que desea muestrear.
2. En la barra del menú principal de JMP, seleccione Filas -> Selección de filas -> Seleccionar aleatoriamente -> y luego el tamaño de la muestra o la frecuencia de muestreo.
Esto devolverá las columnas seleccionadas en su tabla de datos original y, a partir de ahí, Row Subset le dará una tabla de datos.