将均匀抽取转换为 R 中已知均值和标准差的正态分布

Convert uniform draws to normal distributions with known mean and std in R

我在 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] 之间的采样值(我认为是密度绘制?)。这对任何人都有意义 and/or 有人知道我如何按照包描述中的语法从正确的分布中抽样吗?

您可以在qnorm中指定meansd。所以像这样修改行:

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

像这样:

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

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

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