从截断的正态分布绘制在 R 中提供了错误的标准偏差
Drawing from truncated normal distribution delivers wrong standard deviation in R
我从截断的正态分布中抽取随机数。截断后的正态分布在从左侧 0 处截断后应该具有均值 100 和标准差 60。
我计算了一个算法来计算截断前正态分布的均值和标准差(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))
好的,我做了快速测试
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 vs 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也有同样的问题
我从截断的正态分布中抽取随机数。截断后的正态分布在从左侧 0 处截断后应该具有均值 100 和标准差 60。 我计算了一个算法来计算截断前正态分布的均值和标准差(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))
好的,我做了快速测试
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 vs 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也有同样的问题