Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especialesEstoy buscando construir una copia de este cuadro de diálogo de efectos de modelo desde el modelo de ajuste:

El objetivo es crear una secuencia de comandos que lea esta expresión de efectos a partir de la secuencia de comandos del modelo que el DOE guarda en la tabla, permitir que las personas modifiquen la expresión del efecto y luego ejecuten algunos análisis utilizando el modelo de ajuste con la nueva expresión de efectos.
Si ejecuta el cuadro de diálogo en el siguiente script, verá que lee la expresión de efectos del script modelo almacenado en la tabla. Pone eso en el cuadro de lista que se asemeja a Ajustar modelo, le permite modificarlo y luego, cuando presiona Aceptar, intenta analizar el cuadro de lista en una nueva expresión de efectos e iniciar un cuadro de diálogo de modelo de ajuste personalizado con esa nueva expresión.
El problema/diferencia está en la columna de nombre especial: en la expresión original se almacena como: nombre ("Altura-") pero al recuperar esa expresión del cuadro de lista, se almacena como "Altura-", que se convierte en un matemático incompleto. operación en lugar de un nombre de columna. Entonces, ¿cómo aplico las reglas de nombres de columnas especiales a los elementos de este cuadro de lista? Lo mismo se aplica a los términos cruzados y anidados con la columna de nombre especial.
dt=Open("$SAMPLE_DATA/Big Class.jmp");
dt:height << Set Name( "Height-" );
FitModelScript = dt << Get table variable( "Fit Model" );
i = 1;
try(
While( !Is Empty( arg_i = Arg( parse(FitModelScript), i ) ),
If( Starts With( Char( Name Expr( arg_i ) ), "Effects" ),
EffectsExpr = Name Expr( arg_i );
Break();
,
i++
)
);
);
New Window( "Test",
Border Box( Left( 3 ), top( 2 ),
v list box(
H List Box(
Panel Box( "Select Columns",
v list box(
colListData = Col list box( All, width( 253 ), grouped, nLines( 20 ) ),
Spacer box(size(1,2))
)
),
Panel Box( "Cast Selected Columns into Roles",
Lineup Box( N Col( 2 ), Spacing( 3 ),
Button Box( "Response columns", colListYbox << Append( colListData << GetSelected ) ),
colListYbox = Col List Box( width( 200 ), nLines( 20 ), numeric, MinItems( 1 ) ),
)
),
Panel Box( "Model effects",
H List Box(
V List Box(
Button Box( "Main", LB << Append( colListData << GetSelected ) ),
Button Box( "Interact",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
For( k = 1, k <= N Items( SelectedColumns ) - i, k++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i + k] ) )
)
);
),
Button Box( "Quadratic",
SelectedColumns = colListData << GetSelected();
For( i = 1, i <= N Items( SelectedColumns ), i++,
LB << Append( concat(SelectedColumns[i], " * ", SelectedColumns[i] ) )
);
),
Button Box( "Nest",
colListX = colListData << GetSelected();
For( i = 1, i <= N Items( colListX ), i++,
If(Column(colListX[i]) << Get Modeling Type() != "Nominal",
New window("Error",<<MODAL>0,
For( i = 1, i <= N Items( MainNest ), i++,
If(Contains(colListX, MainNest[i])==0,
LB << Append(concat(MainNest[i], "[", concat items(colListX, ", "), "]"));
LB << Remove Item(contains(LB << Get items( ),MainNest[i]));
,
New window("Error", <<MODAL></MODAL></MODAL>
secuencias de comandosRe: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especiales¡Gracias!
Sí, estoy tratando de admitir cada nombre de columna porque no los creo. Cambiar el nombre es la única solución que encontré que realmente funciona, pero no me gusta cambiar las tablas de datos de las personas, ni siquiera temporalmente. En su lugar, voy a ver si puedo llegar allí incrustando el modelo Ajustar directamente en el cuadro de diálogo de la nueva ventana y dejar que eso maneje la creación de la expresión de efectos. Pierdo algo de funcionalidad de esa manera (recuperación y otros cuadros de columnas que se pueden rellenar), pero vale la pena tener un generador de expresión de efectos robusto.
Re: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especialesSi los nombres de las columnas contienen los mismos caracteres que se utilizan para cruzar o anidar términos...
La forma más sencilla es evitar que esto ocurra. Si su secuencia de comandos está creando tales columnas, considere, por ejemplo, usar \{ \} en lugar de [ ] y \# en lugar de *. Si, por otro lado, está tratando de admitir cualquier nombre de columna posible, puede recorrer los nombres de las columnas, haciendo sustituciones como las mencionadas anteriormente, después de mostrar una ventana de advertencia modal que informa al usuario que los nombres de las columnas deben cambiarse temporalmente. Luego, puede volver a cambiarlos cuando finalice el script.
Además: ¿hay palabras () equivalentes para extraer todos los argumentos de un tipo de expresión? Ahora termino teniendo que escribir bucles para extraer todos los argumentos de una expresión.
No conozco una función análoga a las palabras para argumentos de expresión. Si está creando listas de este tipo con tanta frecuencia, ¿tal vez una función ayudaría? Tenga en cuenta que debe envolver la expresión en nameexpr() a medida que la pasa a la función.
Salud,
Brady
exp = Expr( note( a, b, c ) );
argList = function({ex},
{aList = {}, i=1},
While( i <= N Arg( ex ), Insert Into( aList, Arg( ex, i++ ) ) );
aList
);
argList(nameexpr(exp));
Re: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especialesHola,
Me pregunto si sería posible agregar ": Nombre (Nombre de columna)" alrededor de cada nombre de columna y si eso resolvería el problema.Una forma de hacer esto podría ser usando Regex().He escrito algo que creo que puede ser un paso en esta dirección, pero aún no es perfecto.¿Quizás alguien con más conocimiento de Regex podría ayudar con esto?:
colnames=dt<<GET column="" names=""></GET>
Re: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especiales@brady_brady Casi lo tengo resuelto, pero todavía me encuentro con un problema: si los nombres de las columnas contienen los mismos caracteres que se usan para cruzar o anidar términos, ¿cómo los divide en columnas cuando regresa de un cuadro de lista?
dt = New Table( "Test",
Add Rows( 3 ),
Compress File When Saved( 1 ),
New Column( "SCR[12]*34",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [1, 2, 3] )
),
New Column( "SCR5[a]*",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [3, 2, 3] )
),
New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [4, 1, 4] )
)
);
new window("test", LB = list box());
LB << append((Column(1) << get name()) || " * " || (Column(2) << get name()));
LB << append((Column(1) << get name()) || "[" || (Column(2) << get name()) || "]");
LB << get items();Notará que los elementos que provienen del cuadro de lista son solo cadenas. Si uso palabras () con el divisor "*" o "[]", obtengo demasiadas divisiones y los resultados ya no son una referencia de columna. Necesito dividir cada elemento en sus componentes para poder envolverlos en :Name(" ") y volver a anidarlos/cruzarlos y agregarlos a la expresión de efectos para el modelo de ajuste. También necesito una lista de todas las columnas involucradas en cualquiera de los términos para otra parte del script.
Si conoce una solución, tenga en cuenta que el cuadro de diálogo Modelo de ajuste permite anidar y cruzar con más de 2 variables.
Yendo hacia el otro lado, analizando la expresión de efectos del script del modelo, podría usar la función Arg() para extraer columnas y completar el cuadro de lista, pero retrocediendo, esto no funciona ya que es de tipo cadena.
Además: ¿hay palabras () equivalentes para extraer todos los argumentos de un tipo de expresión? Ahora termino teniendo que escribir bucles para extraer todos los argumentos de una expresión.
Re: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especialesGracias Brady, investigaré esto. Principalmente me pregunto cómo manejará los términos cruzados, interactivos y anidados, pero tendré que jugar un poco con eso para verificar.
También necesito ver si puedo hacer algo similar al importar un modelo existente con estos términos en el cuadro de lista, ya que esto muestra el "Nombre(" cosas actualmente. Informaré una vez que haya tenido algo de tiempo para profundizar.
Pensando en ello, en realidad podría ser mejor llamar/reutilizar el elemento Efectos de modelo de construcción desde el cuadro de diálogo Ajustar modelo enviando al usuario a interactuar con esa ventana y luego leer la expresión de efectos de esa ventana. Aunque no tan bonito.
Re: Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columna especialesUna forma de hacerlo es construyendo expresiones. Un beneficio importante de este enfoque es que, a diferencia de los enfoques basados en cadenas, el código permanece coloreado, se lee fácilmente y requiere una cantidad mínima de caracteres de escape. El flujo en este caso particular es:
- Defina y construya la expresión de respuesta,
- Definir y construir la expresión de efectos,
- Defina una expresión de ajuste de modelo con marcadores de posición,
- Sustituya las expresiones de respuesta y efecto en los marcadores de posición en la expresión Ajustar modelo y
- Ejecute la expresión Ajustar modelo.
Nota: Comenté la opción "invisible" y envolví el cambio de nombre de la columna en un intento () para permitir ejecuciones repetidas.
Para intentarlo, reemplace su código buttonbox ("OK" ... ) con el código a continuación. Se debe ingresar una columna en el cuadro de lista de la columna Respuesta antes de hacer clic en "Aceptar".
Salud,
Brady
Button Box( "OK",
respList = colListYbox << get items();
respExpr = expr(Y());
for(i=1, i<=nitems(respList), i++,
insertinto(respExpr, parse(evalinsert(":name(\!"^respList[i]^\!")")))
);
effectsList = lb << get Items;
effectsExpr = expr(Effects());
for(i=1, i<=nitems(effectsList), i++,
insertinto(effectsExpr, parse(evalinsert(":name(\!"^effectsList[i]^\!")")))
);
jslExpr = expr(
try(FitModelDialogWindow << closewindow());
FitModelDialogWindow = Fit Model(
//invisible,
_Y_,
_EFFECTS_,
Keep dialog open( 1 ),
Personality( "Standard Least Squares" ),
Emphasis( "Effect Leverage" )
);
);
substituteInto(jslExpr,
expr(_Y_), nameexpr(respExpr),
expr(_EFFECTS_), nameexpr(effectsExpr)
);
jslExpr;
)