R_script.R

Revision 1 - 10/23/09 at 2:36 pm by eric.ward

Back to revision history for R_script.R
This file is part of the project Bayesian SI mixing models
library(runjags)
library(R2jags)
library(gtools)
library(gdata)

  num.iso = 1  # the number of isotopes
  N = 20       # the number of data points to generate (# of consumers)
  # Z is a matrix of ~ Normal(0,1) numbers to create datasets
  Z = matrix(rnorm(N*num.iso,0,1),N, num.iso)
  # if you generate a small sample, you may want to standardize:
  #Z = Z /(sd(Z)); Z = Z - mean(Z)
  p.contrib = c(0.6,0.3,0.1) # this is a vector of diet proportions
  u.mid = 5  # u.mid = arbitrary location of the isotope to use for simulations
  num.prey = length(p.contrib) # number of sources

  # These are all MCMC parameters...same as the ones we used
  mcmc.chainLength <- as.integer(70000)  # burn-in plus post-burn
  mcmc.burn <- as.integer(50000)
  mcmc.thin = 1;
  mcmc.adapt = 5000
  mcmc.chains = 3       # needs to be at least 2 for DIC
  dic.samples = 5000
  alpha=rep(1,num.prey)  # alpha is the hyperparameters for the Dirichlet

  u.steps = seq(0,10,0.1) # this is the vector of increments to explore over the simulations
  u.steps = u.steps[-1] # we'll ignore 0 separation for now
  
  # note: right now, this only stores the quantiles for the 1st proportion...others could be stored too
  mixSIR.results = matrix(0, length(u.steps),3) # stores quantiles for mixSIR model
  bayes.results = matrix(0, length(u.steps),3)  # stores quantiles for bayesian model
    
  for(k in 1:length(u.steps)) {
    u.dif = u.steps[k]
    
    # u is the vector of means for this isotope
    u = matrix(0, num.prey, num.iso)
    u[,1] = c(u.mid-u.dif, u.mid, u.mid+u.dif)
    # sigma2 is the vector of variances...
    sigma2 = matrix(0, num.prey, num.iso)
    sigma2[,1] = c(1.15,1.5,1.25)
    
    # this series of loops creates a new dataset, X.  Note that only 1 Z was drawn above, and we're using the same deviations over and over
    X = matrix(0, N, num.iso)
    for(i in 1:N) {
      for(j in 1:num.prey) {
      	  for(ii in 1:num.iso) {
           X[i,ii] = X[i,ii] + p.contrib[j] * (u[j,ii] + sqrt(sigma2[j,ii])*Z[i,ii])
        }      
      }
    }
    
    # This block runs the mixSIR-type model
    jags.data = list("u","sigma2", "N", "num.prey", "num.iso","X", "alpha")
    jags.params=c("p")
    model.loc = "mixSIR model.txt"  
    jags.mixSIRmodel = jags(jags.data, inits = NULL, parameters.to.save= jags.params, model.file=model.loc, n.chains = mcmc.chains, n.burnin = mcmc.burn, n.thin = mcmc.thin, n.iter = mcmc.chainLength, DIC = FALSE)

    # store the median and 95% credible intervals
    mixSIR.results[k,]=quantile(jags.mixSIRmodel$BUGSoutput$sims.matrix[,1],c(0.025,0.5,0.975))   
    
    # this block sets up the parameters for the bayesian code.  Samp.size is the vector of sample sizes collected for each isotope.  I used a value of 3, because it's about the smallest I've found in some published studies.  I have experimented with larger values...10, 20, 100
    samp.size = matrix(3, num.prey, num.iso)
    sigma.v0 = matrix(0, num.prey, num.iso)
    u.loc = u
    u.scale = matrix(0, num.prey, num.iso)
    sigma.scale2 = matrix(0, num.prey, num.iso) # scale param for var
    sigma.v0.n = samp.size + sigma.v0
    sigma2.n = (sigma.v0*sigma.scale2 + (samp.size-1)*sigma2 + ((u.scale*samp.size)*(u - u.loc)^2)/(u.scale + samp.size))/sigma.v0.n 
    
    # This block runs the fully bayesian model
    jags.data = list("u","sigma2", "N", "num.prey", "num.iso","X", "alpha", "samp.size", "sigma.v0.n", "sigma2.n", "u.loc", "u.scale")
    jags.params=c("p")
    model.loc = "bayes model.txt"  
    jags.newModel = jags(jags.data, inits = NULL, parameters.to.save= jags.params, model.file=model.loc, n.chains = mcmc.chains, n.burnin = mcmc.burn, n.thin = mcmc.thin, n.iter = mcmc.chainLength, DIC = FALSE)
    # again, store the median and 95% intervals
    bayes.results[k,]=quantile(jags.newModel$BUGSoutput$sims.matrix[,1],c(0.025,0.5,0.975))   

        
    if(k==50) {
    	 sir.data.for.plot = jags.mixSIRmodel$BUGSoutput$sims.matrix
    	 bayes.data.for.plot = jags.newModel$BUGSoutput$sims.matrix
    }
  }

Sculpin 0.2 | xhtml | problems or comments? | report bugs