Tengo datos que tienen la forma . Para la estimación de a utilizo las fórmulas de este documento: John Fox: Regresión no lineal y mínimos cuadrados no lineales En este documento, se estima observando los datos. Si lo hago, funciona bien, incluso si solo tengo tres puntos. A partir de eso puedo calcular los otros dos. Probé mis parámetros con nls () en R y LevenbergMarquardt en C #. Los modelos devueltos por ellos son satisfactorios.
El problema es que no quiero ver los datos para obtener un buen estimador de , quiero que mi programa lo calcule. Durante algún tiempo usé valores que eran un poco más altos que el máximo de mis valores (algo entre y \ max * 1.5 . Esto funcionó bien siempre que los puntos cubrieran la mayor parte de la función. También funcionó bien si el los puntos de datos estaban en algún lugar desde la "parte superior" de la curva, pero cuando todos provenían del área "debajo" del punto de inflexión, este estimador era definitivamente más bajo de lo que debería ser y no podía ajustar el modelo. Si uso algo eso es definitivamente más alto que el punto máximo (multiplicándolo con valores ridículamente altos) el modelo no se ajusta de ninguna manera útil.
Las medidas podrían verse así:
x = (40, 50, 60, 70), y = (1000, 950, 400, 200) -> fácil de estimar
x = (40, 50, 60, 70), y = (1000, 950, 800, 100) -> fácil de estimar
x = (40, 50, 60, 70), y = (500, 200, 100, 50) -> no es tan fácil de estimar
Supongo que podría averiguar dónde estoy en la función (en la "parte inferior", en la "parte superior", en la pendiente) calculando los deltas en los puntos dados y calculando un límite superior dependiendo de eso. ¿Alguien tiene una pista para una mejor solución? Información adicional: si no se puede hacer, es más importante para mí que las mediciones que se puedan ajustar sean lo mejor posible y acepto que algunas mediciones no se pueden ajustar en absoluto.
(aunque quiero una implementación en C #, la publiqué aquí, no creo que el problema dependa del idioma)
actualización (Aplicación de esto):
x son valores de temperatura y y las medidas correspondientes. Por naturaleza, se considera que debería verse como una curva logística con valores de y más altos a temperaturas más bajas y viceversa. El punto de fusión es igual al punto de inflexión de la curva, que cambia mucho con pequeños cambios en los parámetros del modelo.
actualización (algunos datos inventados con 7 puntos de datos y punto de inflexión conocido a 60):
//first I made up some data without any noise and enough (13) points
double[] x17 = { 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90 };
double[] y17 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 59.642....
//Then I took three different parts of that data
(to simulate how much data I will have in the real world)
double[] x18 = { 30, 35, 40, 45, 50, 55, 60 };
double[] y18 = { 2000, 1920, 1820, 1700, 1500, 1280, 1000 };
//calculated inflection point: 59.263.... is ok!
double[] x19 = { 60, 65, 70, 75, 80, 85, 90 };
double[] y19 = { 1000, 720, 500, 300, 180, 80, 0 };
//calculated inflection point: 53.447.... to small!
double[] x20 = { 45, 50, 55, 60, 65, 70, 75 };
double[] y20 = { 1700, 1500, 1280, 1000, 720, 500, 300 };
//calculated inflection point: 59.868... almost perfect!
Mi enfoque actual para una estimación de límite superior es y0 * y0 / y1. De esta manera, espero tener en cuenta que no siempre tengo un valor cercano al máximo.
actualización: los valores x e y nunca serán negativos. x siempre será {40, 45, 50, 55, 60, 65, 70} a menos que se pierda un punto de datos.
Actualización: hice muchas, muchas pruebas con datos simulados que deberían ser fáciles de ajustar (elijo puntos de datos que estaban exactamente en la curva = sin ruido) y veo que funciona bien, a menos que el primer o segundo punto de datos (donde x = 40 o x = 45) falta. Supongo que tendré que descartar esas medidas y el usuario tendrá que vivir con eso.