微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何为 R 中的 Sobol 灵敏度分析创建采样矩阵包“灵敏度”

如何解决如何为 R 中的 Sobol 灵敏度分析创建采样矩阵包“灵敏度”

我想在 R 中执行 Sobol 敏感性分析

包“敏感性”应该允许我这样做,但我不明白如何生成采样矩阵(X1,X2)。我有一个在 R 之外运行的模型。我有 6 个均匀分布的参数。

在我的教科书中:N = (2k+2)*M ; M = 2^b ; b=[8,12](新采样方法:Wu et al. 2012)

我觉得我应该创建两个采样矩阵并将这两个矩阵提供给 sobol 函数 X1_{M,k} X2_{M,k}

最终采样矩阵x$X的维度为(k+2)*M。因为:

  X <- rbind(X1,X2)
  for (i in 1:k) {
    Xb <- X1
    Xb[,i] <- X2[,i]
    X <- rbind(X,Xb)
  }

我应该如何进行采样以获得正确的 (2*k+2)*M 运行次数

这个脚本是针对旧方法的,但有人知道新方法是否已经在敏感包中实现了吗?请随意评论此过程

name = c("a","b","c","d","e","f")
vals <- list(list(var="a",dist="unif",params=list(min=0.1,max=1.5)),list(var="b",params=list(min=-0.3,max=0.4)),list(var="c",max=0.3)),list(var="d",params=list(min=0,max=0.5)),list(var="e",params=list(min=2.4E-5,max=2.4E-3)),list(var="f",params=list(min=3E-5,max=3E-3)))
k = 6
b = 8
M = 2^b
n <- 2*M
X1 <- makeMCSample(n,vals,p = 1)
X2 <- makeMCSample(n,p = 2)

x <- sobol2007(model = NULL,X1,X2,nboot = 200)

如果我理解正确,我应该为每个 x$X 采样组合提供一个 y

然后我可以使用函数“tell”来生成 Sobol 的一阶索引以及总索引

tell(x,y)
ggplot(x)

补充 R 函数 SobolR

makeMCSample <- function(n,vals) {
  # Packages to generate quasi-random sequences
  # and rearrange the data
  require(randtoolBox)
  require(plyr)
  
  # Generate a Sobol' sequence
  if (p == 2){ sob <- sobol(n,length(vals),seed = 4321,scrambling = 1)
  }else{sob <- sobol(n,seed = 1234,scrambling = 1)}
  
  # Fill a matrix with the values
  # inverted from uniform values to
  # distributions of choice
  samp <- matrix(rep(0,n*(length(vals)+1)),nrow=n)
  samp[,1] <- 1:n
  for (i in 1:length(vals)) {
    # i=1
    l <- vals[[i]]
    dist <- l$dist
    params <- l$params
    fname <- paste("q",dist,sep="")
    samp[,i+1] <- do.call(fname,c(list(p=sob[,i]),params))
  }
  
  # Convert matrix to data frame and add labels
  samp <- as.data.frame(samp)
  names(samp) <- c("n",laply(vals,function(l) l$var))
  return(samp)
}

ref: Qiong-Li Wu、Paul-Henry Cournède、Amélie Mathieu,2012,全局敏感性分析的高效计算方法及其在树木生长建模中的应用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。