realizar evaluación de cálculo en matriz asociativaHola,
Estoy tratando de obtener una función para devolver un cálculo de desviación estándar almacenado dentro de una matriz asociativa, mi código solo devolverá la expresión de la matriz asociativa y no el cálculo.¿podría decirme qué está mal con mi código?
CVF = máx. ( replicar ) ;// mi cvf en el archivo es 8
CV = matriz asociativa () ;
CV [ 6 ] = matriz asociativa ({( Desv estándar ( 5 , 6 , 7 , 8 , 9 , 10 ))}) ;
CV [ 8 ] = matriz asociativa ({( Desv estándar ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ))}) ;
CV [ 12 ] = matriz asociativa ({( Desv estándar ( 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , dieciséis ))}) ;
CVC = Función ( { árbitro } , Local ({ CV = matriz asociativa ({ CVF , evaluar ( CVF )} )} , CV << obtener valores ( CVF )) ; CV [ árbitro ]) ; ) ;
a = CVC ( CVF ) ;
evaluar ( expresión de evaluación ( a )) ;
Mostrar(a);
esta es la salida que obtengo:
a = Matriz asociativa ({{Std Dev (5, 6, 7, 8, 9, 10, 11, 12), 1}}, 0);
esta es la salida que quiero: a = 2.5
Re: realizar evaluación de cálculo en matriz asociativaSummarize(age grp) es una lista de dos listas y no es compatible con la matriz asociativa (age grp). Además, avg y sd están en una sola lista que no es compatible para referencias cruzadas con Summary(age grp). El siguiente código alinea las listas correctamente (no es bonito)
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( sum = By( :age),sex grp= By (:sex), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
sex grp = Associative Array( :sex ) << Get Keys;
dt << New Column( "CV" ) << New Column( "AVG" ) << New Column( "SD" );
For( g = 1, g <= nitems(age grp), g++,
For(i =1, i<=nitems(sex grp), i++,
rows = dt << get rows where( :age == age grp[g] & :sex == sex grp[i] );
if( i==1,
:AVG[rows] = avg[ g*2-1 ];
:SD[rows] = sd[ g*2-1 ];
:CV[rows] = 100 * avg[ g*2-1 ] / sd[ g*2-1 ];
,
:AVG[rows] = avg[ g*i ];
:SD[rows] = sd[ g*i ];
:CV[rows] = 100 * avg[ g*i ] / sd[ g*i ];
)));
Re: realizar evaluación de cálculo en matriz asociativagracias, funciona
Re: realizar evaluación de cálculo en matriz asociativaNo estoy seguro de cuándo apareció, pero para tu información, noté que en mi versión de JMP (13), "CV" es una de las estadísticas proporcionadas por "Tablas> Resumen". Por lo tanto, la columna de fórmula no es necesaria.
Re: realizar evaluación de cálculo en matriz asociativaPido disculpas por pasar por alto el hecho de que tiene dos variables de agrupación. Este script modificado le mostrará cómo funciona.
Names Default to Here( 1 );
// Open example of a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Estimate group statistics and group identities
Summarize( age sex grp = By( :age, :sex ), avg = Mean( :height ), sd = Std Dev( :height ) );
// Make a new columns for group result
dt << New Column( "Avg" ) << New Column( "SD" ) << New Column( "CV" );
// Iterate over groups
For( g = 1, g <= N Items( age grp ), g++,
// Convert :age level to match data type of identity
rows = dt << Get Rows Where( Char( :age ) == age sex grp[1][g] & :sex == age sex grp[2][g] );
:Avg[rows] = avg[g];
:SD[rows] =sd[g];
:CV[rows] = 100 * sd[g] / avg[g];
);
No creo que una matriz asociativa sea la forma más eficiente de identificar los grupos. La función Summarize() estima simultáneamente las estadísticas del grupo e identifica el grupo asociado mediante dos listas paralelas de niveles de grupo. El único inconveniente, en mi opinión, es que los niveles de agrupación son siempre cadenas de caracteres, incluso si los niveles originales son numéricos, como: niveles de edad en este caso. Así que tuve que convertir el :nivel de edad para la comparación utilizada para obtener los números de fila de destino.
Ahora tiene dos enfoques, incluida la solución de Ian mediante el comando Resumen\.
Re: realizar evaluación de cálculo en matriz asociativaPodría intentar ver si esto es más eficiente (lo que podría esperar):
Names Default To Here( 1 );
// Example table
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Edit to taste . . .
var = Column(dt, "height");
byVars = {Column(dt, "sex"), Column(dt, "age")};
// Use a summary table with formula column
dt2 = dt << Summary(Group(byVars), Mean(var), Std Dev(var));
Column(dt2, 4) << setName("Mean");
Column(dt2, 5) << setName("StdDev");
dt2 << New Column( "CV", Numeric, "Continuous", Format( "Percent", 12, 3 ), Formula(:StdDev/:Mean));
Si necesita los valores de CV en la tabla original, use 'Tablas > Unirse'.
Re: realizar evaluación de cálculo en matriz asociativaHola, Mark ,
Uso su ejemplo y puedo obtener el número de fila correctamente, pero el promedio y la desviación estándar no son correctos. Y mi tabla tiene más de 10.000 líneas, el cálculo es un poco lento. ¿Podría decirme dónde hice mal? gracias.
Nombres predeterminados aquí ( 1 ) ;
dt = Abierto ( "$SAMPLE_DATA/Clase grande.jmp" ) ;
Resumir ( grupo de edad = Por ( : edad ) , grupo de sexo = Por ( : sexo ) , promedio = Significar ( : altura ) , Dakota del Sur = Desv estándar ( : altura ) ) ;
grupo de edad = matriz asociativa ( : edad ) << Obtener claves ;
grupo de sexo = matriz asociativa ( : sexo ) << Obtener claves ;
dt << Nueva columna ( "CV" ) ;
Para ( gramo = 1 , gramo <= artículos ( grupo de edad ) , gramo ++,
para ( i = 1 , i <= artículos ( grupo de sexo ) , i ++,
filas = dt << obtener filas donde ( : edad == grupo de edad [ gramo ] & : sexo == grupo de sexo [ i ]) ;
: CV [ filas ] = 100 * Dakota del Sur [ i ] / promedio [ i ] ;
)) ;
Re: realizar evaluación de cálculo en matriz asociativaGracias, es lo que estoy buscando. gracias.
shu
Re: realizar evaluación de cálculo en matriz asociativaPrueba este ejemplo:
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( age grp = By( :age ), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
dt << New Column( "CV" );
For( g = 1, g <= N Items( age grp ), g++,
rows = dt << Get Rows Where( :age == age grp[g] )
:CV[rows] = 100 * sd[g] / avg[g];
);
Re: realizar evaluación de cálculo en matriz asociativahay tres columnas en una tabla de datos, y una indicará el número de réplica, y la otra tendrá una salida de señal para la réplica, y la última tendrá el ID de datos. y necesito calcular la desviación estándar para todos los ID de datos. todos los datos solo tendrán dos réplicas, excepto un tipo específico llamado "Título" y, dependiendo de dónde se generen los datos, el tipo de datos "Título" puede tener 6, 8 o 12 réplicas. por lo tanto, hago esos tres casos como una matriz y los vinculo a la columna de réplica.
mi código y devuelvo la fórmula al cálculo de desviación estándar, sin embargo, cuando los coloco en una nueva columna para el cálculo de CV, no hace nada.
la otra opción que se me ocurre es usar la plataforma Tabulate para obtener la desviación estándar y colocarlos en una matriz y asignarlos nuevamente a la nueva columna. ¿Cualquier sugerencia?
Re: realizar evaluación de cálculo en matriz asociativaEmpecemos de nuevo.
- ¿Que estás tratando de hacer?
- ¿Cómo son tus datos?
- ¿Cómo está organizado?
- ¿Cuáles son los resultados que necesita?
- ¿Qué quieres hacer con los resultados?
No me queda claro que necesite usar una matriz asociativa.
Re: realizar evaluación de cálculo en matriz asociativaMe di cuenta de mi problema, pero tengo un nuevo problema.
mi matriz asociada es una fórmula y necesito recuperar la clave para realizar el cálculo.
mi código devolverá a, que es la fórmula sobre cómo calcular la desviación estándar. pero cuando pongo la fórmula en una nueva fórmula, la nueva fórmula no realiza el cálculo.
a = CVC ( CVF ) << conseguir llaves ( CVF ) ;
espectáculo ( a ) ;// esta es la fórmula con un:
{Desv estándar(:INSTRUMENTO_SEÑAL[Fila() + 8], :INSTRUMENTO_SEÑAL[Fila() + 1], :INSTRUMENTO_SEÑAL[Fila() + 2], :INSTRUMENTO_SEÑAL[Fila() + 3], :INSTRUMENTO_SEÑAL[Fila() + 4], :INSTRUMENTO_SEÑAL[Fila() + 5], :INSTRUMENTO_SEÑAL[Fila() + 6], :INSTRUMENTO_SEÑAL[Fila() + 7])};
pero una vez que puse a en la nueva fórmula a continuación: a haría el cálculo. ¡Por favor ayuda!
C viejo 2 << fórmula establecida ( Si ( : EJECUTAR TIPO DE MUESTRA == "TITERC.NEG" , ( a / : Señal promedio ) * 100 ) ,
Si ( : EJECUTAR TIPO DE MUESTRA [ Fila ()] == : EJECUTAR TIPO DE MUESTRA [ Fila () + 1 ] ,
Si ( : REPS [ Fila ()] != 2 , ( Desv estándar ( : INSTRUMENT_SIGNAL [ Fila () + 1 ] , : INSTRUMENT_SIGNAL [ Fila ()] ) / : Señal promedio ) * 100 ) ) ) ;