从 t 分布生成随机数

机器算法验证 采样 随机生成 擅长 t分布
2022-03-14 03:38:36

如何生成遵循学生t分布的随机数?从几个来源我了解到,这可以使用大小的随机样本来完成n从正态分布的总体中抽取,如下所示:

t=(xm)(s/n)

在哪里x是样本均值,m是正态分布的平均值(我假设你可以使用标准正态分布,所以m=0?), 和s是样本标准差。

学生t分布的自由度将是n1.

我是否正确理解,为了生成一个随机的学生- tf自由度,我应该首先生成f+1正态分布值(即标准正态),然后计算平均值(x) 和标准差 (s) 并应用上述公式?如果我多次重复执行此操作,则生成的随机值将接近学生 t 分布f自由程度?

我在 Excel 中使用了一个使用上述公式的宏和另一个生成随机高斯函数的宏(它有效,我对其进行了测试)进行了尝试,但生成的随机值似乎并不完全是学生t分布的。例如有 6 个自由度,10,000 个随机值的方差约为1.7虽然它应该是6/(62)=1.5.

3个回答

给定一个 iid 标准高斯随机变量的生成器,您可以生成tk分布随机变量(具有任何正整数自由度k) 通过使用关系:

Y=Xk+1k1i=1kXi2

在哪里YtkXii.i.d. N(0,1),i=1,,k+1.

我对您问题的实际部分有一个答案,尽管不是理论上的答案。

有一个名为 TINV 的函数可以直接执行此操作。除了它只返回正随机 t 变量。您可以使用以下公式绕过该限制:

=TINV(RAND(),6)*(RANDBETWEEN(0,1)*2-1)

...您可以用6DF 的任何值替换,并且rand()可以用 0 到 1 之间的任何数字替换。其余部分只是保证负值和正值的概率相等。

一种快速生成变量的方法,比除了最小自由度之外的所有自由度的仅高斯方法更快,是使用以下事实:at 分布是正态的混合,混合分布是方差上的反伽马分布. 这是 R 中的一个示例,我们以这种方式生成 1,000,000 个 t(10) 变量,并使用 Kolmogorov-Smirnov 检验与理论分布进行比较(大型实验的“证明”!):

> df <- 10
> s2 <- 1/rgamma(1000000, df/2, df/2)
> tv <- rnorm(1000000,0,sqrt(s2))
> 
> ks.test(tv, pt, df=df)

    One-sample Kolmogorov-Smirnov test

data:  tv 
D = 6e-04, p-value = 0.8826
alternative hypothesis: two-sided 

这种方法也适用于非整数自由度,而纯高斯方法则不适用。