【问题标题】:How to run same model multiple times with different set.seed() in R?如何在 R 中使用不同的 set.seed() 多次运行相同的模型?
【发布时间】:2020-01-12 06:01:28
【问题描述】:

我想用不同的种子运行以下模型 3 次。例如,下面的模型使用种子314159运行

set.seed(314159)
    x <- c(11, 5, 2, -5, 7, 2, -11, 9, -5, -5, -4, 17, 2, -10, -11, -10,
           -4, 2, 1, 13)
    a <- 0.1
    b <- 0.1
    c <- 0
    d <- 100^2

    M <- 1e3
    sample <- array(NA, dim=c(M,2))
    mu <- mean(x)
    sig2 <- var(x)
    for( m in 1:M ){
      mu <- rnorm(1, (length(x) + 1/d)^(-1) * (sum(x) + c/d),
                  sqrt( sig2/(length(x) + 1/d) ))
      sig2 <- rigamma(1, .5*length(x)+a+.5,
                      .5*sum( (x-mu)^2 ) + 1/(2*d)*(mu-c)^2 + b )
      sample[m,] <- c(mu,sig2)
    }
    plot( density( sample[,1] ))
    plot( density( sample[,2] ))

如果我想为种子 523626626789 运行相同的模型,我可以使用任何 for 循环吗? 任何帮助表示赞赏?

【问题讨论】:

    标签: r model seed


    【解决方案1】:

    将代码放入函数中

    apply_fun <- function() {
      x <- c(11, 5, 2, -5, 7, 2, -11, 9, -5, -5, -4, 17, 2, -10, -11, -10,-4, 2, 1, 13)
      a <- 0.1
      b <- 0.1
      c <- 0
      d <- 100^2
      M <- 1e3
      sample <- array(NA, dim=c(M,2))
      mu <- mean(x)
      sig2 <- var(x)
      for( m in 1:M ){
        mu <- rnorm(1, (length(x) + 1/d)^(-1) * (sum(x) + c/d),
                sqrt( sig2/(length(x) + 1/d) ))
        sig2 <- rigamma(1, .5*length(x)+a+.5,
                    .5*sum( (x-mu)^2 ) + 1/(2*d)*(mu-c)^2 + b )
        sample[m,] <- c(mu,sig2)
      }
       plot( density( sample[,1] ))
       plot( density( sample[,2] ))
    }
    

    然后在每个种子值上使用lapply

    output <- lapply(c(314159, 523626, 626789), function(x) {set.seed(x);apply_fun()})
    

    rigamma 在哪里

    rigamma = function(n, a, b) return(1/rgamma(n, shape = a, rate = b))
    

    【讨论】:

      【解决方案2】:

      你可以循环遍历种子

      library(LearnBayes)
      seeds <- c(314159,523626,626789)
      
      for (seed in seeds) {
        set.seed(seed)
        x <- c(11, 5, 2, -5, 7, 2, -11, 9, -5, -5, -4, 17, 2, -10, -11, -10,
          -4, 2, 1, 13)
        a <- 0.1
        b <- 0.1
        c <- 0
        d <- 100^2
      
        M <- 1e3
        sample <- array(NA, dim=c(M,2))
        mu <- mean(x)
        sig2 <- var(x)
        for( m in 1:M ){
          mu <- rnorm(1, (length(x) + 1/d)^(-1) * (sum(x) + c/d),
            sqrt( sig2/(length(x) + 1/d) ))
          sig2 <- rigamma(1, .5*length(x)+a+.5,
            .5*sum( (x-mu)^2 ) + 1/(2*d)*(mu-c)^2 + b )
          sample[m,] <- c(mu,sig2)
        }
        plot( density( sample[,1] ))
        plot( density( sample[,2] ))
      }
      

      reprex package (v0.3.0) 于 2020-01-12 创建

      【讨论】:

      • 如何通过种子名称将所有三个样本分别保存为 R 文件?
      猜你喜欢
      • 2021-05-08
      • 1970-01-01
      • 2021-01-02
      • 2021-03-19
      • 1970-01-01
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多