ECDF 曲线之间的插值

Interpolation between ECDF curves

我有 6 条曲线描述了以固定价值购买的门票数量的 ECDF。

现在我想插值以在它们之间制作曲线,但要遵循下一个公式。例如,以 10k 的价格估算 ECDF,应遵循 F(10k)=αF1+(1-α)F2; 0<α<1 。我绘制的曲线是通过 ecdf 函数得到的。我正在尝试执行 interp1 来模拟观察,但它无法以新价格模拟观察。

所以我尝试使用@rayryeng 制作的代码

max_len = max(numel(F1),numel(F2)); F1_interp = interp1(1:numel(F1), F1(:).', linspace(1,numel(F1),max_len)); F2_interp = interp1(1:numel(F2), F2(:).', linspace(1,numel(F2),max_len));

阿尔法 = (10e3 - 9.5e3) / (11e3 - 9.5e3); Fnew = alpha*F1_interp + (1-alpha)*F2_interp;

得到下一条曲线

但是用 F1 和 F2 绘制曲线似乎并没有介于两者之间或它们之间的插值。

如果您遵循该公式,则根本不需要 interp1。你可以通过认真地计算 alpha*F1 + (1-alpha)*F2alpha[0,1] 之间得到 F(10k)... 如果我正确解释你的问题。

alpha 的情况下,这是 F1 处的值与 F2 处的值之间的分数。在您的情况下,这很简单:

alpha = (ffnew - ff1) / (ff2 - ff1)

ff1ff2是你想要的值之间的价格,也就是ffnew。您可以验证如果 ffnew = ff1,则 alpha = 0 并且您会得到原始的 F2 曲线。类似地,如果 ffnew = ff2,则 alpha = 1,因此您将获得原始的 F1 曲线。 F1F2 之间的任何价格值,您只需要明智地指定 alpha.

因此,对于 ff1 = 9.5kff2 = 11k 以及 fnew = 10k 的情况,alpha 将是:

alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...

因此,假设F1F2分别是9.5k11k处的曲线:

alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1 + (1-alpha)*F2;

以上假定您的信号长度相同。如果不是,那么您必须对较小的信号进行插值,使其在长度上与较大的信号相匹配。 interp1 是这里使用的工具(恕我直言)。您可以将键/控制点指定为 F1 中的点。但是,interp1 需要 (x,y) 对,而我们没有任何 x 值……y 值虽然来自 F1。因此,您会人为地将 x 值创建为递增的数值向量。我能想到的最简单的一个是从 1 到与较小信号中一样多的值的向量。要扩展信号,您将生成另一个向量,该向量再次从 1 到较小信号中的多个值,但我们将创建点数以成为较大信号 linspace.

因此,尝试这样的事情:

max_len = max(numel(F1),numel(F2));
F1_interp = interp1(1:numel(F1), F1(:).', linspace(1,numel(F1),max_len));
F2_interp = interp1(1:numel(F2), F2(:).', linspace(1,numel(F2),max_len));

alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1_interp1 + (1-alpha)*F2_interp2;

第一行代码找到信号的两个长度中最大的一个。接下来我们确保 F1F2 的长度相同。结果是其中一个不会改变,但另一个会扩展以匹配更大的信号。以上是为了确保两个信号的长度相同,而不管 F1F2 是什么。执行此操作后,您可以在新信号上正常应用我们上面讨论的操作。