2026a

# 使用灵活的分布族生成数据


此示例展示了如何使用皮尔森和约翰逊分布系统生成数据。

# Pearson 与 Johnson 系统

选择适当的参数分布族来建模数据,可以基于对数据生成过程的先验知识或对数据本身的后验分析,但这种选择通常很困难。Pearson 系统和 Johnson 系统可以使这种选择变得不必要。每个系统都是一个灵活的参数分布族,包含各种分布形状,并且通常可以在这两个系统中的某一个找到一个与您的数据匹配良好的分布。

# 数据输入

以下参数定义了 Pearson 和 Johnson 系统的每个成员。

  • 均值 — 通过 mean 估算
  • 标准差 — 通过 std 估算
  • 偏度 — 通过 skewness 估算
  • 峰度 — 通过 kurtosis 估算

这些统计数据也可以通过 moment 函数来计算。Johnson 系统虽然基于这四个参数,但更自然的描述方式是使用分位数,由 ty_quantile函数估计。

pearsrndjohnsrnd 函数接受定义分布的输入参数(分别为参数或分位数),并返回对应系统中分布的类型和系数。这两个函数还可以从指定的分布中生成随机数。

例如,加载 carbig.mat 文件中的数据,其中包含一个变量 MPG,该变量包含每辆车的油耗测量值。

using TyStatistics
using TyBase
using TyPlot
using TyMath
path = pkgdir(TyStatistics)
datapath = path * "/data/carbig.mat"
load(datapath)
MPG = filter(!isnan, vec(MPG))
histogram(MPG, 15)

以下两个部分分别用皮尔逊系统和约翰逊系统的成员对分布进行了建模。

# 使用皮尔逊系统生成数据

统计学家卡尔·皮尔逊设计了一套分布系统,或称分布族,其中包括一个独特的分布,对应于每一个有效的均值、标准差、偏度和峰度组合。如果你从数据中计算出这些矩的样本值,就很容易找到皮尔逊系统中与这四个矩匹配的分布,并生成随机样本。

皮尔逊系统将七种基本分布类型整合到一个单参数框架中。它包括常见的分布,如正态分布和t分布,标准分布的简单变换,如偏移和缩放的贝塔分布以及逆伽马分布,还有一种分布——类型 IV,它不是任何标准分布的简单变换。

对于给定的一组矩,有些分布不在系统中,但也具有相同的前四个矩,并且皮尔逊系统中的分布可能与您的数据不完全匹配,尤其是当数据是多峰的情况下。但该系统确实涵盖了广泛的分布形状,包括对称和偏态分布。

要生成与 MPG 数据紧密匹配的皮尔逊分布样本,只需计算四个样本矩,并将其作为分布参数处理。

moments = [mean(MPG), std(MPG), skewness(MPG), kurtosis(MPG)[1]]
rng = MT19937ar(5489)
r, type = pearsrnd(rng, moments..., 10000, 1)

pearsrnd 的可选第二个输出指示 Pearson 系统中哪种类型的分布与矩的组合相匹配。

type
type = 
1.0

在这种情况下,pearsrnd 已确定数据最好用 I 型 Pearson 分布来描述,这是一种平移和缩放后的贝塔分布。通过叠加经验累积分布函数,验证样本是否与原始数据相似。

ecdf(MPG; plot=true)
Fi, xi = ecdf(r)
hold("on")
stairs(xi, Fi, "r")
hold("off")
xlabel("X")
ylabel("F(x)")

# 使用约翰逊系统生成数据

统计学家诺曼·约翰逊设计了一种不同的分布系统,该系统还包括每种有效的平均值、标准差、偏度和峰度组合的唯一分布。然而,由于在约翰逊系统中使用分位数描述分布更为自然,因此使用该系统与使用皮尔逊系统的方式不同。

Johnson 系统基于正态随机变量的三种可能变换,加上恒等变换。三种非平凡情况被称为 SL、SU 和 SB,分别对应指数、逻辑和双曲正弦变换。三者都可以表示为

其中 Z 是标准正态随机变量,Γ 是变换,γ、δ、ξ 和 λ 是尺度和位置参数。第四种情况 SN 是恒等变换。

为了从与 MPG 数据相匹配的 Johnson 分布中生成样本,首先定义四个分位数,将四个均匀分布的标准正态分位数 -1.5、-0.5、0.5 和 1.5 转换到这些分位数。也就是说,你需要计算数据在累积概率为 0.067、0.309、0.691 和 0.933 时的样本分位数。

probs = normcdf([-1.5 -0.5 0.5 1.5])
probs = 
1×4 Matrix{Float64}:
0.0668072  0.308538  0.691462  0.933193
quantiles = ty_quantile(MPG, probs)
4-element Vector{Float64}:
 13.0
 18.0
 27.2
 36.0

然后将这些分位数视为分布参数。

r1, type = johnsrnd(rng, quantiles, 10000, 1)

johnsrnd 的可选第二个输出指示 Johnson 系统中哪种类型的分布与分位数相匹配。

type
type = 
"SB"

您可以通过叠加经验累积分布函数来验证样本是否类似于原始数据。

ecdf(MPG; plot=true)
Fi, xi = ecdf(r1)
hold("on")
stairs(xi, Fi, "r")
hold("off")
xlabel("x")
ylabel("F(x)")

在某些应用中,在数据的某些区域比其他区域更好地匹配分位数可能非常重要。为此,可以指定四个均匀间隔的标准正态分位数来匹配数据,而不是使用默认的 -1.5、-0.5、0.5 和 1.5。例如,您可能更关心匹配右尾的数据,而不是左尾,因此可以指定强调右尾的标准正态分位数。

qnorm = [-0.5 0.25 1 1.75]
probs = normcdf(qnorm)
qemp = ty_quantile(MPG, probs)
r2, = johnsrnd(rng, [qnorm; qemp'], 10000, 1)

然而,虽然新的样本在右尾部比原始数据匹配得更好,但在左尾部的匹配却差得多。

Fj, xj = ecdf(r2)
hold("on")
stairs(xj, Fj, "g")
hold("off")
xlabel("x")
ylabel("F(x)")

# 另请参阅

pearsrnd | johnsrnd | ecdf