Código JSL necesario para generar una columna de fórmula dinámica que suma columnas de una listaHola a 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 = Open("$Sample_Data/2D Gaussian Process Example.jmp");<BR />ColList = dt << Get Column Names;
dt << New Column("Sum", Formula(Sum(ColList)));Esto claramente no funciona porque ColList es una lista de columnas: ColList = {"col1", "col2", ..., "colN"}. He intentado 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 todavía no hay suerte. El código JSL generará la columna con una fórmula, pero tendrá valores de fila vacíos porque aún muestra Eval(ColList) en la fórmula en lugar de ser la fórmula real, que debería tener el siguiente aspecto: Sum(:col1, :col2, : col3, ..., :columna).
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!,
SD
Investigación del Consumidor y del MercadoIngeniería de Calidad y ProcesosRe: código JSL necesario para generar una columna de fórmula dinámica que suma las columnas de una listaHola @EM ,
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 continuos numéricos. De todos modos, funciona correctamente y completa correctamente las medias multivariadas, las desviaciones estándar 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 a N dimensiones.
¡Gracias!,
SD
Re: código JSL necesario para generar una columna de fórmula dinámica que suma las columnas de una listaAquí hay un enfoque. Primero construya iterativamente Factors() y luego, en un segundo paso, haga la expresión Simulator() completa, incluidos los argumentos evaluados para X Correlations().
// 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) ser ignorada. Sólo 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 el script guardado. No estoy seguro de por qué.
Re: código JSL necesario para generar una columna de fórmula dinámica que suma las columnas de una listaHola @EM ,
Tengo una pregunta relacionada (por lo tanto, no otra publicación) con la que espero que su método de secuencias de comandos 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.
De 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 lo estoy pasando mal es lo siguiente: al llamar a la función Simulator(), tienes lo siguiente para pasarla:
Simulator(state=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 Eval Insert() envuelto alrededor de la llamada para enviar Simulator() al informe de 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 ese 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 y la desviación estándar correctas 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 un segundo mock up con el número de columnas (N) que se utilizaron para generar la matriz de correlación (corr_mat). Esa tabla simulada es la que suma las columnas para hacer la columna :Pred que se usa como una función ficticia para enviar al generador de perfiles. 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 cualquiera.
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 cantidad de columnas.
¿Cuál sería una buena manera de hacer esto?
También tengo problemas con Eval(corr_mat) al ingresar los valores de la matriz de correlación en las entradas de Correlaciones X.
La tabla de datos y el script adjuntos deberían ayudar a comprender lo que estoy intentando.
¡Gracias!,
SD
Actualice, lo siento, agregó el archivo incorrecto, ahora tiene la tabla de datos correcta.
Re: código JSL necesario para generar una columna de fórmula dinámica que suma las columnas de una listaHola @EM ,
Esa es una solución perfecta, ¡gracias! Me gusta lo simple y elegante que es.
Tuve que cambiar mi código un poco 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 correctamente. Las dos listas se generan de forma ligeramente diferente y las citas realmente desequilibran el Eval().
¡Gracias!,
SD
Re: código JSL necesario para generar una columna de fórmula dinámica que suma las 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 ) ) );