【问题标题】:Convert uniform draws to normal distributions with known mean and std in R将均匀绘制转换为 R 中已知均值和标准的正态分布
【发布时间】:2018-10-09 08:36:54
【问题描述】:

我在 R 中应用 sensitivity 包。特别是,我想使用 sobolroalhs,因为它对输入使用采样程序,允许评估具有大参数数量。该函数对所有输入统一采样 [0,1]。据说需要如下获得所需的分布

####################
# Test case: dealing with non-uniform distributions
x <- sobolroalhs(model = NULL, factors = 3, N = 1000, order =1, nboot=0)
# X1 follows a log-normal distribution:
x$X[,1] <- qlnorm(x$X[,1])
# X2 follows a standard normal distribution:
x$X[,2] <- qnorm(x$X[,2])
# X3 follows a gamma distribution:
x$X[,3] <- qgamma(x$X[,3],shape=0.5)
# toy example
toy <- function(x){rowSums(x)}
y <- toy(x$X)
tell(x, y)
print(x)
plot(x)

对于我想从正态分布中采样的某些输入参数,我有非零均值和标准差。对于其他人,我想在定义的范围内均匀采样(例如 [0.03,0.07] 而不是 [0,1])。我尝试使用内置的 R 函数,例如

SA$X[,1]  <- rnorm(1000, mean = 579,  sd = 21) 

但我担心这个程序会弄乱包装的抽样设计,并导致敏感度指数出现奇怪的结果。因此,我认为我需要遵守 sobolroalhs 函数的均匀绘制,并在绘制出所需分布时使用 [0, 1] 之间的采样值(我认为是密度绘制?)。这对任何人是否有意义和/或是否有人知道我如何按照包描述中的语法从正确的发行版中采样?

【问题讨论】:

    标签: r distribution sampling montecarlo


    【解决方案1】:

    您可以在qnorm 中指定meansd。所以修改如下行:

    x$X[,2] <- qnorm(x$X[,2])
    

    到这样的事情:

    x$X[,2] <- qnorm(x$X[,2], mean = 579, sd = 21)
    

    同样,您可以使用qunifminmax 参数来获取给定范围内的值。

    当然,也可以使用X &lt;- 579 + 21*ZY &lt;- 0.03 + 0.04*U 之类的东西将标准法线或制服转换为您想要的,其中Z 是标准法线,U 是标准制服,但对于某些人来说这些转换并不是那么简单,使用q* 函数会更容易。

    【讨论】:

    • 无论我使用 rnorm 并替换统一绘制,还是使用带有 x$X[,2] 作为参数的 qnorm,您是否会期望样本有任何差异? qnorm 方法是否以某种方式考虑了采样的统一值,或者这只是抽取次数的填充物?
    • 试试吧!阅读帮助页面!如果您不了解您所看到/阅读的内容,请在此处提出新问题(如果您的问题更多是关于统计数据而不是编程,则可能在 stats.stackexchange.com 网站上提出)。