【问题标题】:Drawing from truncated normal distribution delivers wrong standard deviation in R从截断的正态分布中绘制会在 R 中提供错误的标准偏差
【发布时间】:2019-05-16 15:25:05
【问题描述】:

我从截断的正态分布中抽取随机数。截断的正态分布在从左侧截断后的 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))

【问题讨论】:

  • 你确定这是你想要的吗?您基本上是在要求高斯分布的尾部——超过 7 sigma 的右尾部!在非截断高斯中找到超过 6 sigma 的值的概率是十亿分之一
  • 谢谢,我知道了。但是,我需要这个来进行计算。
  • 如果我没记错研究生,使用重要性抽样来有效地从高斯的尾部绘制是非常容易的。 This source looks promising,但是如果你搜索“高斯的重要性采样尾巴”还有很多其他的。

标签: r random distribution normal-distribution


【解决方案1】:

好的,我做了快速测试

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 也有同样的问题。

【讨论】:

  • Python 错误似乎被识别为 in this issue,这一年没有太多活动,但现在看起来有一个待处理的拉取请求要修复。
  • @Gregor 是的,逆变换可能适用于这些地区。坦率地说,我不知道如何解决它,以后会重新访问它
猜你喜欢
  • 1970-01-01
  • 2015-01-04
  • 2019-12-20
  • 2013-12-13
  • 2013-08-08
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多