主要内容

累积分布函数及其逆函数的非参数估计

这个例子展示了如何以非参数或半参数的方式估计数据的累积分布函数(CDF)。它还说明了从估计的CDF生成随机数的反演方法。统计和机器学习工具箱™包括超过二十多个随机数生成器函数的参数单变量概率分布。这些函数允许您为各种各样的模拟生成随机输入,但是,在某些情况下,需要生成随机值来模拟不是由简单参数族描述的数据。

工具箱还包括函数pearsrndjohnsrnd,用于生成随机值,而不必指定从中绘制的参数分布——这些函数允许您分别以矩或分位数的形式指定分布。

然而,仍然有一些情况需要更大的灵活性,以生成随机值,“模仿”您更紧密地收集的数据。在这种情况下,您可以使用这些数据的CDF的非参数估计,并使用反转方法生成随机值。反演方法包括在单位区间上生成均匀随机值,并使用该分布的逆CDF将它们转换为所需的分布。

从相反的角度来看,有时需要使用CDF的非参数估计来将观测数据转换到单位间隔上,使它们具有近似的均匀分布。

ecdf函数计算一种类型的非参数CDF估计,经验CDF,这是一个阶梯函数。这个示例演示了一些更流畅的替代方案,它们可能更适合模拟或转换来自连续分布的数据。

为了便于说明,这里有一些简单的模拟数据。只有25个观察值,选择这个小数目是为了使示例中的图表更容易阅读。数据也进行了排序,以简化绘图。

rng(19日“旋风”);N = 25;X = evrnd(3,1,n,1);X = sort(X);嘘(x, 2: .5:4.5);包含(“x”);ylabel (“频率”);

分段线性非参数CDF估计

ecdf函数提供了一种简单的方法来计算和绘制数据的“阶梯”经验CDF。在最简单的情况下,该估计在每个数据点上进行1/n的离散跳跃。

[Fi,xi] = ecdf(x);楼梯(xi, Fi,“r”);xlim (-2.5 [5]);包含(“x”);ylabel (“F (x)”);

这种估计在很多方面都很有用,包括研究参数模型与数据的拟合优度。然而,它的离散性可能使它不适合用于经验地将连续数据转换为单位区间或从单位区间转换。

修改经验CDF来解决这些问题很简单。与其在每个数据点上进行1/n的离散跳跃,不如定义一个分段线性的函数,在这些跳跃的中点处设置断点。那么每个数据点的高度为[1/2n, 3/2n,…, (n-1/2)/n],而不是[(1/n), (2/n),…1)。的输出ecdf计算这些断点,然后“连接这些点”来定义分段线性函数。

Xj = xi(2:end);Fj = (Fi(1:end-1)+Fi(2:end))/2;持有情节(Fj xj,“b”。xj,陆地,“b -”);持有传奇({“ECDF”“断点”分段线性估计},“位置”“西北”);

因为ecdf适当地处理重复值和审查,这种计算即使在数据比本例更复杂的情况下也能工作。

由于最小的数据点对应的高度为1/2n,最大的数据点对应的高度为1-1/2n,因此必须将第一个和最后一个线性段扩展到数据之外,才能使函数达到0和1。

xj = [xj(1)-Fj(1)*(xj(2)-xj(1))/((Fj(2)-Fj(1)));xj;xj (n) + (1-Fj (n)) * ((xj (n) xj (n - 1) / (Fj (n) Fj (n - 1))));Fj = [0;Fj;1);持有情节(Fj xj,“b -”“HandleVisibility”“关闭”);持有

这个分段线性函数提供了连续对称的CDF的非参数估计。在原始数据以外的点上求值只是一个线性插值的问题,并且可以方便地定义一个匿名函数来做这件事。

F = @(y) interp1(xj,Fj,y,“线性”“extrap”);Y = linspace(-1,3.75,10);情节(Fj xj,“b -”, y, F (y),“柯”);xlim (-2.5 [5]);包含(“x”);ylabel (“F (x)”);

分段线性非参数CDF逆估计

您可以使用相同的计算来计算逆CDF的非参数估计。事实上,逆CDF估计只是交换了坐标轴的CDF估计。

楼梯(Fi, [xi(2:结束);“r”);持有情节(Fj, xj,“b -”);持有ylim (-2.5 [5]);ylabel (“x”);包含(“F (x)”);传奇({“ECDF”分段线性估计},“位置”“西北”);

在原始断点以外的点上计算这个非参数逆CDF,同样只是线性插值的问题。例如,生成统一的随机值,并使用CDF估计将它们转换回原始观测数据的规模。这就是反演法。

Finv = @(u) interp1(Fj,xj,u,“线性”“extrap”);U = rand(10000,1);嘘(Finv (u), 2: .25:4.5);包含(“x”);ylabel (“频率”);

注意,这个模拟数据的直方图比原始数据的直方图更分散。这在一定程度上是由于样本量大得多——原始数据只包含25个值。但这也是因为分段线性CDF估计,实际上在一段时间内“分散”了每个原始观测值,在个别观测值分离良好的区域更是如此。

例如,在0左边的两个独立观测值对应模拟数据中的一个宽而平坦的低密度区域。相比之下,在数据间隔很近的区域,例如向右尾方向,分段线性CDF估计在较小程度上“分散”了观测值。从这个意义上说,该方法执行一个简单版本的所谓可变带宽平滑。然而,尽管进行了平滑处理,模拟数据仍然保留了原始数据的大部分特征,即高密度和低密度区域。

CDF和逆CDF的核估计

函数来执行核估计,而不是使用分段线性函数来估计CDFksdensity函数来进行平滑的非参数估计。虽然它经常被用来做非参数密度估计,ksdensity还可以估计其他函数。例如,要将原始数据转换为单位间隔,可以使用它来估计CDF。

F = ksdensity(x, x,“函数”“提供”“宽度”, .35点);楼梯(xi, Fi,“r”);持有情节(x, F,“b”。);持有xlim (-2.5 [5]);包含(“x”);ylabel (“F (x)”);传奇({“ECDF”“内核估计”},“位置”“西北”);

ksdensity还提供了一种方便的方法来评估在原始数据以外的点上的内核CDF估计。例如,将估算绘制为平滑曲线。

Y = linspace(-2.5,5,1000);Fy = ksdensity(x, y,“函数”“提供”“宽度”, .35点);楼梯(xi, Fi,“r”);持有情节(y,财政年度,“b -”);持有传奇({“ECDF”“内核估计”},“位置”“西北”);

ksdensity使用带宽参数来控制它计算的估计中的平滑量,并且可以让ksdensity请选择默认值。这里的例子使用相当小的带宽来限制平滑的数量。即便如此,核估计也不像分段线性估计那样紧密地跟随ECDF。

使用核估计估计逆CDF的一种方法是在横跨原始数据范围的点网格上计算核CDF估计,然后使用与分段线性估计相同的过程。例如,要将逆CDF核估计绘制为平滑曲线,只需交换坐标轴。

楼梯(Fi, [xi(2:结束);“r”);持有情节(财政年度,y,“b -”);持有ylim (-2.5 [5]);ylabel (“x”);包含(“F (x)”);传奇({“ECDF”“内核估计”},“位置”“西北”);

要将均匀随机值转换回原始数据的尺度,请使用CDF估计的网格进行插值。

Finv = @(u) interp1(Fy,y,u,“线性”“extrap”);嘘(Finv (u), -2.5: .25:5);包含(“x”);ylabel (“频率”);

请注意,使用内核CDF估计的模拟数据并没有完全“平滑”原始数据中存在于零左侧的两个独立观测值。内核估计使用固定带宽。对于本例中使用的特定带宽值,这两个观测结果贡献了两个局部的密度区域,而不是像分段线性估计那样是一个宽的平坦区域。相比之下,内核估计平滑了数据更多的在右尾比分段线性估计。

使用核估计生成模拟数据的另一种方法是使用ksdensity来直接计算逆CDF的估计,再次使用“函数”参数。例如,转换那些相同的统一值。

R = ksdensity(x, u,“函数”“icdf”“宽度”, .35点);

但是,对于大量数据,使用后一种方法可能会耗费大量时间。一种更简单但等效的方法是用替换原始数据重新采样,并添加一些适当的随机噪声。

R = datasample(x,100000,“替换”,true) + normnd (0,.35,100000,1);

如果生成足够多的随机值,结果的直方图将非常接近原始数据的核密度估计。

Binwidth = .25;边= -2.5:binwidth:6;CTRS = edges(1:end-1) + binwidth./2;计数= histc(r,edges);Counts = Counts (1:end-1);栏(点击率数据,counts. /((计数)。* binwidth总和),1,“FaceColor”,(。9 .9 .9]);持有Xgrid = edges(1):.1:edges(end);Fgrid = ksdensity(x, xgrid,“函数”“pdf”“宽度”3);情节(xgrid fgrid,“k -”);持有包含(“x”);ylabel (“f (x)”);

半参数CDF估计

非参数CDF估计需要大量的数据来达到合理的精度。此外,数据只会“局部地”影响估计。也就是说,在数据密度高的地区,估计是基于更多的观察,而在数据密度低的地区。特别是,非参数估计在分布的尾部表现不佳,其中数据根据定义是稀疏的。

拟合半参数模型到您的数据使用paretotails函数允许非参数世界和参数世界的最好。在分布的“中心”,模型对CDF采用分段线性非参数估计。在每个尾部,它使用广义帕累托分布。广义帕累托通常被用作数据集尾部的模型,虽然它足够灵活,可以适合各种分布尾部,但它受到足够的约束,因此它只需要很少的数据就可以为尾部数据提供合理且平滑的拟合。

例如,您可以将数据的“中心”定义为中间的50%,并指定非参数估计和帕累托拟合之间的转换发生在数据的.25和.75分位数之间。为了评估半参数模型拟合的CDF,请使用拟合值提供方法。

semipFit = paretotails(x,.25,.75);
警告:问题拟合广义帕累托分布到上尾。极大似然收敛到参数空间的边界点。

这一警告是由于使用了如此少的数据——在这种情况下,每个尾部都有6个点——并表明上尾部的拟合广义帕累托分布恰好延伸到最小的观测值,而不是更远。你可以在下面的直方图中看到。在实际应用程序中,通常会有更多数据,通常不会出现警告。

[p,q] = boundary(semipFit);Y = linspace(-4,6,1000);Fy = cdf(semipFit,y);情节(y,财政年度,“b -”p, q,,k +的);xlim (-6.5 [5]);包含(“x”);ylabel (“F (x)”);传奇({“Semi-parametric估计”“段边界”},“位置”“西北”);

要将均匀随机值转换回原始数据的比例,请使用拟合icdf方法。

r = icdf(semipFit,u);嘘(r, -6.5: .25:5);包含(“x”);ylabel (“频率”);

这种半参数估计使数据的尾部比中心更平滑,因为尾部使用了参数模型。在这个意义上,估计更类似于分段线性估计而不是核估计。但是,也可以使用paretotails在数据中心使用核估计来创建半参数拟合。

结论

本例说明了从数据中计算非参数或半参数CDF或逆CDF估计的三种方法。这三种方法对数据进行不同数量和类型的平滑处理。您选择哪种方法取决于每种方法如何捕获或未能捕获您认为数据的重要特征。