I metodi che utilizzeremmo per adattarli manualmente (vale a dire di Exploratory Data Analysis) possono funzionare molto bene con tali dati.
Desidero rimodellare leggermente il modello per rendere positivi i suoi parametri:
y= a x - b / x--√.
Per un dato , supponiamo che ci sia un unico x reale che soddisfi questa equazione; chiama questo f ( y ; a , b ) o, per brevità, f ( y ) quando ( a , b ) sono compresi.yXf( y; a , b )f( y)( a , b )
Osserviamo una raccolta di coppie ordinate cui la x i si discosta da f ( y i ; a , b ) per variate casuali indipendenti con mezzi zero. In questa discussione assumerò che tutti abbiano una varianza comune, ma un'estensione di questi risultati (usando i minimi quadrati ponderati) è possibile, ovvia e facile da implementare. Ecco un esempio simulato di una tale raccolta di 100 valori, con a = 0,0001 , b = 0,1 e una varianza comune di σ( xio, yio)Xiof( yio; a , b )100a = 0,0001b = 0,1 .σ2= 4
Questo è un esempio (deliberatamente) difficile, come si può apprezzare con i valori non fisici (negativi) e la loro straordinaria diffusione (che è in genere ± 2 unità orizzontali , ma può variare fino a 5 o 6 sull'asse x ). Se riusciamo ad ottenere una misura ragionevole di questi dati che si avvicina molto alla stima di a , b e σ 2 usati, avremo fatto davvero bene.X± 2 56Xun'Bσ2
Un adattamento esplorativo è iterativo. Ogni fase consiste di due fasi: stimare (sulla base dei dati e precedenti stime un e b di un e b , da cui valori previsti precedenti X i può essere ottenuto per il x i ) e quindi stimare b . Poiché gli errori sono in x , gli accoppiamenti stimano la x i da ( y i ) , anziché viceversa. Al primo ordine negli errori in x , quando xun'un'^B^un'BX^ioXioBXio( yio)XX è sufficientemente grande,
Xio≈ 1un'( yio+ b^X^io--√) .
Pertanto, potremmo aggiornare un montando questo modello con i minimi quadrati (avviso ha un solo parametro - pendio, un --e non intercetta) e prendendo il reciproco del coefficiente come stima aggiornata di un .un'^un'a
Successivamente, quando è sufficientemente piccolo, il termine quadratico inverso domina e troviamo (di nuovo al primo ordine negli errori) chex
xi≈b21−2a^b^x^3/2y2i.
Ancora una volta utilizzando i minimi quadrati (con solo un termine di pendenza ) otteniamo una stima aggiornata tramite la radice quadrata della pendenza adattata.bb^
Per capire perché funziona, è possibile ottenere un'approssimazione esplorativa approssimativa a questo adattamento tracciando contro per più piccolo . Meglio ancora, poiché viene misurato con errore e cambia monotonicamente con , dovremmo concentrarci sui dati con i valori maggiori di . Ecco un esempio del nostro set di dati simulato che mostra la metà più grande di in rosso, la metà più piccola in blu e una linea attraverso l'origine che si adatta ai punti rossi. 1 / y 2 i x i x i y i x i 1 / y 2 i y ixi1/y2ixixiyixi1/y2iyi
I punti approssimativamente allineati, anche se c'è un po 'di curvatura ai piccoli valori di ed . (Nota la scelta degli assi: poiché è la misura, è convenzionale tracciarlo sull'asse verticale .) Focalizzando l'adattamento sui punti rossi, dove la curvatura dovrebbe essere minima, dovremmo ottenere una stima ragionevole di . Il valore di mostrato nel titolo è la radice quadrata della pendenza di questa linea: è solo il % in meno rispetto al valore reale!y x b 0,096 4xyxb0.0964
A questo punto i valori previsti possono essere aggiornati tramite
x^i=f(yi;a^,b^).
Iterate fino a quando le stime non si stabilizzano (cosa non garantita) o passano attraverso piccoli intervalli di valori (che non possono ancora essere garantiti).
x b un = 0.000196 0,0001axba^=0.0001960.0001b^=0.10730.1curva in grigio (tratteggiata) e (b) la curva stimata in rosso (solido):
3.734
Ci sono alcuni problemi con questo approccio:
Codice
Quanto segue è scritto in 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}
];
x
y
data = {x,y}
a=b=0
{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]},
Norm[Most[#1] - Most[#2]] >= 0.001 &, 2, 100]