Código JSL necesario para generar una columna de fórmula dinámica que sume columnas de una listaHola todos,
Esta pregunta está relacionada con una publicación. aquí eso genera muy bien una columna no dinámica para resumir una lista de otras columnas.
El problema que tengo es cómo resumir las columnas (usando JSL) cuando tiene una lista de otras N columnas y tiene una fórmula dinámica.
Tengo una lista de columnas en mi tabla de datos, digamos ColList, y quiero generar una nueva columna con una fórmula que simplemente sume los N elementos en ColList. Algo que estaba pensando es así:
Names Default to Here (1);
dt = Current Data Table();
dt << New Column("Sum", Formula(Sum(ColList)));Esto claramente no funciona porque ColList es una lista de columnas: ColList = {"col1", "col2", ..., "colN"}. Intenté hacer una cadena y usar Eval (Parse ()) y Eval Insert () como tal:
Names Default to Here (1);
dt = Current Data Table();
str = Eval Insert("dt << New Column(\!"Sum\!", Formula(Sum(Eval(ColList))));
Eval(Parse(str));Pero aún así no hubo suerte. El código JSL generará la columna con una fórmula, pero tendrá valores de fila vacíos porque todavía muestra Eval (ColList) en la fórmula en lugar de ser la fórmula real, que debería verse así: Sum (: col1,: col2,: col3, ...,: colN).
No puedo entender qué estoy haciendo mal al pasar de la lista {""} de columnas a la referencia a las columnas con los dos puntos:.
Cualquier ayuda es muy apreciada.
¡Gracias!,
DS
AnalíticaTabla de datosScriptingRe: código JSL necesario para generar columna de fórmula dinámica que sume columnas de una listaHay varias formas de hacer esto. Prefiero crear una variable para la expresión deseada usando EvalExpr () y luego usar NameExpr () para transferir la expresión (no evaluada) al argumento Formula ().
Names Default To Here( 1 );
dt = Open( "$Sample_Data/2D Gaussian Process Example.jmp" );
ColList = dt << Get Column Names;
F = Eval Expr( Sum( Expr( ColList ) ) );
dt << New Column( "Sum", Formula( Name Expr( F ) ) );
Re: código JSL necesario para generar columna de fórmula dinámica que sume columnas de una listaHola @Sra ,
¡Esa es una solución perfecta, gracias! Me gusta lo simple y elegante que es.
Tuve que cambiar un poco mi código porque hacerlo a tu manera todavía tiene un problema cuando la lista está estructurada como: {"A", "B", "C", ...}. Pero, si la lista está estructurada como {A, B, C, ...} entonces evalúa la expresión sin problemas. Las dos listas se generan de manera ligeramente diferente y las citas realmente desechan a Eval ().
¡Gracias!,
DS
Re: código JSL necesario para generar columna de fórmula dinámica que sume columnas de una listaHola @Sra ,
Tengo una pregunta relacionada (por lo tanto, no otra publicación) con la que espero que su método de scripting pueda ayudar. Tiene que ver con la publicación aquí . Lo que estoy tratando de hacer ahora es básicamente generalizar lo que se puso en la publicación original de una matriz de correlación 4x4 a una matriz NxN arbitraria al "alimentar" información al Simulador en el perfil.
Desde la otra publicación original, hay un script que puede generar la matriz de correlación NxN y, a partir de su entrada, puede generar una columna de "predicción" (la suma de las otras N columnas). Donde estoy teniendo dificultades es lo siguiente: al llamar a la función Simulator (), tiene lo siguiente para pasarla:
Simulador (estado = 0 | 1, , )
Entonces, de la otra publicación original, la solución para pasar la lista correcta de factores ("tpListY") y la matriz de correlación ("corr.mat"), el código JSL necesitaba tener el Eval Insert () envuelto alrededor de la llamada para enviar Simulator () al informe Profiler y luego ejecute un Eval (Parse ()) alrededor de eso.
El desafío ahora es cómo generalizar correctamente esto para que al llamar a Simulator () y definir los factores, pueda hacer esto en esa ColList.
ColList podría ser algo como: ColList = {A, B, C, D, ...} y hay una media y una desviación estándar asociadas para cada columna A, B, C, ....
¿Cuál es la sintaxis correcta para llamar al simulador de modo que inserte la media correcta y el desarrollo estándar para cada factor? Ejemplo:
sim_design = Profiler(Y(:Pred), Invisible);
new = Eval Insert(
"sim_design << Simulator(
1,
Factors(
:A << mutlivariate(Mmean[1], MSD[1])),
:B << mutlivariate(Mmean[2], MSD[2])),
:C << mutlivariate(Mmean[3], MSD[3])), //etc. for the N columns in the made up table.
),
X Correlations(
1,
Eval(ColList),
Eval(corr_mat)
),
NRuns(1e6)
);");
Eval(Parse(new));A partir de la tabla de datos original, se realiza una segunda maqueta con el número de columnas (N) que se utilizaron para generar la matriz de correlación (corr_mat). Esa tabla de simulación es la que suma las columnas para hacer la columna: Pred que se usa como función ficticia para enviar al Profiler. Las variables Mmean y MSD son vectores que contienen la media y la desviación estándar de las N columnas A a través de lo que sea.
Sin tener que escribir explícitamente en cada columna y su media correspondiente, me gustaría tener esto más automatizado para que pueda manejar cualquier número de columnas.
¿Cuál sería una buena forma de hacerlo?
También tengo problemas con Eval (corr_mat) al ingresar los valores de la matriz de correlación en las entradas de X Correlations.
La tabla de datos y el script adjuntos deberían ayudar a comprender lo que estoy intentando.
¡Gracias!,
DS
Actualización, lo siento, agregué el archivo incorrecto, ahora tiene la tabla de datos correcta.
Re: código JSL necesario para generar columna de fórmula dinámica que sume columnas de una listaHe aquí un enfoque. Primero construya iterativamente los Factores () y luego en un segundo paso haga la expresión completa del Simulador () incluyendo los argumentos evaluados para las Correlaciones X ().
// Iteratively build the Factors expression
fs = Expr( Factors() );
For( i = 1, i <= N Items( ColList ), i++,
Insert Into(
fs,
Eval Expr( Expr( collist[i] ) << multivariate( Expr( MMean[i] ), Expr( MSD[i] ) ) )
)
);
// Make the complete Simulator expression
sim = Eval Expr(
sim_design << Simulator(
1,
Expr( Name Expr( fs ) ),
X Correlations( 1, Expr( ColList ), Expr( corr_mat ) ),
N Runs( 1e4 )
)
);
// Name Expr( sim ) // Run this line to show the expression in the log
// Launch Profiler and run the Simulator expression
sim_design = Profiler( Y( :Pred ) );
sim;
Sin embargo, la matriz de correlaciones X parece (en la mayoría de los casos) ignorada. Solo ceros en el informe.
Además, cuando las correlaciones se ingresan manualmente en el generador de perfiles y se guarda y ejecuta el script, las correlaciones se pierden. Incluso si se conservan en la secuencia de comandos guardada. No estoy seguro de por qué.
Re: código JSL necesario para generar columna de fórmula dinámica que sume columnas de una listaHola @Sra ,
Muchas gracias por tu solución. Funciona bien para mis tablas de datos con las que estoy trabajando. Necesitaba modificar un poco las cosas para tener en cuenta el hecho de que muchas de las tablas de datos con las que trabajo tienen otros tipos de datos, por lo que solo necesito considerar los datos numéricos continuos. De todos modos, funciona correctamente y completa correctamente las medias multivariadas, std devs y las correlaciones X. Estoy usando JMP 16 EA, si eso importa.
¡Gracias por tu ayuda! También publiqué en el otro hilo de la solicitud original con respecto a la matriz de correlación para que esa persona pueda beneficiarse del código para escalar hasta N dimensiones.
¡Gracias!,
DS