Many biological objects display some sort of symmetry. Morphometric analyses often investigate symmetry in some manner: either by evaluating components of variation attributed to different symmetry effects (e.g., directional, fluctuating, etc.), or by accounting for symmetry prior to the analysis (e.g., obtain ‘symmetrized’ shapes for subsequent investigation). This tutorial will focus on the latter, and give an overview of the preliminary steps necessary for generation of symmetric shapes. Analyses of asymmetry are covered in a separate tutorial.
This tutorial will utilize the function bilat.symmetry.
The function will be described in much greater detail in the [asymmetry
tutorial], as well as the advanced options page, but all
relevant arguments and outputs for the removal of asymmetric shape
components will be described here.
bilat.symmetry() (Expand for more details)
\(A\): A 3D array of either raw, or
Procrustes-aligned landmark coordinates OR a gpagen
object, that is, the output from the gpagen
function.
\(ind\): A vector containing labels for each individual:
lizards$ind
## [1] 29 29 30 30 31 31 32 32 33 33 34 34 35 35 36 36 37 37 38 38 39 39 40 40 41 41 42 42 43 43 44 44 45 45 46
## [36] 46 47 47 48 48 49 49 50 50 51 51 52 52 53 53 54 54 55 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63
## [71] 64 64 65 65 66 66 67 67 68 68 69 69 70 70 71 71 72 72 73 73 74 74 75 75 76 76 77 77
Here, the levels indicate different individuals, whose landmarks on
sided elements have been repeated.
lizards$rep
## [1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
## [54] 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
\(object.sym\): Since these data are an example of object symmetry, this argument is set to TRUE.
\(land.pairs\): In the case of object symmetry, this argument contains a matrix indicating numbers for matched pairs of landmarks across the line of symmetry:
lizards$lm.pairs
## [,1] [,2]
## [1,] 13 14
## [2,] 2 11
## [3,] 15 16
## [4,] 27 28
## [5,] 3 10
## [6,] 17 19
## [7,] 4 9
## [8,] 20 21
## [9,] 22 24
## [10,] 5 8
## [11,] 6 7
## [12,] 25 26
Let’s start with the lizards dataset embedded in
geomorph; data that are an example of object symmetry:
lizard.sym <- bilat.symmetry(lizards$coords, ind = lizards$ind,
replicate = lizards$rep, object.sym = TRUE,
land.pairs = lizards$lm.pairs, print.progress = FALSE)
The output of bilat.symmetry is a large list, most of
the components of which are discussed [elsewhere]. For the moment we are
interested in extracting the symmetric shape components from our data.
In the first place, these components can be illustrated simply by
plotting our bilat.symmetry object:
plot(lizard.sym)

The symmetric shape component of our data can be accessed with the following code:
lizard.sym$symm.shape
The symm.shape subset of our results is a 3D array of coordinates
representing the symmetric component of shape variation that can then be
used for further analyses.