从截断的正态分布中提取图形会导致R中的标准偏差错误

时间:2019-05-16 15:25:06

标签: r random distribution normal-distribution

我从截断的正态分布中得出随机数。截断后的正态分布在从左0开始截断后应该具有均值100和标准差60。 我计算了一种算法来计算截断前的正态分布的均值和sd(mean_old和sd_old)。 函数vtruncnorm给了我(想要的)方差60 ^ 2。但是,当我从分布中绘制随机变量时,标准偏差约为96。 我不明白为什么随机变量的sd不同于60的计算结果。

我尝试增加抽奖数量-仍然使SD保持在96。

 require(truncnorm)
 mean_old = -5425.078
 sd_old = 745.7254
 val = rtruncnorm(10000, a=0,  mean = mean_old, sd = sd_old)
 sd(val)
 sqrt(vtruncnorm( a=0,  mean = mean_old, sd = sd_old))

1 个答案:

答案 0 :(得分:0)

好,我做了快速测试

require(truncnorm)

val = rtruncnorm(1000000, a=7.2,  mean = 0.0, sd = 1.0)
sd(val)
sqrt(vtruncnorm( a=7.2,  mean = 0.0, sd = 1.0))

正则截断高斯。在a = 6时,它们非常接近,即0.1554233对0.1548865 f.e.,取决于种子等。在a = 7时,它们在系统上是不同的,即0.1358143对0.1428084(采样值小于该函数调用)。我已经检查过Python的实现

import numpy as np
from scipy.stats import truncnorm

a, b = 7.0, 100.0

mean, var, skew, kurt = truncnorm.stats(a, b, moments='mvsk')

print(np.sqrt(var))

r = truncnorm.rvs(a, b, size=100000)
print(np.sqrt(np.var(r)))

并返回0.1428083662823426,与R vtruncnorm结果一致。如果您的a = 7.2左右,结果会更糟。

故事的道德感-从rtruncnorm抽取高a值有一个错误。 Python也有同样的问题。