【问题标题】:Interpolation between ECDF curvesECDF曲线之间的插值
【发布时间】:2015-08-26 09:11:27
【问题描述】:

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

现在我想插值以在它们之间制作曲线,但遵循下一个公式。例如以 10k 的价格估算 ECDF,应以 F(10k)=αF1+(1-α)F2 为指导;与 0

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

max_len = max(数值(F1),数值(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 绘制曲线似乎并不介于两者之间,也不是它们的插值。

【问题讨论】:

  • 我认为您没有正确使用我的代码。 F1F2 的曲线大约有 300 个元素,而 Fnew 的曲线是 25 个元素。你能提供F1F2在你的帖子中的内容吗?
  • F1 和 F2 添加的元素不超过 53 个。让我发布数据,您会发现两列的长度不同 F1 F2 24 59 4 9 208 5 225 6 6 69 2 28 12 191 4 4 66 23 19 39 22 194 53 2 129 40 86 55 78 2 26 262 56 41 2 63 7 62 6 163 10 5 14 10 4 13 1 61 2 2 4
  • 好的。我似乎误解了x 轴。 x 轴上有哪些值?你有这些吗?
  • 我管理它的唯一数据是之前发布的,然后我使用ecdf函数对数据> a1 = xlsread('Data.xlsx'); >[f1,x1] = ecdf(a1(:,[1]));所以在x轴上发布的数据是>2 2 4 6 7 10 12 19 22 24 26 53 56 66 78 86 129 208 225(我不能以正确的方式发布数据和代码)跨度>
  • 非常感谢您的帮助!非常感谢!

标签: matlab linear-interpolation ecdf


【解决方案1】:

如果您遵循该公式,则根本不需要 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

因此,alpha 对于您的 ff1 = 9.5kff2 = 11kfnew = 10k 将是:

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是什么。完成此操作后,您就可以将我们上面讨论的操作照常应用于新信号。

【讨论】:

  • 同意,您正确理解了我的问题。问题是我试图这样写,但它显示了一个错误:'Error using + Matrix dimensions must agree'。所以写这样的公式不知道它是否会给出一个向量或F1和F2之间的中间曲线的图形
  • 啊,我假设它们的长度相同。一般来说,我假设每个信号都不是?
  • 没错,那是因为这些是一段时间内的观察结果,观察者不能太频繁地更改价格,以使每个价格获得相同数量的观察。我应该用零填充向量还是有一个函数可以做我正在寻找的东西?
  • 嗯,好的。那么肯定需要插值。您必须采用较短的信号并进行插值,使其长度与较大的信号匹配,然后才能工作。让我修改我的帖子。
  • @ChristianNoack - 立即尝试。
猜你喜欢
  • 2023-03-19
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2021-01-05
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多