Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosTengo un modelo no lineal para el que he creado una nueva columna con la fórmula a continuación. 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 atribuí un valor inicial de 0.1 para facilitar el ajuste (no en el script a continuación). 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 estos valores de parámetros de acuerdo con el mejor ajuste. Me gustaría medir el mejor ajuste según el RMSE mínimo o el R2 máximo. Sin embargo, no tengo idea de cómo hacer esto. Creé una columna para la función de pérdida que estoy calculando como el SSQ entre los datos experimentales (: producción) y el modelo (: modelo) con la esperanza de que esto ayude al 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 tratando de automatizar estos análisis ya que 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 correcto 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 prevista.
Creo que las estimaciones de sus parámetros serán muy altas, por lo que será difícil converger. Una vez más, resolvería el problema utilizando Nonlinear de forma interactiva antes de intentar automatizarlo con un script.
Es posible que desee ponerse en contacto con el soporte técnico de JMP acerca de 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 Loss?Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetros¿Es este el modelo que está tratando de encajar:

La función de pérdida no debe usar 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 mediante la función Loss y, finalmente, falla. Al ejecutarlo 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. A continuación, 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 Terminar 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 cumple una de las reglas de parada (criterio). El límite predeterminado en el número de iteraciones es 60. Puede volver a ejecutar para hacer que Nonlinear trabaje más para obtener una buena solución. También puede cambiar (relajar o fortalecer) los otros criterios si es necesario.
En segundo lugar, la convergencia lenta podría ser una indicación de malas elecciones para los valores iniciales. ¿Cómo determinaste esos valores para tus datos?
Re: Cómo ajustar un modelo no lineal personalizado usando múltiples parámetrosMi experiencia en JSL es mínima. Acabo de empezar lamentablemente. Estoy usando JMP14. Gracias por la respuesta.
Modifiqué su secuencia de comandos como sugirió (a continuación) y la ejecuté. Me da las estimaciones, pero no ejecuta las iteraciones hasta "infinitas", como creo que solicitaría el comando: Finalizar. ¿Es eso correcto? Va solo 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ámetrosCon respecto al modelado no lineal, solo estoy familiarizado con establecer un criterio de convergencia, un objetivo.Hace muchos años, cuando la capacidad de cómputo era débil en comparación con la actual, normalmente usaba SAS para crear un ciclo de múltiples estimaciones iniciales y luego comparaba los resultados residuales. Así que no puedo ayudarte con tu solicitud de "mejor modelo".
No mencionó qué versión de JMP está utilizando, ni su conocimiento de secuencias de comandos. Para entender este script necesitas saber algo de sintaxis básica. A continuación se muestra una modificación de la secuencia de comandos de JMP Scripting Index>Objects>Nonlinear>CopyByGroupScript.
Él :
- crea una columna "por", para su ejemplo, esta sería su: columna de muestra
- 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 instrucciones "get". Ver JMP Scripting Index>Objects>Nonlinear para mensajes disponibles.
- Alternativamente, puede 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 con el botón 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 visualización. Find es menos flexible, pero sintácticamente más fácil de leer. La declaración Xpath a continuación 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, sé que estoy mirando la estructura.Todo lo que necesito es la primera aparición de estos cuadros de tabla para enviar el mensaje para hacer una tabla de datos combinados.
Esto debería darle un lugar para comenzar.Primero ejecute el siguiente script para asegurarse de que se ejecuta 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>