如何计算 python 中正态分布的线性变换的 cdf?
How do you calculate the cdf of a linear transformation of the normal distribution in python?
我有一个 pdf,它是正态分布的线性变换:
T = 0.5A + 0.5B
Mean_A = 276
Standard Deviation_A = 6.5
Mean_B = 293
Standard Deviation_A = 6
如何计算 Python 中 T 在 281 和 291 之间的概率?
我试过以下代码:
mu1 = 276
sigma1 = 6.5
mu2 = 293
sigma2 = 6
normalized = 0.5 * scipy.stats.norm.pdf(x, loc = mu1, scale = sigma1) + 0.5 * scipy.stats.norm.pdf(x, loc = mu2, scale = sigma2)
print(normalized.cdf(291) - normalized.cdf(281))
但这出现了一个错误。
我也尝试计算 T ~ N(284.5, 19.5625)
和
的 CDF
print(norm.cdf(291 - 284.5/4.422952))
,等等,但这得出了一个错误的答案。
如有任何帮助,我们将不胜感激!
您的评论表明您假设变量是独立的,因为在这种情况下,总和的均值和方差与您给出的一样。
然后,你可以通过
定义总和
normalized = scipy.stats.norm(0.5*mu1 + 0.5*mu2, np.sqrt((0.5*sigma1)**2 + (0.5*sigma2)**2))
特别是,像您一样使用 cdf
得到您想要的:
In [27]: normalized.cdf(291) - normalized.cdf(281)
Out[27]: 0.7147892127602181
为了验证这个结果是否符合预期,我们可以运行一个快速模拟:
In [31]: N = 10**7
In [32]: rvs = 0.5*np.random.normal(mu1, sigma1, size=N) + 0.5*np.random.normal(mu2, sigma2, size=N)
In [33]: ((rvs > 281) & (rvs < 291)).mean()
Out[33]: 0.7148597
确实,这是对上述准确结果的合理近似。
编辑:根据对该答案的评论,OP 实际上对 PDF 为
的随机变量感兴趣
PX(x)=[1/(√2πVar1)^e^−(x−μ1)^2/2Var1]∗0.5+[1/(√2πVar2)^e^−(x−μ1)^2/2Var2]∗0.5
值得注意的是,这 不是 正态分布变量的线性组合(就此而言,它本身不是正态分布变量),因此无论在哪个练习中都这样表述你给了,然后他们措辞不正确。
虽然这种情况更简单:将 281 的 PDF 积分到 291 可以通过积分每个被加数来完成,这反过来只是正态分布的 PDF,因此您可以按上述方式进行:
In [43]: n1 = scipy.stats.norm(mu1, sigma1)
In [44]: n2 = scipy.stats.norm(mu2, sigma2)
In [45]: .5*(n1.cdf(291) - n1.cdf(281) + n2.cdf(291) - n2.cdf(281))
Out[45]: 0.2785306219161424
我有一个 pdf,它是正态分布的线性变换:
T = 0.5A + 0.5B
Mean_A = 276
Standard Deviation_A = 6.5
Mean_B = 293
Standard Deviation_A = 6
如何计算 Python 中 T 在 281 和 291 之间的概率?
我试过以下代码:
mu1 = 276
sigma1 = 6.5
mu2 = 293
sigma2 = 6
normalized = 0.5 * scipy.stats.norm.pdf(x, loc = mu1, scale = sigma1) + 0.5 * scipy.stats.norm.pdf(x, loc = mu2, scale = sigma2)
print(normalized.cdf(291) - normalized.cdf(281))
但这出现了一个错误。
我也尝试计算 T ~ N(284.5, 19.5625)
和
print(norm.cdf(291 - 284.5/4.422952))
,等等,但这得出了一个错误的答案。
如有任何帮助,我们将不胜感激!
您的评论表明您假设变量是独立的,因为在这种情况下,总和的均值和方差与您给出的一样。
然后,你可以通过
定义总和normalized = scipy.stats.norm(0.5*mu1 + 0.5*mu2, np.sqrt((0.5*sigma1)**2 + (0.5*sigma2)**2))
特别是,像您一样使用 cdf
得到您想要的:
In [27]: normalized.cdf(291) - normalized.cdf(281)
Out[27]: 0.7147892127602181
为了验证这个结果是否符合预期,我们可以运行一个快速模拟:
In [31]: N = 10**7
In [32]: rvs = 0.5*np.random.normal(mu1, sigma1, size=N) + 0.5*np.random.normal(mu2, sigma2, size=N)
In [33]: ((rvs > 281) & (rvs < 291)).mean()
Out[33]: 0.7148597
确实,这是对上述准确结果的合理近似。
编辑:根据对该答案的评论,OP 实际上对 PDF 为
的随机变量感兴趣PX(x)=[1/(√2πVar1)^e^−(x−μ1)^2/2Var1]∗0.5+[1/(√2πVar2)^e^−(x−μ1)^2/2Var2]∗0.5
值得注意的是,这 不是 正态分布变量的线性组合(就此而言,它本身不是正态分布变量),因此无论在哪个练习中都这样表述你给了,然后他们措辞不正确。
虽然这种情况更简单:将 281 的 PDF 积分到 291 可以通过积分每个被加数来完成,这反过来只是正态分布的 PDF,因此您可以按上述方式进行:
In [43]: n1 = scipy.stats.norm(mu1, sigma1)
In [44]: n2 = scipy.stats.norm(mu2, sigma2)
In [45]: .5*(n1.cdf(291) - n1.cdf(281) + n2.cdf(291) - n2.cdf(281))
Out[45]: 0.2785306219161424