Modifique un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas especialesEstoy buscando crear una copia de este cuadro de diálogo de efectos de modelo a partir del modelo de ajuste:

El objetivo es crear una secuencia de comandos que lea esta expresión de efectos desde la secuencia de comandos del modelo que DOE guarda en la tabla, permita a las personas modificar la expresión del efecto y luego ejecutar 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 del modelo almacenado en la tabla. Lo coloca en el cuadro de lista que se parece 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-”, lo que se convierte en una expresión matemática incompleta. operación en lugar de un nombre de columna. Entonces, ¿cómo aplico las reglas especiales de nombres de columnas 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>
Modelado estadístico avanzadoInvestigación de Consumidores y MercadosLa personalización en masaIngeniería de Calidad y ProcesosRe: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas especiales¡Gracias!
Sí, estoy tratando de admitir todos los nombres de las columnas porque yo no las 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 lugar de eso, voy a ver si puedo lograrlo incrustando Ajustar modelo 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 algunas funciones de esa manera (recuperación y otros cuadros de columnas que se pueden completar), pero vale la pena tener un generador de expresiones de efectos robusto.
Re: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas 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 crea este tipo de columnas, considere, por ejemplo, usar \{ \} en lugar de [ ] y \# en lugar de *. Si, por otro lado, está intentando admitir cualquier nombre de columna posible, puede recorrer los nombres de las columnas, realizando 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 podrá volver a cambiarlos cuando finalice el script.
Además: ¿existe un equivalente de palabras() 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 crea listas de este tipo con tanta frecuencia, ¿tal vez una función sería útil? Tenga en cuenta que debe ajustar la expresión en nameexpr() cuando 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: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas especialesHola,
Me pregunto si sería posible agregar ":Name(ColumnName)" 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: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas especiales@brady_brady Casi lo tengo resuelto, pero todavía hay un problema con el que me encuentro: 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ás que los elementos que salen del cuadro de lista son solo cadenas. Si uso palabras() con el divisor "*" o "[]", obtengo demasiadas divisiones y los resultados ya no son 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 ajustar el modelo. También necesito una lista de todas las columnas involucradas en cualquiera de los términos para otra parte del guión.
Si conoce una solución, considere que el cuadro de diálogo de ajuste del modelo permite anidar y cruzar con más de 2 variables.
En el otro sentido, analizando la expresión de efectos del script modelo, podría utilizar la función Arg() para extraer columnas y completar el cuadro de lista, pero volviendo atrás, esto no funciona ya que es de tipo cadena.
Además: ¿existe un equivalente de palabras() 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: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas 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 comprobarlo.
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 ("" actualmente. Informaré una vez que haya tenido algo de tiempo para profundizar.
Pensándolo bien, podría ser mejor llamar/reutilizar el elemento Construir efectos del modelo desde el cuadro de diálogo Ajustar modelo enviando al usuario a interactuar con esa ventana y luego volver a leer la expresión de efectos desde esa ventana. Aunque no tan bonito.
Re: Modificar un modelo antes de ejecutar el modelo de ajuste, el cuadro de lista no respeta los nombres de columnas especialesUna forma de hacerlo es construyendo expresiones. Una ventaja importante de este enfoque es que, a diferencia de los enfoques basados en cadenas, el código permanece coloreado, es fácil de leer y requiere un mínimo de caracteres de escape. El flujo en este caso particular es:
- Definir y construir la expresión de respuesta,
- Definir y desarrollar la expresión de efectos.
- Definir una expresión Ajustar 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 try() para permitir ejecuciones repetidas.
Para intentarlo, reemplace el código de su caja de botones("OK"...) con el siguiente código. 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;
)