def xfx(x, lower=lower, upper=upper, mu=mu, sigma=sigma):
'''helper function returning x*f(x) for the truncated normal density f'''
return x*scipy.stats.truncnorm.pdf(x, (lower-mu)/sigma, (upper-mu)/sigma, loc=mu, scale=sigma)
def x_EX_fx(x, lower=lower, upper=upper, mu=mu, sigma=sigma):
'''helper function returning (x - E[X])**2 * f(x) for the truncated normal density f'''
EX = quad(func=xfx,a=lower,b=upper)[0]
return ((x - EX)**2) * scipy.stats.truncnorm.pdf(x, (lower-mu)/sigma, (upper-mu)/sigma, loc=mu, scale=sigma)
让我们可以精确计算出
# E[X], expected value of X
quad(func=xfx,a=lower,b=upper)[0]
> 10.0
# (Var(X))^(1/2), standard deviation of X
np.sqrt(quad(func=x_EX_fx,a=lower,b=upper)[0])
> 2.697
2条答案
按热度按时间fruv7luv1#
事实上,截断正态分布降低了随机变量可能实现的变异性(从而降低了标准差),无论如何,我们知道它为什么不是
5.0
,但我们真的不知道它为什么应该是2.673
;除了它更小的事实。如果我们通过分析计算截断正态分布的精确标准差,并将其与检索到的经验值进行比较,会怎样?在这种情况下,您可以确保所有内容都符合要求。
示出了截断正态密度,暗指选择的区间
[lower, upper]
越窄,标准差将越小(甚至当lower
和upper
变得无限接近时渐近地接近0
)。让我们严格地确定一下,给定我们的(截断正态随机变量
X
)的期望值和方差的古老方程,我们有然后,定义辅助函数
让我们可以精确计算出
这看起来与您的观察值
2.673
非常相似。让我们通过运行模拟研究来观察经验标准差是否接近理论值,以查看差异是否仅仅基于有限的样本大小。屈服的
这将确认您的输出是正确的,
hmae6n7t2#
这将在[5,15]之间生成一个剪切的正态分布。这是+/- 1 s.d,因此在该样本上测量的s.d.将不等于输入。
如果对输出范围进行限幅,则必然会降低观测到的标准差。
当下限/上限-〉+/-无穷大时,样本标准差-〉5。当下限/上限-〉10时,样本标准差-〉0。