统计故事:统计分布的常见族(第一部分)

2023-02-02 12:40 448 阅读 ID:749
磐创AI
磐创AI

作为一名数据科学家、统计学家、计算机工程师或数据分析员,人们正在处理从各种来源、通过许多物理过程获得的海量数据,这些数据涵盖了广泛的领域,包括运输、光子学、生物信息学和天文学。

统计学家和数据科学家将大部分时间花在建模数据上,以便做出一些有意义的推断。

创建新统计方法的一种方法是生成与物理过程相对应的合成数据集,使用合成数据集开发新方法。

一个著名的例子是用R语言编写的Splatter包,它生成一个合成数据集来表示单细胞RNA测序研究。

合成数据集的生成需要对真实数据集有深入的了解——它们遵循的是什么样的统计分布,以及如何在现有数据集上拟合已知的分布。

在许多情况下,实际数据集呈现混合模型,即多个分布的组合。这要求统计学家熟悉一些常见的分布族。

在本文中,我们将介绍一些最常见的分布族,包括离散分布族和连续分布族。

在第1部分中,我们描述了离散分布,然后根据这些分布生成合成数据。

https://rahulbhadani.medium.com/stat-stories-common-families-of-statistical-distributions-part-2-4bdea86c3132

离散均匀分布

对于离散均匀分布,随机变量X是可数的,即X∈ {1,2,…,N}其中N是参数。其概率质量函数(pmf)为

其期望和方差分别是𝔼(X) = (1+N)/2和Var(X) = ((N+1)(N-1)/12)。

超几何分布

超几何分布与有限人群中N个试验序列的成功次数有关,其概率质量函数(pmf)为

其期望和方差为𝔼( X ) = K*M/N ,Var( *X* ) = 𝔼( X )*((NM)(MK))/(N(N-1))。

超几何分布用于估计总种群大小N,例如池塘中的鱼类。策略是捕获M鱼,标记它们,然后将它们退回,然后再捕获K鱼。另一个流行的应用是验收抽样,即从一批机器零件中选择样本,估计样本中无缺陷零件的概率。

二项分布

当只有两种可能的结果:成功和失败时,二项分布用于估计n个试验的成功总数。考虑一个重复n次的随机实验。此外,考虑成功的概率为p,实验相互独立。随机变量X表示n次试验的成功总数。然后,分布的PMF为

在这种情况下,期望值和方差为𝔼( X ) = np和Var( X ) = np(1-p)。

泊松分布

在我看来,泊松分布是最重要的离散分布之一。泊松分布用于模拟给定大量观测值的特定事件的发生次数。其中一个例子是光子在激光发射中的到达。例如泊松分布用于量子信息论中的光子计数过程。

https://ieeexplore.ieee.org/abstract/document/9291373/

考虑一个只接受非负整数的随机变量X。那么泊松分布的PMF可以写成

其中λ是速率参数。对于泊松分布,我们有𝔼( X ) = Var( X ) = λ。

几何分布

几何分布类似于二项分布,然而,实验一直持续到S成功为止。在这种情况下,考虑到X是表示获得第一个S成功所需试验次数的随机变量,PMF写为

对于几何分布,我们有 𝔼(X) = 1/p,Var(X) = (1-p)/p²。几何分布的一个特殊性质是它是无记忆的,即它忘记了已经发生的事情。

负二项分布

负二项分布类似于泊松分布,但有两个参数:r和p。在这种情况下,泊松分布是负二项分布的极限情况。

如果事件是独立的并且它们随机发生,则给定时间内的事件数是泊松分布的观察值。当这些假设不再成立时,负二项式更适合数据,因为它有一个额外的参数,并且泊松分布成为它的极限情况。

考虑到随机变量X表示从负二项式分布中失败的次数以获得r次成功,并且成功概率为p,PMF为

期望和方差分别是r (1-p)/p和r(1-p)/p²。

评论如前所述,泊松分布是负二项分布的极限情况。可以通过r →∞、p→1 和 r(1-p)→ λ来实现.

数据生成

上述分布的合成数据集可以使用scipy.stats.rv_discrete生成。

下面是需要Python 3.8或更高版本的代码片段。

#!/usr/bin/env python

# Initial Date: May 2022
# Author: Rahul Bhadani
# Copyright (c)  Rahul Bhadani
# All rights reserved.

# Requires Python 3.8 or above

import math
from pyrsistent import v
from scipy.stats import rv_discrete
import numpy as np
import matplotlib.pyplot as plt
import seaborn as s
import matplotlib as mpl
import pyplot_themes as themes
themes.theme_few(scheme="dark", grid=False, ticks=False,)
mpl.rcParams['font.family'] = 'Serif'


x1k = np.arange(1,21)
y1k = np.repeat(1/20, 20) #uniform discrete
pmf1 = rv_discrete(name='uniform discrete', values=(x1k, y1k))


# hypergeometric
N = 100
M = 50
K = 10
x2k = np.arange(min(M,K))
y2k = np.zeros(min(M,K))
for i, x in enumerate(x2k):
    y2k[i] = (math.comb(M, x)*math.comb(N-M, K-x))/math.comb(N, K)
# because of numerical round off and how many samples we choose, sum of y2k is less than 1. So just normalize it
y2k =y2k/sum(y2k)
pmf2 = rv_discrete(name='hypergeometric', values=(x2k, y2k))

# Binomial
p = 0.4
n = 20
x3k = np.arange(n)
y3k = np.zeros(n)
for i, x in enumerate(x3k):
    y3k[i] = math.comb(n, x)*(p**x)*((1-p)**(n-x))
y3k =y3k/sum(y3k)
pmf3 = rv_discrete(name='binomial', values=(x3k, y3k))

# Poisson
L = 4
n = 50
x4k = np.arange(n)
y4k = np.zeros(n)
for i, x in enumerate(x4k):
    y4k[i] =(np.exp(-L)*(L**x))/math.factorial(x)
y4k =y4k/sum(y4k)
pmf4 = rv_discrete(name='Poisson', values=(x4k, y4k))

# Geometric
p = 0.4
n = 20
x5k = np.arange(1,n+1)
y5k = np.zeros(n)
for i, x in enumerate(x5k):
    y5k[i] = p*((1-p)**(x-1))
y5k =y5k/sum(y5k)
pmf5 = rv_discrete(name='geometric', values=(x5k, y5k))

# Negative Binomial
p = 0.4
r = 10
n = 40
x6k = np.arange(n)
y6k = np.zeros(n)
for i, x in enumerate(x6k):
    y6k[i] = math.comb(r+x-1, r-1)*(p**r)*((1-p)**x)

y6k =y6k/sum(y6k)
pmf6 = rv_discrete(name='negative binomial', values=(x6k, y6k))

import matplotlib.pyplot as plt
fig, ax = plt.subplots(2, 3)
ax=np.ravel(ax)

ax[0].plot(x1k, pmf1.pmf(x1k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[0].vlines(x1k, 0, pmf1.pmf(x1k), colors='#2F9C95', lw=1)
ax[0].set_title('Uniform Discrete')

ax[1].plot(x2k, pmf2.pmf(x2k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[1].vlines(x2k, 0, pmf2.pmf(x2k), colors='#2F9C95', lw=1)
ax[1].set_title('Hypergeometric')

ax[2].plot(x3k, pmf3.pmf(x3k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[2].vlines(x3k, 0, pmf3.pmf(x3k), colors='#2F9C95', lw=1)
ax[2].set_title('Binomial')

ax[3].plot(x4k, pmf4.pmf(x4k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[3].vlines(x4k, 0, pmf4.pmf(x4k), colors='#2F9C95', lw=1)
ax[3].set_title('Poisson')

ax[4].plot(x5k, pmf5.pmf(x5k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[4].vlines(x5k, 0, pmf5.pmf(x5k), colors='#2F9C95', lw=1)
ax[4].set_title('Geometric')

ax[5].plot(x6k, pmf6.pmf(x6k), 'o', ms=6, mec='#2F9C95', markerfacecolor="#2F9C95")
ax[5].vlines(x6k, 0, pmf6.pmf(x6k), colors='#2F9C95', lw=1)
ax[5].set_title('Negative Binomial')

plt.tight_layout()
plt.show()

请注意,你选择多少样本来生成分布很重要,因为从理论上讲,我们讨论的是无限样本。因此,我们通过除以总数来规范化概率,使概率之和等于1。

在统计故事系列的下一篇文章中,我将讨论连续统计分布的常见族。

免责声明:作者保留权利,不代表本站立场。如想了解更多和作者有关的信息可以查看页面右侧作者信息卡片。
反馈
to-top--btn