Cómo ajustar un modelo no lineal personalizado utilizando múltiples parámetrosTengo un modelo no lineal para el cual creé una nueva columna con la siguiente fórmula. El modelo se describe como similar a una curva sigmoidal con dos etapas definidas para las cuales tengo tres parámetros que caracterizan cada etapa. Una etapa inicial descrita por los parámetros K1, Y1 y P1 y una segunda etapa descrita por los parámetros K2, Y2 y P2. Además, para cada parámetro he creado una nueva columna y le he atribuido un valor inicial de 0,1 para facilitar el ajuste (no en el script siguiente). Sin embargo, los valores pueden variar ampliamente entre muestras de 0 a 1.
Tengo una lista de muestras para las que necesito ajustar el mismo modelo y recuperar los valores de estos parámetros según el mejor ajuste. El mejor ajuste que me gustaría medir en función del RMSE mínimo o el R2 máximo. Sin embargo, no tengo idea de cómo hacer esto. He creado una columna para la función de Pérdida que estoy calculando como el SSQ entre los datos experimentales (:Production) y el Modelo (:Model) con la esperanza de que esto ayude a la hora de ajustar el modelo.
col7 = New Column("Model");
col7<< set formula (Parameter({Y1_Y1_0 = 0.001, K1_K1_0 = 0.001, P1_P1_0 = 0.001, Y2_Y2_0 = 0.001, K2_K2_0 = 0.001, P2_P2_0 = 0.001},
Y1_Y1_0 * Exp(-Exp(((K1_K1_0 * Exp()) / Y1_Y1_0) * (P1_P1_0 - :Days))) + Y2_Y2_0 * Exp(-Exp(((K2_K2_0 * Exp()) / Y2_Y2_0) * (P2_P2_0 - :Days)))));
col8=newcolumn("Error");
col8<< set Formula(SSQ(:Production - :Model));
col8<<EVALFORMULA></EVALFORMULA>
Como ejemplo del script resultante al ajustar el modelo a una muestra
Nonlinear(
Y( :Methane Yield ),
X( :Model ),
Loss( :Err ),
Iteration Limit( 1000 ),
Numeric Derivatives Only( 1 ),
Unthreaded( 1 ),
Loss is Neg LogLikelihood( 1 ),
Newton,
Finish,
Where( :Sample == "M301" )
);
Estoy intentando automatizar estos análisis porque por ahora he estado usando Excel Solver.
¿Alguien podría proporcionar algún comentario sobre cómo ejecutar el ajuste del modelo automáticamente a través de todas las muestras en la tabla de datos y recuperar los parámetros para cuando RSME es mínimo (si estoy en lo cierto cuando la función de pérdida es mínima) o cuando R2 es máximo?
¿Se actualizarían automáticamente los valores de los parámetros en cada columna?
Gracias
Ivo
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosGracias.Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosLa función de pérdida predeterminada es de mínimos cuadrados, por lo que JMP eleva automáticamente al cuadrado la diferencia entre la respuesta observada y la respuesta predicha.
Creo que las estimaciones de sus parámetros serán altas, por lo que será difícil converger. Nuevamente, resolvería el problema usando No lineal de forma interactiva antes de intentar automatizarlo con un script.
Es posible que desee ponerse en contacto con el soporte técnico de JMP sobre este problema. (soporte@jmp.com)
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosSí, ese es el modelo que estoy usando. ¿Qué función debo usar entonces para especificar la función de pérdida?Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetros¿Es este el modelo que estás intentando adaptar?

La función de pérdida no debe utilizar la función SSQ(). La plataforma no lineal combinará la pérdida en cada fila automáticamente.
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosLos valores iniciales se utilizaron en función de los resultados obtenidos en Excel Solver para los mismos datos.
Es un poco sorprendente que JMP no logre resultados similares o que no logre una buena convergencia. Además, JMP tiene dificultades para ejecutar las iteraciones utilizando la función Loss y, finalmente, falla. Cuando se ejecuta sin función Loss no logra ninguna convergencia.
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosUn comentario más: recomiendo trabajar con Nonlinear de forma interactiva hasta que determine la mejor configuración. Probablemente será más rápido y más fácil de esta manera que intentar que el script funcione al mismo tiempo. Luego puede guardar el script para continuar con el desarrollo.
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosPrimero, la opción Finalizar no significa ir para siempre. Es lo mismo que hacer clic en el botón Ir en lugar del botón Paso en la interfaz de usuario. Continúa hasta que se alcanza una de las reglas de parada (criterio). El límite predeterminado en el número de iteraciones es 60. Puede ejecutarlo nuevamente para que Nonlinear trabaje más para obtener una buena solución. También puedes cambiar (relajar o fortalecer) los demás criterios si es necesario.
En segundo lugar, la lenta convergencia podría ser una indicación de malas elecciones para los valores iniciales. ¿Cómo determina esos valores para sus datos?
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosMi experiencia en JSL es mínima. Lamentablemente acabo de empezar. Estoy usando JMP14. Gracias por la respuesta.
Modifiqué su script como sugirió (a continuación) y lo ejecuté. Me da las estimaciones pero no ejecuta las iteraciones hasta "infinitas", como creo que solicitaría el comando: Finalizar. ¿Es eso correcto? Sólo llega hasta los 60. Por lo tanto, el ajuste de salida no es excelente y las estimaciones de los parámetros son demasiado altas o negativas, lo que significa que podría necesitar establecer restricciones de parámetros.
obj = Nonlinear(Y( :Methane Yield ), X( :Model ), Loss( :Err ), Finish(), By( :Sample ));
obj << go;
obj << get estimates;
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
fit_dt = (_xx[1]<<FIND></FIND>Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosEn cuanto al modelado no lineal, sólo estoy familiarizado con establecer un criterio de convergencia, un objetivo.Hace muchos años, cuando la potencia informática era débil en comparación con la actual, normalmente usaba SAS para crear un bucle de múltiples estimaciones iniciales y luego comparaba los resultados residuales. Así que no puedo ayudarle con su solicitud de "mejor modelo".
No mencionó qué versión de JMP está utilizando ni su conocimiento de secuencias de comandos. Para comprender este script es necesario conocer cierta sintaxis básica. A continuación se muestra una modificación del script desde JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Él :
- crea una columna "por", para su ejemplo esta sería su columna :Sample
- Asigna un identificador/referencia al informe, obj. Aquí usarías tu script cambiando Donde( :Muestra == "M301") a Por(:Muestra)
- demuestra cómo crear una lista de resultados con declaraciones "obtener". Ver Índice de secuencias de comandos JMP>Objetos>No lineal para mensajes disponibles.
- Alternativamente, puedes hacer tablas de resultados.Los informes JMP (obj) son una lista anidada de cuadros de visualización. Por ejemplo, desde la GUI, si tiene un cuadro de tabla determinado para uno por grupo y hace clic derecho y selecciona Crear tabla de datos combinados, entonces este JSL está haciendo lo mismo.XPath es un método general para encontrar cuadros de presentación. Find es menos flexible, pero sintácticamente más fácil de leer. La siguiente declaración XPath devuelve un identificador/referencia a cada cuadro de esquema en el informe obj que es una solución. Cada cuadro de esquema de solución tiene 2 cuadros de tabla, lo sé al mirar la estructura.Todo lo que necesito es la primera aparición de cada uno de estos cuadros de tabla para enviar el mensaje para crear una tabla de datos combinados.
Esto debería darle un lugar para comenzar.Primero ejecute el siguiente script para asegurarse de que se ejecute en su versión de JMP y luego modifíquelo. Aquí hay una imagen de una tabla de estimaciones para este script de ejemplo.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Nonlinear Examples/US Population.jmp" );
dt << New Column( "_bycol",
Character,
Nominal,
set values( Repeat( {"A", "B"}, N Rows( dt ) )[1 :: N Rows( dt )] )
);
obj = Nonlinear( Y( :pop ), X( :Name( "X-formula" ) ), Finish(), By( _bycol )) ;
obj << go;
//returns a list of vectors where each vector, contains the parameters estimates
obj << get estimates;
//also see Get SSE, Get Parameter Names, Get CI
//Alternately, make a table
_xx = obj << Xpath("//OutlineBox[@helpKey='Nonlinear Solution']");
//only 2 groups so only 2 are found; each contains two sub tables
fit_dt = (_xx[1]<<FIND></FIND>