Hola a todos,
Tener problemas con la referencia adecuada de una columna al pasar el comando <
La sección de código con la que estoy teniendo dificultades es la siguiente:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( Eval( YCols ) ),
In( :Simulated Y )
);
Al ejecutar esa sección de código se produce el siguiente error: Columna para cambiar no encontrada. y luego aparece la ventana donde se supone que debes seleccionar las columnas para entrar y salir.
report_of_interest es la ventana del informe donde envío el comando Simular. Específicamente a NumberColBox(8), que es la columna Estimación del informe. NBSnum y RSnum son el número de muestras de arranque que se ejecutarán y una variable inicial aleatoria. El problema es el nombre de la columna en Out( ) del comando Simulate( ). La columna In( ) no es un problema porque puedo nombrar la columna de datos simulados como quiera, pero la columna para la opción Out( ) no es una columna que realmente quiera cambiar de nombre ni nada por el estilo. En este caso, guardo los datos simulados en la tabla de datos y cambio el nombre de la columna a "Y simulada" para poder hacer referencia a ellos según sea necesario en el comando Simular como In(:Y simulado).
Anteriormente en el código, se solicita al usuario que seleccione la columna que será la columna de respuesta para el modelado, esta es YCols y, a menudo, cuando se trata de una columna en una plataforma, puede tenerla simplemente como Eval(YCols) y lo acepta muy bien, por ejemplo:
fm = avdt << Fit Model(
Y( Eval( YCols ) ),
Validation( :Validation ),
Effects( :Null Factor, Eval( XCols ) ),
Personality( "Generalized Regression" ),
Run( Fit( Estimation Method( Forward Selection ), Validation Method( Validation Column ) ) )
);
Ejecutará correctamente un modelo de ajuste en la columna Y( ). Sin embargo, el comando Simular () quiere que se haga referencia a la columna como una columna con ámbito, creo, como quiere que sea, :Mi columna al modelo, por ejemplo.
Digamos que la columna tiene el nombre "Mi columna al modelo", por lo que las variables YCols y Eval(YCols) devolverán lo siguiente {"Mi columna al modelo"}. Al enviar el comando de simulación al informe, desea el nombre de la columna con alcance, como el siguiente:
report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( :My Column To Model ),
In( :Simulated Y )
);
El problema es que la columna que estoy modelando puede cambiar, por lo tanto, su nombre cambia y no quiero cambiar el nombre de la columna para que siempre tenga un nombre fijo como: YData. Quiero trabajar con una variable como YCols, pero no sé cómo trabajar con el operador de dos puntos infijos (:) y una variable como YCols para tener la referencia de columna correcta para el comando Simular ().
Lo intenté como columna (dt, nombre), columna (dt, nombre), columna (número), parse(":"||char(Column(avdt, Eval(YCols)))), Parse(:" ||Eval(YCols)[1]), y ninguno de esos funciona. Todos dan como resultado el mismo error mencionado anteriormente y abren una nueva ventana para seleccionar las columnas para intercambiar Entrada/Salida, lo que niega la automatización que estoy intentando realizar.
Cualquier ayuda es muy apreciada.
¡Gracias!,
DS
Encontré una posible solución, pero ciertamente no es eficiente y es bastante engorrosa. Me imagino que hay mejores soluciones y espero que alguien pueda ayudarme.
Descubrí que si construyes la cadena para enviar el comando en JSL y usas Eval(Parse()) para hacerlo, entonces funciona. Nuevamente, es engorroso y no es eficiente, pero funciona.
str = Eval Insert(
"report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out("
);
str2 = Eval Insert( " ),
In( :Simulated Y )
)" );
Eval( Parse( str || ":" || Char( Eval( YCols )[1] ) || str2 ) );Solución extraña y espero que alguien tenga una mejor que pueda compartir.
¡Gracias!,
DS
También tengo problemas con cosas como esta.Puede que no sea la mejor solución, pero el siguiente código debería hacer lo que usted desea.*editar* Veo que ya encontraste un método similar.=)
Eval(
Parse(
"\[report_of_interest[Number Col Box( 8 )] << Simulate(
NBSnum,
Random Seed( RSnum ),
Out( ]\"
|| YCols[1] || "\[ ),
In( :Simulated Y )
);]\"
)
);
Si tengo que crear una lista de referencias de columnas y Eval no funciona, normalmente construyo las expresiones y luego uso Eval(Substitute())
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
cols = {"height", "weight"};
obj = Fit Model(
Y(:weight),
Effects(:age, :sex, :height),
Personality("Generalized Regression"),
Generalized Distribution("Normal"),
Run(
Fit(
Estimation Method(Lasso(Adaptive)),
Validation Method(AICc)
)
)
);
obj << (fit[1] << Save Simulation Formula);
rpt = Report(obj);
out_expr = Expr(Out());
For Each({colname}, cols,
Insert Into(out_expr, Name Expr(AsColumn(dt, colname)));
);
show(out_expr);
Eval(Substitute(
Expr(dtlst = rpt["Parameter Estimates for Original Predictors"][Number Col Box("Prob > ChiSquare")] <<SIMULATE></SIMULATE>Hola @mmarchandTSI y @jthi ,
Gracias por los comentarios y las ideas sobre cómo resolver este problema. No debería sorprenderme demasiado que existan varias formas diferentes de resolver el mismo problema con JMP/JSL. Una de las mejores cosas del software. Aun así, me parece interesante que no sea posible una solución "más sencilla". ¡Agradezco la ayuda!
Gracias,
DS