我在R中应用敏感度包。特别是,我想使用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] 之间的采样值(我认为是密度绘制?这对任何人有意义和/或有没有人知道我如何按照包描述中的语法从正确的发行版中采样?
您可以在qnorm
中指定mean
和sd
。 所以修改这样的行:
x$X[,2] <- qnorm(x$X[,2])
像这样:
x$X[,2] <- qnorm(x$X[,2], mean = 579, sd = 21)
同样,您可以使用qunif
的min
和max
参数来获取给定范围内的值。
当然,也可以使用X <- 579 + 21*Z
或Y <- 0.03 + 0.04*U
之类的东西将标准法线或制服转换为您想要的法线或制服,其中Z
是标准法线,U
是标准均匀,但对于某些分布,这些转换并不那么简单,使用q*
函数可以更容易。