Morris Method (Elementary Effects)
Theoretical Foundations of the Morris Method
The Role of Screening
I want to run an uncertainty study, but I have twenty parameters — computing Sobol' indices for all of them looks like tens of thousands of runs…
That's exactly what the Morris method — the Elementary Effects method — exists for. Of your twenty parameters, usually only a handful really drive the response. Morris sorts influential factors from negligible ones in a few hundred runs, as a screening stage before serious variance-based analysis (Sobol') or optimization. Dropping the inert factors first cuts the downstream cost by orders of magnitude.
Definition of the Elementary Effect
Normalize the inputs \( \mathbf{x} = (x_1, \dots, x_k) \) to the unit hypercube and perturb only factor \( i \) by a step \( \Delta \). The resulting rate of change is that factor's Elementary Effect (EE):
$$ EE_i = \frac{f(x_1, \dots, x_i + \Delta, \dots, x_k) - f(\mathbf{x})}{\Delta} $$
This is a finite-difference derivative at one point — but Morris's key idea is to sample EEs at many locations across the input space and use their statistics as a global sensitivity measure. Nonlinearity and interactions invisible to a single local gradient show up as scatter in the EEs.
The Three Statistics μ, μ*, σ and How to Read Them
From \( r \) repetitions you compute, per factor:
| Statistic | Definition | Meaning |
|---|---|---|
| \( \mu_i \) | Mean of \( EE_i \) | Signed average influence; positive and negative EEs can cancel |
| \( \mu_i^* \) | Mean of \( |EE_i| \) (Campolongo's refinement) | The primary ranking measure — immune to cancellation |
| \( \sigma_i \) | Standard deviation of \( EE_i \) | Larger means stronger nonlinearity or interaction with other factors |
Plot the results in the \( \mu^* \)–\( \sigma \) plane: near the origin = negligible (safe to fix); along the horizontal axis = influential and linear; above the diagonal = influential with nonlinearity/interactions. A large gap between \( \mu^* \) and \( \mu \) additionally flags non-monotonic behavior with sign changes.
Sampling Design and Computation
Trajectory Design and Run Count
EEs are collected efficiently via trajectories: starting from a random point, perturb the \( k \) factors one at a time to obtain \( k+1 \) points — one trajectory yields one EE per factor. With \( r \) trajectories, the total number of analyses is
$$ N = r\,(k+1) $$
With \( k=20 \) factors and \( r=15 \) trajectories: 315 runs. Direct Sobol' estimation typically needs on the order of \( N=(k+2)\times 10^3 \) runs — two orders of magnitude more. Inputs are discretized to \( p \) levels per dimension (even; \( p=4 \) is standard) with the step \( \Delta = p/(2(p-1)) \) (= 2/3 for \( p=4 \)).
Choosing r and Confirming Stability
Start with \( r = 10\sim20 \) — but always pair it with a stability check. Compute rank correlation of \( \mu^* \) between the full trajectory set and a half-thinned one, confirming the top factors don't reshuffle. Bootstrap confidence intervals on \( \mu^* \) let you report overlapping factors honestly as "tied." If your goal is only separating the important group from the negligible group, small rank swaps within a group don't matter.
CAE-Specific Preprocessing — Ranges and Normalization
Young's modulus is in GPa, thickness in millimeters, heat transfer coefficients in W/m²K… can I really compare them directly?
Not as-is. Every factor is normalized to 0–1 over its own variation range before EEs are computed — which means the results depend on the ranges you set. Sweep Young's modulus over ±3% or ±30% and the ranking can change. Set ranges from measurement data, standards, or literature, and always state them in the report. The justification of your ranges is the quality of your sensitivity analysis.
When multiple responses matter (peak stress and first natural frequency, say), rankings usually differ per response. Run Morris per response and only fix factors that are negligible for every response — that is the conservative rule.
Applying It in Practice
Standard Workflow
- Define factors and ranges — material constants, thicknesses, boundary stiffnesses, loads, friction coefficients; record the basis (standards, measured scatter, process capability)
- Generate trajectory samples — an input matrix of \( r(k+1) \) rows via SALib or similar
- Automate the runs — template substitution → job submission → response extraction, fully scripted
- Compute EE statistics and the μ*–σ plot — triage factors (important / nonlinear-interacting / negligible)
- Confirm stability — trajectory thinning and bootstrap
- Hand off — carry only the top factors into Sobol' analysis, robust optimization, or calibration
Handling Failed Runs
Sweep a CAE model across ranges and some runs will fail — mesh generation errors, non-convergence — typically near range edges. Silently discarding them biases the EEs, so decide the policy up front: ① if failures cluster at one factor's extreme, revisit the range (that corner may be unphysical); ② if sporadic, drop the whole trajectory and add a fresh one; ③ if feasibility itself is the interesting output, switch the response to a feasible/infeasible indicator. Report the failure rate and the policy — that's a reproducibility requirement.
Reporting Results
Three artifacts make your screening auditable: the μ*–σ scatter plot with factor labels, a μ* bar chart with bootstrap intervals for the top factors, and a table of fixed factors with justification. A report that says "sensitivity analysis showed thickness and joint stiffness dominate" without these figures is unverifiable — avoid it.
Tools and CAE Integration
Tool Support
| Tool | Morris implementation | Character |
|---|---|---|
| SALib (Python) | morris module (trajectory generation + analysis) | Free and lightweight; the default choice for scripted CAE loops |
| OpenTURNS | Morris experiment classes | Integrated with full UQ stack (distributions to reliability) |
| Dakota | psuade_moat method | Mature solver-interface framework; HPC-friendly |
| UQLab (MATLAB) | Sensitivity module | Easy coupling with Kriging and other metamodels |
| optiSLang / modeFRONTIER etc. | Built into DOE/sensitivity features | GUI integration and job management with commercial solvers |
Minimal SALib Implementation
Replace run_fem with your solver call and this skeleton becomes production code:
import numpy as np
from SALib.sample import morris as morris_sample
from SALib.analyze import morris as morris_analyze
problem = {
"num_vars": 3,
"names": ["E", "thickness", "k_support"],
"bounds": [[190e9, 210e9], [1.8e-3, 2.2e-3], [1e6, 1e8]],
}
X = morris_sample.sample(problem, N=15, num_levels=4) # 15 trajectories -> 15*(3+1)=60 runs
Y = np.array([run_fem(x) for x in X]) # run CAE per row
Si = morris_analyze.analyze(problem, X, Y, num_levels=4)
print(Si["mu_star"], Si["sigma"])
Job Automation Reality
Automating hundreds of runs means scripting four things: ① input-file templating (parameters as placeholders), ② parallel job submission and completion monitoring, ③ response extraction from result files, ④ failure flagging. If any manual step remains, 315 runs will never actually happen — "the whole loop runs unattended" is the de facto prerequisite for adopting Morris.
Research Frontiers
Improved Sampling Designs
Beyond classical random trajectories: Campolongo's trajectory selection maximizing inter-trajectory spread, radial designs (perturbing each factor from a common base point), and Latin-hypercube-based hybrids. Radial designs share components with Sobol' total-index estimators, making the transition from screening to variance-based analysis seamless.
Group Screening for High Dimensions
With dozens to hundreds of factors, group physically related parameters and measure group-level EEs first, then analyze only surviving groups factor-by-factor. The two-stage approach scales roughly logarithmically with factor count — well matched to CAE problems like many-parameter hardening laws or hundreds of spot-weld stiffnesses.
Relation to Metamodels and Total Indices
\( \mu^* \) is known to behave as a cheap proxy for the Sobol' total-effect index, which underpins today's best-practice pipeline: Morris for dimension reduction → Kriging surrogate on the survivors → rigorous Sobol' indices on the surrogate. Over-aggressive screening shows up later as unexplained surrogate residuals, so keep borderline factors in — that's the safe side.
Troubleshooting
Symptoms, Causes, and Fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Ranking changes on every run | Too few trajectories; top factors genuinely tied | Double r and check rank correlation; report ties via confidence intervals |
| All μ* similarly small | Ranges too narrow; wrong response chosen | Revisit range justification; nondimensionalize or switch the response |
| Small μ* but large σ for a factor | Non-monotonic effect with sign cancellation | Don't fix it; compare μ vs μ* and run a 1-D sweep to see the shape |
| Runs crash whenever one factor moves | Unphysical range edge (negative gap, extreme ratio) | Constrain the range physically; log the failure policy |
| Response scatter drowns in numerical noise | Remeshing/convergence jitter contaminating EEs | Freeze the mesh (morphing), tighten convergence, enlarge Δ |
| Discrete parameters (element type etc.) | Morris assumes continuous factors | Stratify by level, or run full combinations × continuous-factor Morris |
Common Misuse — Over-Interpreting "Sensitivity"
Can I report the factor with the largest μ* as "the most important parameter"?
Yes — with two conditions. First, Morris rankings are relative to the ranges you set, so report it as "thickness dominates within ±10% variation," range included. Second, μ* is not a quantitative variance share; if you need "X% of the variance," compute Sobol' indices on the top factors afterward. Screening is a tool for accelerating the decision to discard; quantifying influence is the next stage's job. Respect that boundary and Morris becomes the highest-ROI step in the whole UQ workflow.
Related reading: Sparse PCE with LAR, Kriging surrogates, Bayesian calibration.
Feel the theory hands-on with the interactive simulators in this field
Simulator LibraryRelated Fields
detail
error