Calculates the main effect of a variable, which is independent of process performance, on a function.
Usage
mainEff(
BMBobj,
fn,
rangex,
xj,
N = 50,
res = 100,
hdi.params = c(1, 0.95),
...
)Arguments
- BMBobj
A
BayesMassBalobject originally obtained from theBMBfunction. SeeBMB.- fn
A character string naming a function with arguments of
BMBobj$ybaland independent random variablesX. See Details and examples for more on function requirements.- rangex
A numeric matrix. Each column of
rangexcontains the minimum and maximum value of uniformly distributed random values making up vector \(x\).- xj
Integer indexing which element in \(x\) is used for conditioning for \(E_x\lbrack f(x,y)|x_j\rbrack\). If a vector is supplied the marginal main effect of each element is calculated sequentially. The integers supplied in
xjare equivalent to the indices of the columns inrangex.- N
Integer specifying the length of the sequence used for
xj. LargerNtrades a higher resolution of the main effect ofxjfor longer computation time and larger RAM requirements.- res
Integer indicating the number of points to be used for each Monte-Carlo integration step. Larger
resreduces Monte-Carlo variance as the expense of computation time.- hdi.params
Numeric vector of length two, used to calculate Highest Posterior Density Interval (HPDI) of the main effect
xjusinghdi.hdi.params[1] = 1indicateshdiis used, and the mean and HPDI bounds are returned instead of the every sample from the distribution of \(E_x\lbrack f(x,y)|x_j\rbrack\). The second element ofhdiis passed to thecredMassargument in thehdifunction. The default,hdi.params = c(1,0.95), returns 95% HPDI bounds.- ...
Extra arguments passed to the named
fn
Value
A list of length(xj) list(s). Each list specifies output for the main effect of a xj
gThe grid used for a particular
xjfn.outA matrix giving results on \(E_x\lbrack f(x,y)|x_j\rbrack\). If
hdi.params[1] = 1, the mean and Highest Posterior Density Interval (HPDI) bounds of \(E_x\lbrack f(x,y)|x_j\rbrack\) are returned. Otherwise, samples of \(E_x\lbrack f(x,y)|x_j\rbrack\) are returned. The index of each column offn.outcorresponds to the the value ofgat the same index.fnCharacter string giving the name of the function used. Same value as argument
fn.xjInteger indicating the index of \(x\) corresponding to a grouped
fn.outandg.
Details
The mainEff function returns a distribution of \(E_x\lbrack f(x,y)|x_j\rbrack\), marginalized over the samples of BMBobj$ybal, giving the distribution of \(E_x\lbrack f(x,y)|x_j\rbrack\) which incorporates uncertainty of a chemical or particulate process.
In the current implementation of mainEff in the BayesMassBal package, only uniformly distributed values of \(x\) are supported.
The \(f(x,y)\) is equivalent to the supplied function named in mainEff(fn). For the arguments of fn, ybal is structured in a similar manner as BMBobj$ybal. The only difference being individual columns of each matrix are used at a time, and are vectorized. Note the way ybal is subset in the example function fn_example. The supplied X is a matrix, with columns corresponding to each element in \(x\). The output to fn must be a vector of length nrow(x). The first argument of fn must be X, the second argument must be BMBobj$ybal. Order of other arguments passed to fn through ... does not matter. Look at the example closely for details!
Examples
## Importing Data, generating BMB object
y <- importObservations(file = system.file("extdata", "twonode_example.csv",
package = "BayesMassBal"),
header = TRUE, csv.params = list(sep = ";"))
C <- matrix(c(1,-1,0,-1,0,0,1,-1,0,-1), byrow = TRUE, ncol = 5, nrow = 2)
X <- constrainProcess(C = C)
BMB_example <- BMB(X = X, y = y, cov.structure = "indep",
BTE = c(10,200,1), lml = FALSE, verb=0)
fn_example <- function(X,ybal){
cu.frac <- 63.546/183.5
feed.mass <- ybal$CuFeS2[1] + ybal$gangue[1]
## Concentrate mass per ton feed
con.mass <- (ybal$CuFeS2[3] + ybal$gangue[3])/feed.mass
## Copper mass per ton feed
cu.mass <- (ybal$CuFeS2[3]*cu.frac)/feed.mass
gam <- c(-1,-1/feed.mass,cu.mass,-con.mass,-cu.mass,-con.mass)
f <- X %*% gam
return(f)
}
rangex <- matrix(c(4.00 ,6.25,1125,1875,3880,9080,20,60,96,208,20.0,62.5),
ncol = 6, nrow = 2)
mE_example <- mainEff(BMB_example, fn = "fn_example",rangex = rangex,xj = 3, N = 15, res = 4)