crear fórmula para generar columnas de matriz de diseño<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Soy un principiante en el uso de JMP y no puedo encontrar respuestas similares a mis preguntas en la comunidad de JMP. Supongamos que tengo una tabla de datos con varias columnas, y el usuario necesita seleccionar la columna de la tabla de datos y luego se generará una matriz de diseño de acuerdo con la columna seleccionada. La columna seleccionada y la matriz de diseño se crearán en una nueva tabla de datos. Pero esto no es suficiente. Si el usuario desea cambiar el valor en la columna seleccionada en la nueva tabla de datos, la matriz de diseño se actualizará en consecuencia. Mi problema es que no puedo actualizar la matriz de diseño correctamente con el siguiente código:
// crea una ventana para seleccionar la columna
// omitir algo de código para crear la ventana
ComprobarYConvertir = Expr(
columnas seleccionadas = c << Obtener elementos;
// Si las entradas son válidas, continuamos
Si (N elementos (columnas seleccionadas) > 0,
ganar << Cerrar ventana;
A = Columna (columnas seleccionadas);
s = A << ObtenerComoMatriz; // extrae la columna seleccionada en s
// crea la nueva tabla de datos "Matriz de diseño"
dt = Nueva tabla ("Matriz de diseño");
dt << Nueva columna("segmento", Numérico, Valores(s[0, 1])); // copia s a la columna "segmento" en la nueva tabla de datos
// crea las columnas correspondientes de la matriz de diseño y las agrega a la nueva tabla de datos
Para( i=1, i<=Col Max(dt:segmento), i++,
dt << Nueva Columna("X"||Char(i), Numérico,
después del último,
Fórmula(
Si(dt:rebanada == i, 1,
0
)
)
);
);
);
);
PD: puedo obtener la respuesta correcta cuando ejecuto el código sin cambiar el valor en la columna de división, pero no puedo actualizar las columnas X si cambio el valor de la división. Tenga en cuenta que el número de columnas X es el valor máximo en la columna de sector, que no se fija con valores diferentes. En las siguientes imágenes, muestro los ejemplos para seleccionar la columna 1 y la columna 2 en los datos de prueba.
Gracias de antemano,
pulong
Re: crear fórmula para generar columnas de matriz de diseñoMis disculpas. Leí su solicitud nuevamente y me di cuenta de que ninguna de las funciones de JSL ayudará en este caso. Están destinados a crear las columnas para los efectos de los factores categóricos para la regresión lineal.
Aquí hay un script que tomará la matriz con los niveles de los factores y creará la matriz con una columna para cada término en un polinomio cuadrático:
Names Default to Here( 1 );
x2fx = Function( { x }, { n factors, n treat, fx, f, f1, f2 },
n factors = N Col( x );
n treat = N Row( x );
fx = J( n treat, 1, 1 );
For( f = 1, f <= n factors, f++,
fx ||= x[0,f];
);
For( f1 = 1, f1 < n factors, f1++,
For( f2 = f1+1, f2 <= n factors, f2++,
fx ||= x[0,f1] :*</img> x[0,f2];
);
);
For( f = 1, f <= n factors, f++,
fx ||= x[0,f]^2;
);
fx;
);
X = [1 10,
2 20,
3 10,
4 20,
5 15,
6 15];
D = x2fx( X );
Show( D );
No es tan difícil hacer tus propias funciones.
Re: crear fórmula para generar columnas de matriz de diseñoConsulte Ayuda > Índice de secuencias de comandos. Cambie el navegador para mostrar Funciones. Luego seleccione el grupo de funciones Matrix. Aquí encontrará varias funciones para hacer la matriz del modelo (por términos) a partir de la matriz de diseño (niveles de factores).
Re: crear fórmula para generar columnas de matriz de diseño
Creo que tengo una pregunta similar, si no idéntica.
Quiero crear una matriz de diseño a partir de variables predictoras similares a x2fx en Matlab.
Por ejemplo: al seleccionar variables predictoras y especificar el tipo de diseño (interacciones de segundo orden) y luego generar la tabla de diseño.
Vea el ejemplo de Matlab a continuación: (pero quiero hacer esto en JMP).
Ejemplo 1
Lo siguiente convierte 2 predictores<FONT face="Courier New" size="3"> X1</FONT> y<FONT face="Courier New" size="3"> X2</FONT> (las columnas de<FONT face="Courier New" size="3"> X</FONT> ) en una matriz de diseño para un modelo cuadrático completo con términos<FONT face="Courier New" size="3"> constante</FONT> ,<FONT face="Courier New" size="3"> X1</FONT> ,<FONT face="Courier New" size="3"> X2</FONT> ,<FONT face="Courier New" size="3"> X1.*X2</FONT> ,<FONT face="Courier New" size="3"> X1.^2</FONT> , y<FONT face="Courier New" size="3"> X2.^2</FONT> .
X = [1 10
2 20
3 10
4 20
5 15
6 15];
D = x2fx(X,'quadratic')
D =
1 1 10 10 1 100
1 2 20 40 4 400
1 3 10 30 9 100
1 4 20 80 16 400
1 5 15 75 25 225
1 6 15 90 36 225 Re: crear fórmula para generar columnas de matriz de diseñoRealmente aprecio tu ayuda.
Ya he encontrado una solución a mi problema hoy.
Re: crear fórmula para generar columnas de matriz de diseñoBien, muchas gracias.
Entonces, parece que la pieza que falta es poder editar las celdas de una columna (numérica) en una ventana de informe, en cuyo caso puede usar 'NumberColEditBox ()'. Para una columna de caracteres, puede usar 'StringColEditBox'. Al combinar los dos, podría presentar cualquier tabla en una ventana del editor que controle su código (aunque supongo que tendría que omitir el estado de fila y las columnas de expresión):
Nombres predeterminados a aquí ( 1 ) ;
// Usar una columna numérica
dt = Abierto ( "$SAMPLE_DATA/Clase grande.JMP" ) ;
cNombre = "altura" ;
cVals = Columna ( dt , cNombre ) << obtener valores ;
// interfaz de usuario
noroeste = Nueva ventana ( "Editar celdas" , ceb = NúmeroColEditBox ( cNombre , cVals ) , BotónCuadro ( "Actualizar" , actualizar celdas )) ;
// Actualizar secuencia de comandos
actualizar celdas =
exp. (
noroeste << Cerrar ventana ;
nuevoVals = ceb << obtenerAsMatrix ;
dt << BeginDataUpdate ;
Columna ( dt , cNombre ) << establecer valores ( nuevoVals ) ;
dt << EndDataUpdate ;
) ;
Re: crear fórmula para generar columnas de matriz de diseñoGracias por tu respuesta. Su comprensión sobre el flujo de trabajo es precisamente lo que estoy haciendo.
Considere "Definir sector":
Ya he diseñado la ventana para lograr esta tarea.
Considere "Actualizar segmento":
La dificultad radica en la actualización automática de cualquier cambio que realice el usuario. Puedo generar la matriz de diseño, pero no sé cómo actualizar automáticamente la matriz de diseño si el usuario realiza algún cambio en la columna de corte. Además, si sé cómo actualizar automáticamente la matriz de diseño, no será un problema generar automáticamente otras columnas basadas en la matriz de diseño ajustando un poco el código.
Gracias,
pulong
Re: crear fórmula para generar columnas de matriz de diseñoMuchas gracias por tu explicación más detallada. ¿Quizás pueda repetirlo con diferentes palabras para asegurarme de haberlo entendido?
Supongamos que la primera tabla (que contiene todos los sectores posibles) se llama dt0. Pensando en los pasos clave anteriores:
- El usuario selecciona una columna (un segmento) en dt0 y crea una nueva tabla (llame a esto dt1) que contiene solo este segmento, más las columnas de la matriz de diseño (más las otras columnas derivadas que menciona, pero no las explica). .
- Desea que el usuario pueda modificar más tarde la columna de división en dt1 y que las otras columnas en dt1 se actualicen 'automáticamente'.
Me imagino que su complemento final tendría dos opciones de menú: 'Definir sector' y 'Actualizar sector'. Si mi descripción de 1. anterior es correcta, este script de 'Rebanada de diseño' se obtiene fácilmente modificando el código que ya sugerí: La tabla dt1 podría colocarse en una carpeta compartida para que otros puedan obtenerla, y puede agregar lo que sea metadatos que desee a la tabla o las columnas dentro de ella.
El script 'Actualizar segmento' podría presentar al usuario todas las tablas disponibles en la carpeta compartida y permitirle seleccionar una. En este punto, sin embargo, no editarían la tabla directamente: más bien, se les presentaría una ventana de informe que les permitiría modificar los valores de la columna de división en la tabla. Aquí, 'modificar' podría significar actualizar valores existentes o agregar nuevas filas. Cuando hacen clic en Aceptar en este informe para indicar que están contentos, dt1 podría actualizarse automáticamente para reflejar todos sus cambios, y también podría actualizar los metadatos según sea necesario. Por supuesto, este código de 'actualización' sería común con 'Definir sector'.
A menos que haya entendido mal, parece que este flujo de trabajo sería razonable, tal vez incluso mejor que dar a los usuarios acceso gratuito a dt1.
Re: crear fórmula para generar columnas de matriz de diseñoDado que esta es la primera vez que uso JMP, intentaré describir mi problema en el lenguaje del script JMP. Brevemente, tengo una tabla de datos, dentro de la cual existe una columna de "segmento", y quiero generar la matriz de diseño basada en la columna de segmento, y también generar algunas otras columnas basadas en la matriz de diseño. Lo que necesito hacer es desarrollar un complemento JMP que implemente esta tarea, para que otros colegas también puedan usar mi complemento para experimentos informáticos.
Primero, me gustaría desarrollar una ventana para seleccionar la columna de división y generar una tabla de datos que incluya la columna de división y la matriz de diseño, y guardar la fórmula para actualizar automáticamente la matriz de diseño si algunos valores en la columna de división se cambian más adelante . (Necesito guardar la fórmula, porque mi gerente de proyecto lo solicitó, pero podría convencerlo sin usar las columnas de fórmula si se me ocurre una solución mejor).
Ahora, puedo crear la ventana y generar la tabla de datos que incluye la columna dividida y la matriz de diseño, pero la matriz de diseño no se puede actualizar si cambio los valores en la columna dividida.
Con respecto a la columna cortada:
Sé que la función de diseño en JMP puede generar automáticamente la matriz de diseño, pero no es útil si quiero columnas de fórmula. Entonces escribí mi propia función para generar mi matriz de diseño, como se muestra en mi script. Supongamos que tengo la columna de segmento a = [1, 1, 2, 3]'. Entonces la matriz de diseño se generará como
1 0 0
1 0 0
0 1 0
0 0 1.
La columna dividida puede variar en tamaño y, por lo tanto, es difícil saber cuántas columnas tendrá la matriz de diseño mirando manualmente la columna dividida. Además, los valores en la columna dividida se pueden modificar arbitrariamente.
Creo que los pasos clave para crear generar la matriz de diseño son los siguientes:
1. seleccione la columna dividida, haga clic en el botón "Aceptar", luego se generará una nueva tabla, que incluye la columna dividida y la matriz de diseño. Claramente, este paso implica una intervención manual.
2. Si modifico manualmente algunos valores en la columna de división en la nueva tabla, la matriz de diseño original se eliminará automáticamente y se generará la matriz de diseño nueva correspondiente.
En segundo lugar, también necesito generar algunas columnas basadas en la matriz de diseño y también escribí el script para generarlas, pero no sé cómo guardarlas como columnas de fórmula. Este problema no será un problema si sé cómo guardar las columnas de fórmula para la matriz de diseño.
Por último, si tuviera éxito en crear la matriz de diseño y algunas columnas, las empaquetaría como un complemento y las probaría en muchas circunstancias diferentes.
Gracias por tu sugerencia. Avísame si me hago entender.
pulong
Re: crear fórmula para generar columnas de matriz de diseñoCiertamente podría estar equivocado (dependiendo de qué tan general necesite que sea su solución), pero no me parece que las columnas de fórmula sean la mejor manera de intentar esto. El hecho de que una columna en su tabla de origen (generalmente) se asigne a varias columnas, y el hecho de que el número de dichas columnas sea el número (variable) de niveles en la columna de origen hace que esto sea difícil.
Antes de ofrecer otra sugerencia, tal vez podría describir el flujo de trabajo que prevé con un poco más de detalle, por favor. Indique también qué pasos implican una intervención manual.
Re: crear fórmula para generar columnas de matriz de diseñoGracias por su amable ayuda.
Necesito generar una matriz de diseño a partir de una columna, de modo que también pueda actualizar la matriz de diseño si se modifican los valores de la columna. De hecho, quiero crear una fórmula para generar la matriz de diseño en función de las columnas seleccionadas y guardar la fórmula para poder actualizar la matriz de diseño si se modifican algunos valores en las columnas seleccionadas.
En mi código, se genera la matriz de diseño, pero no puedo obtener la matriz de diseño actualizada si cambio cierto valor en la columna seleccionada, que es el problema con el que estoy luchando. Realmente apreciaría si pudiera proporcionar alguna sugerencia sobre mi problema.
Gracias,
pulong
Re: crear fórmula para generar columnas de matriz de diseñoNo estaba muy seguro de lo que estabas buscando exactamente. Pero dado que es nuevo en JMP, el siguiente código puede darle algunas ideas.
Nombres predeterminados a aquí ( 1 ) ;
// tabla de prueba
dt = NuevaTabla ( "Prueba" ,
NuevaColumna ( "C1" , Numérico , Continuo , Fórmula ( Entero aleatorio ( 1 , 5 ))) ,
NuevaColumna ( "C2" , Numérico , Continuo , Fórmula ( Entero aleatorio ( 1 , 5 ))) ,
NuevaColumna ( "C3" , Numérico , Continuo , Fórmula ( Entero aleatorio ( 1 , 5 ))) ,
Agregar filas ( 10 )
) ;
// interfaz de usuario
Nueva ventana ( "Actualizar diseño" ,
PanelBox ( "Elige una columna para ver el diseño" ,
lubricante = AlinearCuadro ( NCol ( 2 ) ,
club = ColListBox ( dt , Todo , Numérico , MaxItems ( 1 ) , MinItems ( 1 ) , clbScript ) )
)
) ;
// Script para actualizar dinámicamente el cuadro de alineación lb dependiendo de la selección en clb
clbScript =
exp. (
// Obtener los valores en la columna seleccionada
vals = Columna ( dt , club << obtenerseleccionado ) << obtenerAsMatrix ;
// Eliminar cualquier cuadro de matriz existente
Intentar ( megabyte << borrar ) ;
// Obtenga la matriz de diseño en un cuadro de matriz
megabyte = MatrixBox ( Diseño ( vals )) ;
// Agregar el nuevo cuadro de matriz
lubricante << adjuntar ( megabyte ) ;
) ;