【问题标题】:Arbitrary distribution -> Uniform distribution (Probability Integral Transform?)任意分布 -> 均匀分布(概率积分变换?)
【发布时间】:2011-08-22 07:33:48
【问题描述】:

我有 500,000 个来自金融市场的变量值。具体来说,该变量表示与平均值的距离(以标准差为单位)。该变量具有任意分布。我需要一个公式,让我可以围绕这个变量的任何值选择一个范围,以便相等(或接近它)数量的数据点落在该范围内。

这将使我能够分析特定范围内的所有数据点,并将它们视为“与输入类似的情况”。

据我了解,这意味着我需要将其从任意分布转换为均匀分布。我已经阅读(但几乎不理解)我正在寻找的东西称为“概率积分变换”。

谁能帮助我编写一些代码(首选 Matlab,但这并不重要)来帮助我完成此任务?

【问题讨论】:

  • 概率积分变换只是一个应用于随机变量的函数,以便将其转换为均匀分布。不过,你的问题不是很清楚。所以你有一些生成随机数据的东西?你想获得均匀分布的数据吗?你想用这些数据做什么?
  • @Oli 我从金融市场收集了这个变量。具体来说,它代表了当前时间点偏离价格标准的偏差。我希望能够围绕这个变量的任何可能值选择一个范围,以便相同数量的数据点落在这个范围内。这将使我能够分析特定范围内的所有数据点,并将它们视为“与输入类似的情况”
  • 啊哈。因此,您希望能够选择某个范围的中点,并指定诸如“我想要捕获例如 10% 样本的范围的宽度”之类的内容?

标签: matlab statistics transform distribution probability


【解决方案1】:

这是我快速整理的内容。它不是完美的,也不是完美的,但它可以做你想做的事情。

clear
randList=[randn(1e4,1);2*randn(1e4,1)+5];
[xCdf,xList]=ksdensity(randList,'npoints',5e3,'function','cdf');
xRange=getInterval(5,xList,xCdf,0.1); 

而函数getInterval

function out=getInterval(yPoint,xList,xCdf,areaFraction)
    yCdf=interp1(xList,xCdf,yPoint);
    yCdfRange=[-areaFraction/2, areaFraction/2]+yCdf;

    out=interp1(xCdf,xList,yCdfRange);

说明:

随机分布的 CDF 如下图蓝色线所示。您提供一个点(此处为getInterval 的输入中的5),您想要一个范围为您提​​供10% 的区域(输入0.1getInterval)。选择的点用红叉标记, 间隔由绿色线条标记。您可以从原始列表中获取位于此区间内的对应点为

newList=randList(randList>=xRange(1) & randList<=xRange(2));

您会发现,平均而言,此示例中的点数约为 2000,即 numel(randList) 的 10%

numel(newList)

ans =

        2045

注意:

  • 请注意,这很快就完成了,我没有检查所选点是否超出范围或yCdfRange 是否超出[0 1],在这种情况下interp1 将返回@987654335 @。这很容易实现,我将把它留给你。
  • 另外,ksdensity 占用大量 CPU。我不建议将npoints 增加到超过1e4。我假设您只使用固定列表(即,您有一个 5e5 点列表,您已经以某种方式获得,现在您只是在运行测试/分析它)。在这种情况下,您可以运行一次ksdensity 并保存结果。

【讨论】:

  • 哇太棒了!太感谢了!!我会在一个小时左右尝试一下。
【解决方案2】:

我不会说 Matlab,但您需要在数据中找到分位数。这是可以执行此操作的 Mathematica 代码:

In[88]:= data = RandomVariate[SkewNormalDistribution[0, 1, 2], 10^4];

计算分位数:

In[91]:= q10 = Quantile[data, Range[0, 10]/10];

现在形成一对连续的分位数:

In[92]:= intervals = Partition[q10, 2, 1];

In[93]:= intervals

Out[93]= {{-1.397, -0.136989}, {-0.136989, 0.123689}, {0.123689, 
  0.312232}, {0.312232, 0.478551}, {0.478551, 0.652482}, {0.652482, 
  0.829642}, {0.829642, 1.02801}, {1.02801, 1.27609}, {1.27609, 
  1.6237}, {1.6237, 4.04219}}

验证分割点是否几乎均匀地分离数据:

In[94]:= Table[Count[data, x_ /; i[[1]] <= x < i[[2]]], {i, intervals}]

Out[94]= {999, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000}

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2014-09-15
    • 1970-01-01
    • 2011-04-04
    • 2012-12-20
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多