Fellow R users,

I'm using the BCE {BCE} function to run a Bayesian sediment mixing model. The aim is to find the optimum % contribution from each of the 4 source areas that can yield the target geochemistry.

I have geochemistry for 4 source areas called Rat:

Rat<-read.table(text="CaO       MgO      Na2O    Al2O3
Topsoils      2.511250 0.7445500 0.7085500 14.10375
ChannelBanks 55.021500 0.8665000 0.3045000 10.19800
FieldDrains  17.958221 0.9415394 0.2979383 14.68013
RoadRunoff    9.177297 1.9034304 0.4618634 22.22206", header=TRUE)

...and geochemistry for 1 target sediment called Dat:

Dat<-read.table(text=" CaO   MgO  Na2O  Al2O3
Targethf 15.741 1.346 0.368 19.872", header=TRUE)

I have absolute stdev on the sources called adssdRat:

abssdRat<-read.table(text="                   CaO       MgO       Na2O    Al2O3
Topsoils     1.8552515 0.1135672 0.06212094 1.491125
ChannelBanks 9.8400162 0.1401057 0.08599080 2.708710
FieldDrains  2.3896499 0.1961217 0.02545431 4.300644
RoadRunoff   0.7780579 0.1749869 0.02848264 1.116747", header =TRUE)

...and absolute stdev on the target called adssdDat:

abssdDat<-read.table(text="    CaO   MgO  Na2O Al2O3
1 0.877 0.531 0.264 2.439", header=TRUE)


Whilst the model results are OK, there is one problem. The model fails to take into consideration covariance between the geochemistry in each source area (Rat) and therefore the uncertainty in the output is likely to be overestimated (e.g. Mg and Na are strongly positively correlated in each of the 4 source areas)

My understanding is that this can be corrected for by changing the "userProb" argument such that the multivariate normal distribution is called for 'Rat' instead of the default gamma distribution. However I am having trouble in writing a new "userProb" argument, so I'd be very grateful to anyone who could help me out with this. Failing that, does anybody know of another package for Bayesian optimisation that could account for covariance in the source area geochemistry?

For anyone that can help, you may need the logprobability function that BCE calls as the default when userProb is set to NULL:
##########
logProbabilityBCE1 <-
  function (RAT, X, init.list)
  {
    with(init.list, {
      if (!is.null(userProb))
        logp <- log(userProb(RAT, X))
      else {
        y <- X %*% RAT
        if (!is.null(positive)) {
          dA.p <- dgamma(RAT[ind.pos], krat[ind.pos], lrat[ind.pos],
                         log = TRUE)
          kdat <- y^2/sddat^2
          ldat <- y/sddat^2
          kdat[Dat == 0] <- 1
          ldat[Dat == 0 & !is.na(Dat)] <- 1/y[Dat == 0 &
            !is.na(Dat)]
          dB.p <- dgamma(Dat[, positive], kdat[, positive],
                         ldat[, positive], log = TRUE)
        }
        else {
          dA.p <- 0
          dB.p <- 0
        }
        if (any(wholeranged)) {
          dA.r <- dnorm(RAT[ind.r], Rat[ind.r], sdrat[ind.r],
                        log = TRUE)
          dB.r <- dnorm(y[, wholeranged], Dat[, wholeranged],
                        sddat[, wholeranged], log = TRUE)
        }
        else {
          dA.r <- 0
          dB.r <- 0
        }
        dA.p[dA.p < -1e+08] <- -1e+08
        dA.p[dA.p > +1e+08] <- +1e+08
        dA.r[dA.r < -1e+08] <- -1e+08
        dA.r[dA.r > +1e+08] <- +1e+08
        drat <- sum(dA.p, dA.r, na.rm = TRUE)
        if (unif)
          drat <- 0
        if (any(RAT < minRat | RAT > maxRat, na.rm = TRUE))
          drat <- -Inf
        dB.p[dB.p < -1e+08] <- -1e+08
        dB.p[dB.p > +1e+08] <- +1e+08
        dB.r[dB.r < -1e+08] <- -1e+08
        dB.r[dB.r > +1e+08] <- +1e+08
        ddat <- sum(dB.p, dB.r, na.rm = TRUE)/nst
        logp <- drat + ddat
      }
      return(logp)
    })}

##########

Regards

	[[alternative HTML version deleted]]

