Estrategia para ajustar funciones altamente no lineales

12

Para analizar los datos de un experimento de biofísica, actualmente estoy tratando de hacer un ajuste de curva con un modelo altamente no lineal. La función del modelo se ve básicamente como:

y=ax+bx1/2

Aquí, especialmente el valor de b es de gran interés.

Una trama para esta función:

Diagrama de funciones

(Tenga en cuenta que la función del modelo se basa en una descripción matemática exhaustiva del sistema y parece funcionar muy bien, es solo que los ajustes automáticos son complicados).

Por supuesto, la función del modelo es problemática: las estrategias de adaptación que he probado hasta ahora fallan debido a la clara asíntota en , especialmente con datos ruidosos.x=0

Mi comprensión del problema aquí es que el ajuste simple de mínimos cuadrados (he jugado con regresión lineal y no lineal en MATLAB; principalmente Levenberg-Marquardt) es muy sensible a la asíntota vertical, porque los pequeños errores en x se amplifican enormemente .

¿Alguien podría señalarme una estrategia adecuada que podría solucionar esto?

Tengo algunos conocimientos básicos de estadística, pero todavía es bastante limitado. Estaría ansioso por aprender, si tan solo supiera dónde comenzar a buscar :)

¡Muchas gracias por tu consejo!

Editar Perdón por olvidarse de mencionar los errores. El único ruido significativo está en , y es aditivo.x

Edición 2 Alguna información adicional sobre los antecedentes de esta pregunta. El gráfico anterior modela el comportamiento de estiramiento de un polímero. Como @whuber señaló en los comentarios, necesita para obtener un gráfico como el anterior.b200a

En cuanto a cómo las personas han estado ajustando esta curva hasta este punto: parece que las personas generalmente cortan la asíntota vertical hasta que encuentran un buen ajuste. Sin embargo, la opción de corte sigue siendo arbitraria, lo que hace que el procedimiento de ajuste sea poco confiable e irreproducible.

Edición 3 y 4 Gráfico fijo.

onnodb
fuente
3
¿Los errores vienen en o en y o en ambos? ¿En qué forma espera que entre ruido (multiplicativo, aditivo, etc.)? xy
probabilidadislogica
2
@onnodb: Mi preocupación es, ¿podría esto no cuestionar fundamentalmente cuán robusto es su modelo en sí? No importa qué estrategia de adaptación utilice, ¿no será altamente sensible? ¿Alguna vez puede tener una gran confianza en tal estimación para b ? bb
curious_cat
1
Desafortunadamente, eso todavía no funcionará. Simplemente no hay combinación posible de y b que incluso cualitativamente reproducir la gráfica que ha dibujado. (Obviamente b es negativo. Una debe ser inferior a la menor pendiente en el gráfico, pero positiva, lo que lo pone en un intervalo estrecho. Pero cuando una está en ese intervalo, simplemente no es lo suficientemente grande como para superar la enorme pico negativo a el origen introducida por la b x 1 / 2 plazo.) ¿Qué has dibujado? ¿Datos? Alguna otra funcion? abbaabx1/2
whuber
1
Gracias, pero todavía está mal. Extensión de la tangente a este gráfico hacia atrás desde cualquier punto , donde x > 0 , se le interceptar el eje y en ( 0 , 3 b / ( 2 x 1 / 2 ) ) . Debido a que el pico descendente en 0 muestra b(x,ax+bx1/2)x>0(0,3b/(2x1/2))0bes negativo, esta intersección en y también tiene que ser negativa. Pero en su figura, está muy claro que la mayoría de estas intercepciones son positivas, extendiéndose hasta . Por lo tanto es matemáticamente imposible que una ecuación como y = un x + b x 1 / 2 puede describir su curva , ni siquiera aproximadamente. Como mínimo que necesita para adaptarse a algo así como Y = un x + b x 1 / 2 + c . 15.5y=ax+bx1/2y=ax+bx1/2+c
whuber
1
Antes de trabajar en esto, quería asegurarme de la declaración de la pregunta: por eso es importante hacer que la función sea correcta. No tengo tiempo para dar una respuesta completa ahora, pero me gustaría comentar que "otras personas" pueden estar equivocadas, pero depende de aún más detalles, por desgracia. Si su error es realmente aditivo, me parece que todavía debe ser fuertemente heterocedástico, ya que de lo contrario su varianza a valores pequeños de x sería realmente pequeña. ¿Qué nos puede decir, cuantitativamente, sobre ese error? xx
whuber

Respuestas:

10

Los métodos que usaríamos para ajustar esto manualmente (es decir, de Análisis de datos exploratorios) pueden funcionar notablemente bien con dichos datos.

Deseo volver a parametrizar ligeramente el modelo para que sus parámetros sean positivos:

y=axb/x.

Para una dada , supongamos que hay una x real única que satisface esta ecuación; llame a esto f ( y ; a , b ) o, por brevedad, f ( y ) cuando ( a , b ) se entiendan.yxf(y;a,b)f(y)(a,b)

Observamos una colección de pares ordenados donde la x i se desvía de f ( y i ; a , b ) por variables aleatorias independientes con medias cero. En esta discusión supondré que todos tienen una variación común, pero una extensión de estos resultados (usando mínimos cuadrados ponderados) es posible, obvia y fácil de implementar. Aquí hay un ejemplo simulado de tal colección de 100 valores, con a = 0.0001 , b = 0.1 y una varianza común de σ(xi,yi)xif(yi;a,b)100a=0.0001b=0.1 .σ2=4

Trama de datos

Este es un ejemplo difícil (deliberadamente), como se puede apreciar por los valores no físicos (negativos) y su distribución extraordinaria (que es típicamente ± 2 unidades horizontales , pero puede variar hasta 5 o 6 en el eje x ). Si podemos obtener un ajuste razonable a estos datos que se acerque a la estimación de a , b y σ 2 utilizados, lo haremos bien.x±2 56xabσ2

Un ajuste exploratorio es iterativo. Cada etapa consta de dos pasos: estimar (basado en los datos y anteriores estimaciones un y b de un y b , a partir del cual los valores predichos anteriores x i se pueden obtener para la x i ) y luego estimar b . Debido a que los errores están en x , los ajustes estiman el x i desde ( y i ) , en lugar de al revés. Al primer orden en los errores en x , cuando xaa^b^abx^ixibxi(yi)xx es suficientemente grande

xi1a(yi+b^x^i).

Por lo tanto, es posible actualizar un encajando con este modelo de mínimos cuadrados (aviso de que tiene sólo un parámetro - una pendiente, un --y sin intercepción) y tomando el recíproco del coeficiente como la estimación actualizada de una .a^aa

Luego, cuando es suficientemente pequeño, el término cuadrático inverso domina y encontramos (nuevamente al primer orden en los errores) quex

xib212a^b^x^3/2yi2.

Una vez más el uso de los mínimos cuadrados (con sólo un término de pendiente ) obtenemos una estimación actualizada b a través de la raíz cuadrada de la pendiente equipada.bb^

Para ver por qué esto funciona, se puede obtener una aproximación exploratoria cruda a este ajuste trazandoxi1/yi2xixiyixi1/yi2yi en rojo, la mitad más pequeña en azul, y una línea a través del origen se ajusta a los puntos rojos.

Figura

xyxb0.0964

En este punto, los valores pronosticados se pueden actualizar a través de

x^i=f(yi;a^,b^).

Itere hasta que las estimaciones se estabilicen (lo cual no está garantizado) o pasen por pequeños rangos de valores (que aún no se pueden garantizar).

axba^=0.0001960.0001b^=0.10730.1) Este gráfico muestra los datos una vez más, sobre los cuales se superponen (a) la curva verdadera en gris (discontinua) y (b) la curva estimada en rojo (sólido):

Encaja

3.734

Hay algunos problemas con este enfoque:

  • Las estimaciones son sesgadas. El sesgo se hace evidente cuando el conjunto de datos es pequeño y relativamente pocos valores están cerca del eje x. El ajuste es sistemáticamente un poco bajo.

  • yiyi

  • ab


Código

Lo siguiente está escrito en Mathematica .

estimate[{a_, b_, xHat_}, {x_, y_}] := 
  Module[{n = Length[x], k0, k1, yLarge, xLarge, xHatLarge, ySmall, 
    xSmall, xHatSmall, a1, b1, xHat1, u, fr},
   fr[y_, {a_, b_}] := Root[-b^2 + y^2 #1 - 2 a y #1^2 + a^2 #1^3 &, 1];
   k0 = Floor[1 n/3]; k1 = Ceiling[2 n/3];(* The tuning constants *)
   yLarge = y[[k1 + 1 ;;]]; xLarge = x[[k1 + 1 ;;]]; xHatLarge = xHat[[k1 + 1 ;;]];
   ySmall = y[[;; k0]]; xSmall = x[[;; k0]]; xHatSmall = xHat[[;; k0]];
   a1 = 1/
     Last[LinearModelFit[{yLarge + b/Sqrt[xHatLarge], 
          xLarge}\[Transpose], u, u]["BestFitParameters"]];
   b1 = Sqrt[
     Last[LinearModelFit[{(1 - 2 a1 b  xHatSmall^(3/2)) / ySmall^2, 
          xSmall}\[Transpose], u, u]["BestFitParameters"]]];
   xHat1 = fr[#, {a1, b1}] & /@ y;
   {a1, b1, xHat1}
   ];

xydata = {x,y}a=b=0

{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]}, 
                Norm[Most[#1] - Most[#2]] >= 0.001 &,  2, 100]
whuber
fuente
3
Esta es una respuesta asombrosa; Estoy muy obligado! He estado jugando con esto, y los resultados parecen muy prometedores. Sin embargo, necesitaré un poco más de tiempo para comprender completamente el razonamiento :) Además: ¿podría contactarlo a través de su sitio web para una pregunta adicional (privada) sobre los agradecimientos?
onnodb
3

Vea las preguntas importantes que @probabilityislogic publicó

y=yxyx=x3/21/x

b

x

-

Edite para considerar la información adicional:

y=b+ax

Ahora tenemos que los errores están en x y aditivos. Todavía no sabemos si la varianza es constante en esa escala.

x=y/ab/a=my+c

xo=x+ηx

oxo

xo=c+my+ϵϵ=ζxy

¡No estoy seguro de que eso mejore las cosas! Creo que hay métodos para ese tipo de cosas, pero en realidad no es mi área en absoluto.

Mencioné en los comentarios que le gustaría ver la regresión inversa, pero la forma particular de su función puede impedir llegar lejos con eso.

Incluso podría estar atrapado con probar métodos bastante robustos para errores en x en esa forma lineal.

-

y

x

Glen_b -Reinstate a Monica
fuente
x
2
" a pesar de que los errores están en x " - yikes, eso es algo importante. Es posible que desee verificar la regresión inversa.
Glen_b -Reinstalar a Monica
3
x=13(2ya+21/3y2(27a4b22a3y3+3327a8b44a7b2y3)1/3+(27a4b22a3y3+3327a8b44a7b2y3)1/321/3a2)
xoxox+ζx=(thatmonster)+ϵϵ=ζ
x(y)yb
0

Después de algunas semanas más de experimentación, una técnica diferente parece funcionar mejor en este caso particular: ajuste de mínimos cuadrados totales . Es una variante del ajuste de mínimos cuadrados habitual (no lineal), pero en lugar de medir los errores de ajuste a lo largo de solo uno de los ejes (que causa problemas en casos altamente no lineales como este), tiene en cuenta ambos ejes.

Hay una gran cantidad de artículos, tutoriales y libros disponibles sobre el tema, aunque el caso no lineal es más difícil de alcanzar. Incluso hay algo de código MATLAB disponible.

onnodb
fuente
yy
@whuber Gracias por expresar tus preocupaciones! En este momento, todavía estoy trabajando en ejecutar simulaciones para probar la confiabilidad de la adaptación TLS para este problema. Sin embargo, lo que he visto hasta ahora es que la consideración de TLS de ambas variables ayuda en gran medida a superar la alta no linealidad del modelo. Los ajustes de datos simulados son confiables y convergen muy bien. Sin embargo, se necesita más trabajo, y definitivamente tendré que apilar su método hasta este, una vez que tengamos más datos reales disponibles --- y analizar en detalle sus inquietudes.
onnodb
OK, ¡no olvide que tengo preocupaciones comparables sobre el método que propuse!
whuber