【问题标题】:Generate two sequences of random numbers with fixed mean and sd, with ordering constraint生成两个具有固定均值和 sd 的随机数序列,具有排序约束
【发布时间】:2017-07-27 20:32:02
【问题描述】:

我想生成两个具有以下约束的(伪)随机正态分布数序列 S 和 T:

  1. S 有均值 m_S、标准差 sd_S 和长度 N
  2. T 有均值 m_T、标准差 sd_T 和长度 N
  3. 对于每个 i,T(i)

理想情况下,我想逐步生成两个序列(一次一对或数字)。

我知道如何独立生成 S 或 T(例如在 Java 中 mean + stdev * ThreadLocalRandom.current().nextGaussian();- 另见 this question),但我不知道如何生成满足第三个约束的 S 和 T。

感谢任何帮助!

【问题讨论】:

  • 在明显是绝对的约束 3 之外,结果是否必须完全具有这些属性,或者这些属性的统计上适当的近似值?
  • @sh1 这些属性在统计上合适的近似值是可以的。

标签: random mean standard-deviation


【解决方案1】:

按照措辞,这在数学上是不可能的。令 D = S - T。T = 0。由于 S 和 T 是正态分布的,因此 D 也是正态分布,因为法线的线性组合是正态的。你不能有一个具有有限下限的正态分布。因此,您不能同时满足 S 和 T 的正态性要求并满足您的约束。

您可以通过使用您选择的任何分布生成 T 来构造非正态解,使用严格的正分布独立生成 D(例如 gamma、Weibull、uniform(0,?)、截断正态...),并创建 S = T + D。由于独立随机变量的期望和方差相加,您可以获得所需的均值和 sd通过适当调整 D 的参数化对 T 和 S 都适用。结果甚至可以看起来很漂亮的钟形,但严格来说是不正常的。

由于独立随机变量的方差是相加的并且必须是正的,所以 S = T + D 仅在 S 的方差大于 T 的方差时才有效。更一般的解决方案是生成 S 和 T 中的任何一个具有较小的方差。如果是T,加D得到S。如果是S,减去D得到T。

既然你在 cmets 中说近似值是可以的,这里有一个例子。假设您希望较小的分布具有 μsmaller = 10 和 σsmaller = 3,而较大的分布具有 μlarger = 15 和σlarger = 5。那么它们之间的差异应该具有严格的正分布,其中 μdelta = 5 和 σdelta = 4 (σ更大 = sqrt(32 + 42) = 5)。我为 delta 选择了一个伽马分布,参数化为具有所需的均值和标准差。这是在 Python 中的:

import random

alpha = 25.0 / 16.0
beta = 16.0 / 5.0
for _ in range(100000):
    smaller = random.gauss(10, 3)
    delta = random.gammavariate(alpha, beta)
    print(smaller, delta, smaller + delta)

我将结果保存到一个文件中,然后将它们导入 JMP。这是我分析的快照:

如您所见,越小越大都有所需的均值和标准差。您还可以确认所有的增量都是正的,所以大总是大于小。最后,larger 直方图上方的正态 q-q 图表明,结果虽然是单峰的且大致呈钟形,但并不正态,因为绘制的点不沿直线下降。


另一个答案建议通过生成单个随机均匀分布并将其用作两个 CDF 的反演输入来匹配两个分布:

q = random()
t = inverseCDF(q, mu_T, sd_T)
s = inverseCDF(q, mu_S, sd_S)

这是一种众所周知的相关归纳策略,称为“Common Random Numbers”,其中 q 是用于通过反演生成两个分布的相同分位数。对于对称分布,例如正态分布,这会在 T 和 S 之间产生 1 的相关性。1 的​​相关性告诉我们(其中一个)是另一个的线性变换。

事实上,有一种更简单的方法可以为法线完成此操作,而无需进行两次反转。通过您希望的任何机制生成 T 或 S 之一——反转、极坐标法、Ziggurat 法等。然后使用标准转换将其转换为标准法线,并从那里转换为另一个法线。如果我们让 T 是我们直接生成的法线,那么

S = (σS / σT) * (T - μT) + μS .

我们希望所有可能的分位数都有 T

(σT/σT) * (T - μT) + μS

经过一些代数变成

T * (σS - σT) / σST - μS * (σT/σS).

这减少到 3 个案例。

  1. σS = σT:在这种情况下,T被消除,只要μT S.

  2. σS > σT:在这种情况下,T > S 当 T T * σS / (σS - σT)) - (μS * σT / (σS - σT))。

  3. σST: T > S 当 T > (μT * σS sub> / (σS - σT)) - (μS * σT / (σS - σT)) 因为在 #2 的结果中通过具有 (σS - σT)

底线 - 相关归纳方案唯一有效的情况是两个分布的方差相等。不等方差将导致 T > S 的结果。

下图可能会给人一些直觉。红色曲线是平均值为 0 和标准差为 1 的标准正态曲线。绿色曲线是平均值为 1 和标准差为 2 的正态曲线。我们可以看到,由于绿色曲线较宽,因此存在一些分位数,低于该分位数会产生较小的结果比红色。如果 T(“较低”分布)具有较大的可变性,则会有一些分位数高于该分位数会产生较大的结果。

【讨论】:

  • 我认为可能有人能够生成这样的数字,请查看我的答案
  • @SeverinPappadeux 我想我已经给出了你错的具体原因。
  • 对不起,我是对的。最简单的情况 - 两种分布的 sd 都是 1,mu_T=0,mu_S=1。 CDF 基本上只是移位误差函数 (.5+.5*erf(x/sqrt(2)) 和 .5+.5*erf(x-1/sqrt(2)),CDF 之间的差异总是积极的(有些从高斯积分),我的逆 CDF 应用总是会产生与 S > T 的配对。如果你单独对 S 运行边际测试,它将是高斯的。单独的 T 将是高斯的。虽然它们不会是独立的,但是这不是一个规定的条件。
  • @SeverinPappadeux 稍后当我有机会写它时(我正在准备今天的讲座),但是您的方法使这两个结果完全相关,即彼此的线性变换。因此,它仅在方差相等时起作用,例如在您的“最简单情况”示例中。考虑作为您示例的反例,其中 T 是标准正态,而 S 的平均值为 1,标准差为 2。很容易找到小于 T 的相应分位数的 S 值。
  • @SeverinPappadeux 正如所承诺的,我已经进一步解释了为什么您的方法不是通用解决方案。
【解决方案2】:

我认为您可以计算这样的序列,满足所有条件并逐步生成两个序列(一次一对或数字)。为此,您必须构建累积分布函数 CDFS(x, mS, sdS) 和 CDFT(x, mT, sdT) 并确保对于任何 x 的给定参数,它们的差异是非负的:CDFS (x) - CDFT(x) >= 0.

然后你抛出 U(0,1) 并对每个均匀分布的随机数使用逆 CDF 方法(在某些伪代码中)计算两个高斯:

r = random()
t = inverseCDF(r, mu_T, sd_T)
s = inverseCDF(r, mu_S, sd_S)

它们将成对出现并保证为高斯分布并满足条件 1、2、3。

逆 CDF 将通过逆误差函数表示,因此根据您使用的库,您可能已经拥有它。如果没有,在 Wiki 中有一些 erf-1(x) 的近似值,可以使用:https://en.wikipedia.org/wiki/Error_function

更新

为了更清楚。如果您按照我的建议进行操作并生成具有 N 条记录和 2 列 (S,T) 的数据框,那么显然单独采用 S 列将是 gaussian(m_S, sd_S),而 T 列将是 gaussian(m_T, sd_T )。没有任何问题。他们不会独立。但你没有说明这种情况。如果没问题,那就是解决方案。如果他们必须独立,那是不可能的。所以你必须下定决心你到底想要什么

【讨论】:

    猜你喜欢
    • 2013-09-25
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多