Metody, których użylibyśmy, aby dopasować to ręcznie (to znaczy eksploracyjną analizę danych), mogą zadziałać wyjątkowo dobrze z takimi danymi.
Chciałbym nieco sparametryzować model , aby jego parametry były dodatnie:
y= a x - b / x--√.
Dla danego , załóżmy, że istnieje unikalny rzeczywisty spełniający to równanie; nazwij to lub, dla zwięzłości, gdy zrozumiemy .x f ( y ; a , b ) f ( y ) ( a , b )yxfa( y; a , b )fa( y)( a , b )
Obserwujemy zbiór uporządkowanych par gdzie odbiegają od przez niezależne losowe zmienne ze średnimi zerowymi. W tej dyskusji założę, że wszystkie mają wspólną wariancję, ale rozszerzenie tych wyników (przy użyciu ważonych najmniejszych kwadratów) jest możliwe, oczywiste i łatwe do wdrożenia. Oto symulowany przykład takiej kolekcji wartości wartości , i wspólnej wariancji .x i f ( y i ; a , b ) 100 a = 0,0001 b = 0,1 σ 2 = 4( xja, yja)xjafa( yja; a , b )100a = 0,0001b = 0,1σ2)= 4
Jest to (celowo) trudny przykład, co można docenić przez niefizyczne (ujemne) wartości i ich niezwykły rozkład (który zwykle wynosi jednostki poziome , ale może wynosić do lub na osi ). Jeśli uda nam się uzyskać rozsądne dopasowanie do tych danych, które są bliskie oszacowania zastosowanych wartości , i , naprawdę zrobimy to dobrze.± 2 5 6 x a b σ 2x± 2 56xzabσ2)
Wyposażenie eksploracyjne jest iteracyjne. Każdy etap składa się z dwóch etapów: oszacowanie (w oparciu o dane i wcześniejszych oszacowań i z i , z których poprzednie wartości przewidywanych można uzyskać za ), a następnie oszacuj . Ponieważ błędy są w x , dopasowania szacują na podstawie , a nie na odwrót. Aby najpierw uporządkować błędy w , gdy jest wystarczająco duże,b a b x i x i b x I ( r i ) x xzaza^b^zabx^jaxjabxja( yja)xx
xja≈ 1za( yja+ b^x^ja--√) .
W związku z tym, możemy aktualizować montując ten model z najmniejszych kwadratów (zawiadomienie to ma tylko jeden parametr - zboczu, --and nie przechwycenia) oraz biorąc odwrotność współczynnika jako zaktualizowanego oszacowania .za^zaza
Następnie, gdy jest wystarczająco małe, dominuje odwrotny kwadratowy wyraz i stwierdzamy (ponownie w celu pierwszego uporządkowania błędów), żex
xja≈ b2)1 - 2 a^b^x^3 / 2y2)ja.
Po ponownym użyciem metody najmniejszych kwadratów (z tylko zbocze termin ) otrzymujemy zaktualizowanej estymaty B przez pierwiastek kwadratowy z zamontowanym zbocza.bb^
Aby zrozumieć, dlaczego to działa, surowy rozpoznawcza przybliżenie tego ataku można uzyskać przez wykreślenie przed 1 / r 2 i dla mniejszych X í . Jeszcze lepiej, ponieważ x i mierzy z błędem, a Y i zmienia się monotonicznie z x i , powinniśmy skupić się na danych z większych wartości 1 / r 2 í . Oto przykład z naszego symulowanego zbiorze pokazując największą połowę y Ixja1 / y2)jaxjaxjayjaxja1 / y2)jayja na czerwono, najmniejsza połowa na niebiesko, a linia przechodząca przez początek pasuje do czerwonych punktów.
Punkty w przybliżeniu się wyrównują, chociaż przy małych wartościach i y występuje trochę krzywizny . (Zwróć uwagę na wybór osi: ponieważ x jest pomiarem, zwykle wykreśla się go na osi pionowej .) Skupiając dopasowanie na czerwonych punktach, w których krzywizna powinna być minimalna, powinniśmy uzyskać rozsądne oszacowanie b . Podana w tytule wartość 0,096 jest pierwiastkiem kwadratowym nachylenia tej linii: to tylko 4 % mniej niż prawdziwa wartość!xyxb0,0964
W tym momencie prognozowane wartości można zaktualizować za pomocą
x^ja= f( yja; za^, b^) .
Iteruj, aż oszacowania ustabilizują się (co nie jest gwarantowane) lub przejdą przez małe przedziały wartości (których nadal nie można zagwarantować).
Okazuje się, że jest trudne do oszacowania, chyba że mamy dobry zestaw bardzo dużych wartości x , ale to b - co determinuje pionową asymptotę na oryginalnym wykresie (w pytaniu) i jest w centrum pytania - można przypiąć dość dokładnie, pod warunkiem, że w pionowej asymptocie znajdują się pewne dane. W naszym przykładzie systemem iteracje są zbieżne dla a = 0.000196 (który jest prawie dwukrotnie prawidłowa wartość 0,0001 ) oraz b = 0,1073 (który jest zbliżony do właściwej wartości 0,1zaxbza^= 0,0001960,0001b^= 0,10730,1). Ten wykres pokazuje dane jeszcze raz, na które nakładają się (a) prawdziwa krzywa w kolorze szarym (przerywanym) i (b) oszacowana krzywa w kolorze czerwonym (ciągłym):
To dopasowanie jest tak dobre, że trudno jest odróżnić prawdziwą krzywą od dopasowanej krzywej: pokrywają się prawie wszędzie. Nawiasem mówiąc, szacowana wariancja błędu jest bardzo zbliżona do prawdziwej wartości 4 .3,734
Z tym podejściem wiążą się pewne problemy:
Szacunki są tendencyjne. Odchylenie staje się widoczne, gdy zestaw danych jest mały i stosunkowo niewiele wartości znajduje się w pobliżu osi x. Dopasowanie jest systematycznie trochę niskie.
Procedura szacowania wymaga metody powiedzieć „duże” z „małych” wartości . Mógłbym zaproponować eksploracyjne sposoby identyfikacji optymalnych definicji, ale w praktyce można je pozostawić jako stałe „dostrajające” i zmieniać je, aby sprawdzić czułość wyników. Ustawiłem je arbitralnie, dzieląc dane na trzy równe grupy zgodnie z wartością yi i używając dwóch zewnętrznych grup.yjayja
Procedura nie będzie działać dla wszystkich możliwych kombinacji i B lub wszystkich możliwych zakresów danych. Powinien on jednak działać dobrze, ilekroć w zestawie danych jest wystarczająca liczba krzywych, aby odzwierciedlić obie asymptoty: pionową na jednym końcu i ukośną na drugim końcu.zab
Kod
W Mathematica napisano poniżej .
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}
];
Zastosuj to do danych (podanych przez wektory równoległe x
i y
uformowanych w macierz dwukolumnową data = {x,y}
) aż do zbieżności, zaczynając od oszacowań :a = b = 0
{a, b, xHat} = NestWhile[estimate[##, data] &, {0, 0, data[[1]]},
Norm[Most[#1] - Most[#2]] >= 0.001 &, 2, 100]