morris
implements the Morris's elementary effects screening
method (Morris, 1991). This method, based on design of experiments,
allows to identify the few important factors at a cost of \(r
\times (p+1)\) simulations (where \(p\) is the number
of factors). This implementation includes some improvements of the
original method: space-filling optimization of the design (Campolongo
et al. 2007) and simplex-based design (Pujol 2009).
morris(model = NULL, factors, r, design, binf = 0, bsup = 1,
scale = TRUE, ...)
# S3 method for morris
tell(x, y = NULL, ...)
# S3 method for morris
print(x, ...)
# S3 method for morris
plot(x, identify = FALSE, atpen = FALSE, y_col = NULL,
y_dim3 = NULL, ...)
# S3 method for morris
plot3d(x, alpha = c(0.2, 0), sphere.size = 1, y_col = NULL,
y_dim3 = NULL)
morris
returns a list of class "morris"
, containing all
the input argument detailed before, plus the following components:
the matched call.
a data.frame
containing the design of experiments.
either a vector, a matrix or a three-dimensional array of model
responses (depends on the output of model
).
if y
is a vector: a \((r \times p)\) - matrix of
elementary effects for all the factors.
if y
is a matrix: a
\((r \times p \times ncol(y))\) - array of
elementary effects for all the factors and all columns of y
.
if y
is a three-dimensional array: a
\((r \times p \times dim(y)[2] \times dim(y)[3])\) - array of elementary effects for all
the factors and all elements of the second and third dimension of
y
.
Notice that the statistics of interest (\(\mu\), \(\mu^*\)
and \(\sigma\)) are not stored. They can be printed by the
print
method, but to extract numerical values, one has to
compute them with the following instructions:
If x$y
is a vector:
mu <- apply(x$ee, 2, mean)
mu.star <- apply(x$ee, 2, function(x) mean(abs(x)))
sigma <- apply(x$ee, 2, sd)
If x$y
is a matrix:
mu <- apply(x$ee, 3, function(M){
apply(M, 2, mean)
})
mu.star <- apply(abs(x$ee), 3, function(M){
apply(M, 2, mean)
})
sigma <- apply(x$ee, 3, function(M){
apply(M, 2, sd)
})
If x$y
is a three-dimensional array:
mu <- sapply(1:dim(x$ee)[4], function(i){
apply(x$ee[, , , i, drop = FALSE], 3, function(M){
apply(M, 2, mean)
})
}, simplify = "array")
mu.star <- sapply(1:dim(x$ee)[4], function(i){
apply(abs(x$ee)[, , , i, drop = FALSE], 3, function(M){
apply(M, 2, mean)
})
}, simplify = "array")
sigma <- sapply(1:dim(x$ee)[4], function(i){
apply(x$ee[, , , i, drop = FALSE], 3, function(M){
apply(M, 2, sd)
})
}, simplify = "array")
It is highly recommended to use the function with the argument
scale = TRUE
to avoid an uncorrect interpretation of factors that
would have different orders of magnitude.
a function, or a model with a predict
method,
defining the model to analyze.
an integer giving the number of factors, or a vector of character strings giving their names.
either an integer giving the number of repetitions of the design,
i.e. the number of elementary effect computed per factor, or a
vector of two integers c(r1, r2)
for the space-filling
improvement (Campolongo et al. 2007). In this case, r1
is the
wanted design size, and r2
(\(> \code{r1}\))
is the size of the (bigger) population in which is extracted the
design (this can throw a warning, see below).
a list specifying the design type and its parameters:
type = "oat"
for Morris's OAT design (Morris 1991),
with the parameters:
levels
: either an integer specifying the number of
levels of the design, or a vector of integers for different
values for each factor.
grid.jump
: either an integer specifying the number of
levels that are increased/decreased for computing the
elementary effects, or a vector of integers for different values
for each factor. If not given, it is set to grid.jump =
1
. Notice that this default value of one does not follow
Morris's recommendation of
\(\texttt{levels} / 2\).
type = "simplex"
for simplex-based design (Pujol
2009), with the parameter:
scale.factor
: a numeric value, the homothety factor of
the (isometric) simplexes. Edges equal one with a scale factor
of one.
either an integer, specifying the minimum value for the factors, or a vector for different values for each factor.
either an integer, specifying the maximum value for the factors, or a vector for different values for each factor.
logical. If TRUE
, the input design of experiments is
scaled after building the design and before computing the elementary
effects so that all factors vary within the range [0,1]. For each factor,
the scaling is done relatively to its corresponding bsup and binf.
a list of class "morris"
storing the state of the
screening study (parameters, data, estimates).
a vector of model responses.
logical. If TRUE
, the user selects with the
mouse the factors to label on the \((\mu^*,\sigma)\)
graph (see identify
).
logical. If TRUE
(and identify = TRUE
), the
user-identified labels (more precisely: their lower-left corners) of the
factors are plotted at the place where the user had clicked (if near enough
to one of the factor points). If FALSE
(and identify = TRUE
),
the labels are automatically adjusted to the lower, left, upper or right
side of the factor point. For further information, see
identify
. Defaults to FALSE
.
an integer defining the index of the column of x$y
to be
used for plotting the corresponding Morris statistics \(\mu^*\)
and \(\sigma\) (only applies if x$y
is a matrix or an
array).
If set to NULL
(as per default) and x$y
is a matrix or an
array, the first column (respectively the first element in
the second dimension) of x$y
is used (i.e. y_col = 1
).
an integer defining the index in the third dimension of
x$y
to be used for plotting the corresponding Morris statistics
\(\mu^*\) and \(\sigma\) (only applies if x$y
is an
array).
If set to NULL
(as per default) and x$y
is a
three-dimensional array, the first element in the third dimension of
x$y
is used (i.e. y_dim3 = 1
).
a vector of three values between 0.0 (fully transparent) and 1.0
(opaque) (see rgl.material
). The first value is for the
cone, the second for the planes.
a numeric value, the scale factor for displaying the spheres.
for morris
: any other arguments for model
which
are passed unchanged each time it is called. For plot.morris
:
arguments to be passed to plot.default
.
when generating the design of experiments, identical repetitions are removed, leading to a lower number than requested.
Gilles Pujol, with contributions from Frank Weber (2016)
plot.morris
draws the \((\mu^*,\sigma)\) graph.
plot3d.morris
draws the \((\mu, \mu^*,\sigma)\) graph (requires the rgl package). On this graph, the
points are in a domain bounded by a cone and two planes (application
of the Cauchy-Schwarz inequality).
When using the space-filling improvement (Campolongo et al. 2007) of the Morris design, we recommend to install before the "pracma" R package: its "distmat"" function makes running the function with a large number of initial estimates (r2) significantly faster (by accelerating the inter-point distances calculations).
This version of morris
also supports matrices and three-dimensional
arrays as output of model
.
M. D. Morris, 1991, Factorial sampling plans for preliminary computational experiments, Technometrics, 33, 161--174.
F. Campolongo, J. Cariboni and A. Saltelli, 2007, An effective screening design for sensitivity, Environmental Modelling and Software, 22, 1509--1518.
G. Pujol, 2009, Simplex-based screening designs for estimating metamodels, Reliability Engineering and System Safety 94, 1156--1160.
morrisMultOut
# Test case : the non-monotonic function of Morris
x <- morris(model = morris.fun, factors = 20, r = 4,
design = list(type = "oat", levels = 5, grid.jump = 3))
print(x)
plot(x)
# \donttest{
library(rgl)
plot3d.morris(x) # (requires the package 'rgl')# }
# \donttest{
# Only for demonstration purposes: a model function returning a matrix
morris.fun_matrix <- function(X){
res_vector <- morris.fun(X)
cbind(res_vector, 2 * res_vector)
}
x <- morris(model = morris.fun_matrix, factors = 20, r = 4,
design = list(type = "oat", levels = 5, grid.jump = 3))
plot(x, y_col = 2)
title(main = "y_col = 2")
# Also only for demonstration purposes: a model function returning a
# three-dimensional array
morris.fun_array <- function(X){
res_vector <- morris.fun(X)
res_matrix <- cbind(res_vector, 2 * res_vector)
array(data = c(res_matrix, 5 * res_matrix),
dim = c(length(res_vector), 2, 2))
}
x <- morris(model = morris.fun_array, factors = 20, r = 4,
design = list(type = "simplex", scale.factor = 1))
plot(x, y_col = 2, y_dim3 = 2)
title(main = "y_col = 2, y_dim3 = 2")
# }
Run the code above in your browser using DataLab