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)*F2
和 alpha
在 [0,1]
之间得到 F(10k)
... 如果我正确解释你的问题。
在 alpha
的情况下,这是 F1
处的值与 F2
处的值之间的分数。在您的情况下,这很简单:
alpha = (ffnew - ff1) / (ff2 - ff1)
ff1
和ff2
是你想要的值之间的价格,也就是ffnew
。您可以验证如果 ffnew = ff1
,则 alpha = 0
并且您会得到原始的 F2
曲线。类似地,如果 ffnew = ff2
,则 alpha = 1
,因此您将获得原始的 F1
曲线。 F1
和 F2
之间的任何价格值,您只需要明智地指定 alpha
.
因此,对于 ff1 = 9.5k
和 ff2 = 11k
以及 fnew = 10k
的情况,alpha
将是:
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...
因此,假设F1
和F2
分别是9.5k
和11k
处的曲线:
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;
第一行代码找到信号的两个长度中最大的一个。接下来我们确保 F1
和 F2
的长度相同。结果是其中一个不会改变,但另一个会扩展以匹配更大的信号。以上是为了确保两个信号的长度相同,而不管 F1
和 F2
是什么。执行此操作后,您可以在新信号上正常应用我们上面讨论的操作。
我有 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)*F2
和 alpha
在 [0,1]
之间得到 F(10k)
... 如果我正确解释你的问题。
在 alpha
的情况下,这是 F1
处的值与 F2
处的值之间的分数。在您的情况下,这很简单:
alpha = (ffnew - ff1) / (ff2 - ff1)
ff1
和ff2
是你想要的值之间的价格,也就是ffnew
。您可以验证如果 ffnew = ff1
,则 alpha = 0
并且您会得到原始的 F2
曲线。类似地,如果 ffnew = ff2
,则 alpha = 1
,因此您将获得原始的 F1
曲线。 F1
和 F2
之间的任何价格值,您只需要明智地指定 alpha
.
因此,对于 ff1 = 9.5k
和 ff2 = 11k
以及 fnew = 10k
的情况,alpha
将是:
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...
因此,假设F1
和F2
分别是9.5k
和11k
处的曲线:
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;
第一行代码找到信号的两个长度中最大的一个。接下来我们确保 F1
和 F2
的长度相同。结果是其中一个不会改变,但另一个会扩展以匹配更大的信号。以上是为了确保两个信号的长度相同,而不管 F1
和 F2
是什么。执行此操作后,您可以在新信号上正常应用我们上面讨论的操作。