我们将手动使用的方法(即探索性数据分析)可以很好地处理此类数据。
我希望稍微重新参数化模型,以使其参数为正:
y=ax−b/x−−√.
对于给定的,让我们假设存在一个满足该方程的唯一实数;调用此或为简化起见,时被理解。x f (y ; a ,b )f (y )(a ,b )yxf(y;a,b)f(y)(a,b)
我们观察到有序对的集合,其中通过零均值的独立随机变量与偏离。在本讨论中,我将假定它们都有一个共同的方差,但是这些结果的扩展(使用加权最小二乘)是可能的,显而易见的并且易于实现。这是这种值的集合的模拟示例,其中,和公共方差。(xi,yi)xif(yi;a,b)100a=0.0001b=0.1σ2=4
这是一个(故意的)强硬示例,可以通过非物理(负)值及其异常扩展(通常为水平单位,但在轴上范围最多为或)来理解。如果我们能够对这些数据进行合理的拟合,从而接近估计所使用的,和,那么我们的确会做得很好。x±2 56xabσ2
探索性拟合是迭代的。 每个阶段包括两个步骤:估计(基于数据和以前的估计和的和,从该前一预测值可以为所获得的),然后估算。因为误差在x中,所以拟合从估计,而不是相反。首先对中的误差进行排序,当足够大时,aa^b^abx^ixibxi(yi)xx
xi≈1a(yi+b^x^i−−√).
因此,我们可以更新由拟合该模型与最小二乘(通知它只有一个参数-的斜率, --and没有截距)并取倒数系数作为更新估计。a^aa
接下来,当足够小时,逆二次项占主导地位,我们发现(误差再次回到一阶)x
xi≈b21−2a^b^x^3/2y2i.
再次使用最小二乘(仅带有斜率项),我们通过拟合斜率的平方根获得更新的估计。bb^
为了了解为什么这样做有效,可以通过针对较小的将对于绘制出粗略的探索性近似值。更好的是,因为的测量误差且随单调变化,所以我们应该关注具有较大值。这是来自模拟数据集的示例,其中的最大一半用红色表示,最小的一半用蓝色表示,并且一条通过原点的线适合于红色点。xi1/y2ixixiyixi1/y2iyi
这些点近似对齐,尽管在和的较小值处存在一些曲率。(请注意选择轴:因为是测量值,通常将其绘制在垂直轴上。)通过将拟合集中在曲率应该最小的红点上,我们应该获得的合理估计。标题中显示的值是这条线的斜率的平方根:仅比真实值小%!xyxb0.0964
此时,可以通过以下方式更新预测值
x^i=f(yi;a^,b^).
迭代直到估计值稳定(不保证)或它们在较小的值范围内循环(仍然不能保证)。
事实证明,很难估计,除非我们有一个很好的一套非常大的值,但,可呈现确定原作情节的垂直渐近线(在这个问题),是question--的焦点只要垂直渐近线内有一些数据,就可以非常精确地固定下来。 在我们正在运行的示例中,迭代的确收敛为(几乎是正确值两倍)和(接近了正确值)。该图显示一次的数据,在其上叠加(一)真axba^=0.0001960.0001b^=0.10730.1灰色曲线(虚线)和(b)红色估计曲线(实线):
这种拟合非常好,以至于很难将真实曲线与拟合曲线区分开:它们几乎在任何地方都重叠。顺便提及,估计的误差方差非常接近的真实值。43.734
这种方法存在一些问题:
估计数有偏差。当数据集较小且相对较少的值接近x轴时,偏差会变得明显。系统地拟合度有点低。
估计过程需要一种方法,以从 “小”值中区分出“大” 。我可以提出探索性的方法来识别最佳定义,但实际上,您可以将它们保留为“调整”常数,并对其进行更改以检查结果的敏感性。我通过根据的值将数据分为三个相等的组并使用两个外部组来任意设置它们。ÿ 我yiyi
该过程不适用于和所有可能组合或所有可能的数据范围。但是,只要在数据集中显示足够多的曲线以反映两个渐近线,它就应该工作良好:一端是垂直的,另一端是倾斜的。bab
码
以下是用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]