Extraiga la fórmula de predicción sin tener que guardar la fórmula en la tabla de datos<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy escribiendo un script para ajustar un conjunto de modelos lineales generalizados a unos datos y luego extraer el AIC, etc. para promediar el modelo. Debido a la forma en que JMP codifica las variables categóricas en la matriz de diseño para modelos lineales generalizados (JMP utiliza una codificación de suma a cero en lugar de una codificación de puntos de esquina), es difícil modelar el promedio de las predicciones utilizando los coeficientes estimados informados en el modelo. encajar (una de las categorías nunca se muestra y necesitaría hacer una programación extensa para recrearla). Parece que sería más fácil simplemente usar la fórmula de predicción de la plataforma y luego aplicar las ponderaciones del modelo a estas predicciones en una fórmula grande.
Sin embargo, hasta donde puedo ver, necesito guardar la fórmula de predicción en la tabla de datos para CADA modelo, y luego puedo extraer la fórmula y guardarla para usarla en otro lugar usando algo como
ajuste del modelo << fórmula de predicción ;
modelopredfórmula = carbonizarse ( Columna ( datos , "Fórmula P(PA)" ) << Obtener fórmula ()) ;
donde "Fórmula P(PA)" es la fórmula prevista. Luego puedo guardar la fórmula de predicción del modelo (en forma de caracteres) en mi tabla resumida AIC y eventualmente crear una súper fórmula que es una suma ponderada de las fórmulas individuales...
Sin embargo, esto ralentiza considerablemente el script porque las predicciones se calculan para toda la tabla de datos y tengo que agregar y eliminar la columna para cada ajuste del modelo.
Entonces, ¿hay alguna manera de extraer la fórmula de predicción real de un ajuste de modelo SIN tener que guardar primero la columna en la tabla de datos y hacer que JMP realmente haga los cálculos?
Gracias
Carl Schwarz
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosA partir de JMP Pro 13.0, existe una forma más sencilla de " ¿Extraer la fórmula de predicción real de un ajuste de modelo SIN tener que guardar primero la columna en la tabla de datos y hacer que JMP realmente haga los cálculos?". Esto es exactamente lo que hacen la "Fórmula de predicción de publicación" y sus variaciones; La fórmula generada por el ajuste del modelo se almacena directamente en una nueva plataforma JMP llamada Depósito de fórmulas . Desde allí puede aplicarlo a otras tablas (compatibles), generar código de puntuación (en múltiples lenguajes de programación) para su implementación e iniciar plataformas JMP como Profiler y Model Comparison. Este último tiene un comando Model Averaging que creo que implementa su objetivo final de crear un conjunto.
Lamentablemente, el comando Publicar aún no se ha agregado para la plataforma de modelo lineal generalizado que está utilizando. Pero está disponible para muchas otras plataformas de modelado predictivo: neuronal, de partición y de mínimos cuadrados estándar, por nombrar algunas.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datossi, para evaluar dt, es solo
dt; o si quieres algo más sofisticado, eval(dt);
la función abierta puede aceptar un par de argumentos diferentes. En muchos casos, el orden de los argumentos no importa, en este caso sí. inset into se suma al final de la lista de argumentos en la función a menos que especifiques que debe ir en un orden determinado con el tercer argumento que no usé aquí.
Es cierto que esto puede parecer realmente extraño, pero es muy conveniente.
Al envolver la declaración abierta en una expresión, puedo agregar o eliminar argumentos antes de que se evalúe.
insertar en esencialmente agrega "invisible", excepto que no es una cadena que deba analizarse.
insertar en agrega el contenido de invis con un pequeño giro, si solo insertaba invis, entonces insertaría el invis evaluado, no quería eso, así que envolví invis en "nombre expr".name expr(invis) se evaluará como "invisible" y además agrega lo común como separador. entonces name eval agrega el texto de la expresión sin que nunca sea texto.Desafortunadamente, cuanto más intento explicar esto, peor suena.
En JSL básicamente podrías comenzar con una expresión de una función vacía y llenarla con todas las partes y piezas que necesites.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosGenial... pero realmente no entiendo cómo 'insertar en' sabe dónde insertar la expresión "invis" en la expresión "dt". ¿Supongo que Expr "parsea" la expresión para hacer algún tipo de árbol y luego "insertar en" simplemente agrega el argumento "invis" como una hoja más en el árbol?
No entiendo lo suficiente cómo se pasan los argumentos a las funciones en JMP. Vengo de una experiencia en R donde es posicional o argumento = valor y encuentro que el uso de JMP de cosas como Invisible en la función Open() es un poco extraño porque no es una cadena). ¿Alguna buena referencia para esta forma de llamar funciones?
No lo he probado todavía, pero supongo que necesitas evaluar la expresión 'dt' para abrir la tabla de datos real.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosligeramente diferente y sin análisis
corre silencioso = 1 ;
invisible = Expr. ( invisible ) ; //esto no es una cadena ni una lista y no se evalúa
dt = Expr. ( Abierto ( "$SAMPLE_DATA/Gran Clase.jmp" ) ) ;
Si ( corre silencioso == 1 , i insertar en ( dt , Nombre Expr ( invisible ) ) ) ; //usa Name Expr para devolver el símbolo de la expresión sin evaluarlo.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosGracias por las sugerencias... A mi también se me ocurrió
// El indicador runsilent a continuación es útil para la depuración. Configúrelo en 0 para que todo sea visible. 1 para correr en silencio
corre silencioso = 0 ;
evaluar ( analizar gramaticalmente ( "datos = Abrir( \!"SPPI_ Data_JMP_Revised.jmp\!""|| si ( corre silencioso , ",\!"invisible\!"" , " " ) || ");" )) ;
Tenga en cuenta que tuve que incluir la coma con la cadena "invisible" para hacer un expreso que funcione si runsilent=0 para evitar tener argumentos "vacíos" en la llamada.
Carl.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosInvisible es una palabra clave, por lo que no es tan fácil de establecer como parámetro.Normalmente solo uso declaraciones IF:
Mi distribución = Función ({ dt , columna , hacer invisible } , { Local predeterminado } ,
Si ( hacer invisible ,
dt << Distribución ( Invisible , Columna ( evaluar ( columna ) ) )
,
dt << Distribución ( Columna ( evaluar ( columna ) ) )
)
) ;
dt = Abierto ( "$SAMPLE_DATA/Gran Clase.jmp" ) ;
Mi distribución ( dt , "altura" , 1 ) ;
Si desea establecerlo como parámetro, puede crear el comando como una cadena, luego analizarlo y ejecutarlo:
Mi distribución = Función ({ dt , columna , hacer invisible } , { Local predeterminado } ,
Si ( hacer invisible ,
palabra clave = "Invisible"
,
palabra clave = ""
) ;
evaluar ( Analizar gramaticalmente ( Insertar evaluación ( "\[
dt << Distribución( ^palabra clave^, Columna( "^col^" ) )
]\" ))) ;
) ;
dt = Abierto ( "$SAMPLE_DATA/Gran Clase.jmp" ) ;
Mi distribución ( dt , "altura" , 1 ) ;
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosLos informes del ajuste nunca aparecen en la pantalla, pero nunca los hice invisibles explícitamente. Veo que hay una opción "invisible" para lanzar ataques...
Cuando especifico la opción invisible en el inicio de la plataforma, se reduce el tiempo de 45 segundos a 30 segundos.
La tabla de datos original es visible (en la que se guardan sucesivamente las fórmulas de predicción) y la tabla de datos de resumen final (donde se agregan sucesivamente los resultados de cada ajuste de modelo) también es visible. Intenté hacer invisible la tabla de datos original y eso realmente acelera las cosas (ahora hasta 15 segundos) incluso agregando o eliminando las columnas de predicción.
La tabla de resultados finales se creó sucesivamente para poder ver las filas que se agregaban sucesivamente. ¡También lo hizo invisible y redujo el tiempo nuevamente a 8 segundos!
Por lo tanto, el cuello de botella parece estar relacionado con las operaciones de pantalla en lugar de subyacer al tiempo de CPU.
Ahora los tiempos revisados (en el guión acelerado final) son
56% ajuste de modelo
13% generando informes de modelos
12% cierra el informe modelo (¿aunque sea invisible?)
Al mirar mi registro, mi línea
ajuste del modelo << fórmula de predicción ;
activó un mensaje de advertencia sobre la falta de un operador booleano. Si lo cambio a
ajuste del modelo << fórmula de predicción (1) ;
el script todavía funciona bien sin un mensaje de advertencia. Sin embargo, parece que no puedo encontrar ninguna documentación en la Referencia de sintaxis JSL o en la Guía de secuencias de comandos sobre qué
ajuste del modelo << fórmula de predicción (0) ;
¿haría? Intentaré escribir un pequeño guión para ver si este último tampoco evalúa la fórmula de predicción.
Ahora estoy intentando modificar el script para que la opción "invisible" pueda configurarse sobre la marcha. quiero hacer algo como
ejecuta silencioso = 1;
datos << open("bla", if(ejecutar en silencio, "Invisible"));
pero JMP siempre se detiene en ese punto... Siempre tengo problemas sobre cómo hacer que los mensajes sean dinámicos cuando se necesitan palabras de código "cableadas". De vuelta a los libros....
Carl.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosCon respecto a los tiempos, ¿intentó hacer que la ventana del informe fuera "invisible"? Solo tengo curiosidad por saber si esto afecta la cifra anterior del 23%.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosGracias Ian y Dave. No pude encontrar la fórmula de predicción en ninguna parte del árbol ShowProperties, por lo que supongo que no se calcula hasta que la solicita una acción de guardar columna.
Probé mi script con y sin suprimir la evaluación de la fórmula. Sin suprimir la fórmula, fueron necesarios 45 segundos. Con la supresión de la fórmula se necesitaron 44 segundos. Supongo que me equivoqué al suponer que la evaluación de la fórmula tomó una gran cantidad de tiempo en comparación con los ajustes del modelo real, la extracción del informe y el almacenamiento de información en una nueva tabla de datos (resumen).
No se me ocurrió intentar perfilar el guión. Acabo de hacer esto. Aquí están los resultados
11% del tiempo dedicado a montar los modelos
13% del tiempo dedicado a la creación de los informes.
El 47% del tiempo dedicado a eliminar la columna que se usó para cada modelo para las predicciones usando: datos << eliminar columnas ("Fórmula P(PA)");
23% del tiempo dedicado a cerrar la ventana del informe después de extraer la información usando: informe de modelo << cerrar ventana;
¡Esto me pareció sorprendente!
carlos
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosFWIW, creo que Dave puede tener razón. Hay mensajes '<< Obtener estimaciones' y '<< Obtener componentes de variación', pero no siempre están disponibles (dependiendo de la naturaleza del ajuste). Podría valer la pena usar 'ShowProperties()' en su caso específico para verlo.
Re: Extraer fórmula de predicción sin tener que guardar la fórmula en la tabla de datosNo estoy seguro de que haya una manera de hacer lo que quieres.El enfoque que tomo es suprimir la evaluación de fórmulas antes de guardar las fórmulas de predicción:
dt << Suprimir evaluación de fórmula (1)