Les méthodes que nous utiliserions pour ajuster cela manuellement (c'est-à-dire l'analyse exploratoire des données) peuvent fonctionner remarquablement bien avec de telles données.
Je souhaite re- paramétrer légèrement le modèle afin de rendre ses paramètres positifs:
y= a x - b / x--√.
Pour un donné , supposons qu'il existe un vrai x unique satisfaisant cette équation; appelons cela f ( y ; a , b ) ou, pour être bref, f ( y ) lorsque ( a , b ) sont compris.yXF( y;a,b)f(y)( a , b )
Nous observons une collection de paires ordonnées où les x i s'écartent de f ( y i ; a , b ) par des variations aléatoires indépendantes avec des moyennes nulles. Dans cette discussion, je suppose qu'ils ont tous une variance commune, mais une extension de ces résultats (en utilisant les moindres carrés pondérés) est possible, évidente et facile à mettre en œuvre. Voici un exemple simulé d'une telle collection de 100 valeurs, avec a = 0,0001 , b = 0,1 , et une variance commune de σ( xje, yje)XjeF( yje; a , b )100a = 0,0001b = 0,1 .σ2= 4
Il s'agit d'un exemple (délibérément) difficile, comme peuvent l'apprécier les valeurs non physiques (négatives) et leur extraordinaire dispersion (qui est généralement de ± 2 unités horizontales , mais peut aller jusqu'à 5 ou 6 sur l' axe x ). Si nous pouvons obtenir un ajustement raisonnable à ces données qui se rapproche de l'estimation des a , b et σ 2 utilisés, nous aurons bien réussi.X± 2 56Xunebσ2
Un raccord exploratoire est itératif. Chaque étage est constitué de deux étapes: estimer (basé sur les données et les estimations précédentes un et b de a et b , à partir de laquelle les valeurs précédentes prédites x Au i peut être obtenue pour le x i ) et ensuite estimer b . Étant donné que les erreurs sont en x , les ajustements estiment le x i à partir de ( y i ) , plutôt que l'inverse. Ordonner d'abord les erreurs dans x , quand xuneune^b^unebX^jeXjebXje( yje)XX est suffisamment grand,
Xje≈ 1une( yje+ b^X^je--√) .
Par conséquent, nous pouvons mettre à jour un en ajustant ce modèle avec des moindres carrés (avis , il n'a qu'un seul paramètre - une pente, une --et pas ordonnée à l' origine) et en prenant l'inverse du coefficient que l'estimation mise à jour d' un .une^uneune
Ensuite, lorsque est suffisamment petit, le terme quadratique inverse domine et nous trouvons (là encore au premier ordre dans les erreurs) queX
Xje≈ b21 - 2 a^b^X^3 / 2y2je.
Encore une fois des moindres carrés (avec juste un terme de pente ) on obtient une estimation mise à jour b par la racine carrée de la pente aménagée.bb^
Pour voir pourquoi cela fonctionne, une approximation exploratoire grossière de cet ajustement peut être obtenue en traçant contre 1 / y 2 i pour le plus petit x i . Mieux encore, parce que les x i sont mesurés avec erreur et les y i changent de façon monotone avec les x i , nous devons nous concentrer sur les données avec les plus grandes valeurs de 1 / y 2 i . Voici un exemple de notre jeu de données simulé montrant la plus grande moitié du y iXje1 / an2jeXjeXjeyjeXje1/y2iyi en rouge, la plus petite moitié en bleu, et une ligne passant par l'origine correspond aux points rouges.
Les points s'alignent approximativement, bien qu'il y ait un peu de courbure aux petites valeurs de et y . (Remarquez le choix des axes: parce que x est la mesure, il est classique de la tracer sur l' axe vertical .) En focalisant l'ajustement sur les points rouges, où la courbure doit être minimale, nous devons obtenir une estimation raisonnable de b . La valeur de 0,096 indiquée dans le titre est la racine carrée de la pente de cette ligne: elle n'est que de 4 % inférieure à la valeur réelle!xyxb0.0964
À ce stade, les valeurs prévues peuvent être mises à jour via
x^i=f(yi;a^,b^).
Itérer jusqu'à ce que les estimations se stabilisent (ce qui n'est pas garanti) ou qu'elles parcourent de petites plages de valeurs (qui ne peuvent toujours pas être garanties).
axba^=0.0001960.0001b^=0.10730.1). Ce graphique montre une fois de plus les données sur lesquelles sont superposées (a) la vraie courbe en gris (en pointillés) et (b) la courbe estimée en rouge (solide):
3.734
Il y a quelques problèmes avec cette approche:
Code
Ce qui suit est écrit 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}
];
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]