Ajuste no lineal: ¿cómo verificar el éxito?Descripción general:
¿Cómo puedo comprobar si se ha realizado correctamente un ajuste no lineal?
(Los datos reales no siempre convergen y pueden necesitar una revisión manual para problemas de automatización/prueba/producto).
Detalle:
Me gustaría escribir una respuesta después de que un ajuste no lineal no converja.Si el ajuste falla, necesito procesar de otra manera y/o eventualmente etiquetar para revisión manual. (Estoy muestreando una población, luego para cada parte, haciendo un ajuste no lineal.Generalmente, si fallo en la convergencia, hubo un problema de prueba en alguna parte; En realidad, no quiero aflojar los criterios de convergencia).
(Mensaje 'Error': "Error: No se puede disminuir la función del objetivo")

Secuencia de comandos modificada solo de derivados numéricos (Ayuda > Índice de secuencias de comandos > "<
(Actualmente ejecutando JMP 15.2.1)
Names Default To Here( 1 );
dt = Open(
"$SAMPLE_DATA/Nonlinear Examples/US Population.jmp"
);
// Random, intentionally divergent, formula on this dataset
dt << New Column( "Random", Numeric, Formula( Random LogLogistic(5) ) );
dt << New Column( "FancyPredictionFormula",
Numeric,
Continuous,
Formula(
Parameter(
{Rth0 = 735, n = 0.5},
(:year / :pop) * ((1 - ((n - 1) * :pop * Rth0) / (:year
* (300 / :year) ^ n)) ^ (-1 / (n - 1)) - 1)
)
)
);
nonlinear = dt << Nonlinear(
Y( :Name( "Random" ) ),
X( :Name("FancyPredictionFormula") ),
Expand Intermediate Formulas( 1 ),
Numeric Derivatives Only( 1 ),
QuasiNewton SR1,
Interation Limit(50),
Finish,
Plot( 0 ),
Confidence Limits,
Save Estimates
);
// How to check if nonlinear fit succeeded?
Ideal.
Si hay una variable de estado booleana devuelta por la plataforma de ajuste no lineal en algún lugar que indique éxito o fracaso, creo que ese sería el método ideal para verificar el éxito.
Alternativa 1.
También puedo tabular o hacer un resumen de los datos para ver si todos los : Nombre ( "Fórmula de predicción elegante" ) los valores son cero.(Los valores parecen ser 0 si falla el ajuste).
Alternativa 2.
Probablemente haya una forma de comprobar el XML y leer el mensaje de "fallido".
Gracias por su tiempo y consideración.
-Aubrey
secuencias de comandosRe: Ajuste no lineal - ¿Cómo verificar el éxito?Aquí hay un enfoque usando la Alternativa 2a (borrando las palabras del informe). Las primeras 2 líneas hacen el trabajo real, y la tercera línea es solo un ejemplo simple de qué hacer con la información; es probable que tengas algo más en mente para esta parte.
// How to check if nonlinear fit succeeded?
r = nonlinear << report;
alltext = r[Outline Box("Control Panel")] << get text;
if (contains(alltext, "Cannot Decrease"), caption ("Failed: Cannot Decrease ..."));Re: Ajuste no lineal - ¿Cómo verificar el éxito?Eso lo hará.¡Gracias Jed!
Re: Ajuste no lineal - ¿Cómo verificar el éxito?Me pregunto si una mejor verificación es si el texto es algo más que el éxito:
If( Not( Contains( alltext, "Converged" ) ),
// trap failure
,
// proceed after success
);
Re: Ajuste no lineal - ¿Cómo verificar el éxito?Estás más cerca de donde me dirijo con él.
He estado trabajando con:
if (contains(alltext, "Failed"), caption ("Failed: Do additional action now ..."));Como captura de todo, pero estoy considerando agregar más de una declaración de caso (o supongo que múltiples 'si'), para manejar específicamente el motivo del error.</CODE></P><P><CODE class=" language-jsl">
por ejemplo, puedo ejecutar de nuevo con un recuento de iteraciones más alto si detecto este motivo de error:
contains(alltext, "Maximum Iteration Exceeded");
La motivación real es que 'la mayoría' de las partes convergerán con un enfoque numérico, pero algunas parecen requerir análisis.No estoy seguro de qué está pasando para causar esto.¿Criterios de convergencia?Pero la 'solución' es volver a ejecutar sin derivadas numéricas, algo así como:
nonlinear = dt << Nonlinear(
Y( :Name( "Random" ) ),
X( :Name("FancyPredictionFormula") ),
Expand Intermediate Formulas( 1 ),
Newton,
Finish,
Plot( 0 ),
Confidence Limits,
Save Estimates
);Después de atrapar con:
contains(alltext, "Cannot Decrease Objective Function");
Re: Ajuste no lineal - ¿Cómo verificar el éxito?El culpable habitual de la falta de convergencia son los valores de los parámetros iniciales. A menudo es suficiente usar heurísticas específicas de dominio para inicializarlas cuando estén disponibles.