• seriate_*() computes a permutation order for rows and/or columns.

• permute() rearranges a data matrix according to a permutation order.

• get_order() returns the seriation order for rows and columns.

## Usage

seriate_average(object, ...)

seriate_rank(object, ...)

refine(object, ...)

permute(object, order, ...)

get_order(x, ...)

# S4 method for data.frame
seriate_average(object, margin = c(1, 2), axes = 1, ...)

# S4 method for matrix
seriate_average(object, margin = c(1, 2), axes = 1, ...)

# S4 method for data.frame,PermutationOrder
permute(object, order)

# S4 method for matrix,PermutationOrder
permute(object, order)

# S4 method for PermutationOrder
get_order(x, margin = c(1, 2))

# S4 method for data.frame
seriate_rank(object, EPPM = FALSE, margin = c(1, 2), stop = 100)

# S4 method for matrix
seriate_rank(object, EPPM = FALSE, margin = c(1, 2), stop = 100)

# S4 method for AveragePermutationOrder
refine(object, cutoff, margin = c(1, 2), axes = c(1, 2), n = 30)

# S4 method for BootstrapCA
refine(object, cutoff, margin = 1, axes = c(1, 2))

## Arguments

object, x

An $$m \times p$$ numeric matrix or a data.frame of count data (absolute frequencies).

...

Further arguments to be passed to internal methods.

order

A PermutationOrder object giving the permutation order for rows and columns.

margin

A numeric vector giving the subscripts which the rearrangement will be applied over: 1 indicates rows, 2 indicates columns, c(1, 2) indicates rows then columns, c(2, 1) indicates columns then rows.

axes

An integer vector giving the subscripts of the CA axes to be used.

EPPM

A logical scalar: should the seriation be computed on EPPM instead of raw data?

stop

An integer giving the stopping rule (i.e. maximum number of iterations) to avoid infinite loop.

cutoff

A function that takes a numeric vector as argument and returns a single numeric value (see below).

n

A non-negative integer giving the number of bootstrap replications.

## Value

• seriate_*() returns a PermutationOrder object.

• permute() returns either a permuted matrix or a permuted data.frame (the same as object).

• bootstrap() returns a RefineCA object.

## Seriation

The matrix seriation problem in archaeology is based on three conditions and two assumptions, which Dunell (1970) summarizes as follows.

The homogeneity conditions state that all the groups included in a seriation must:

1. Be of comparable duration.

2. Belong to the same cultural tradition.

3. Come from the same local area.

The mathematical assumptions state that the distribution of any historical or temporal class:

1. Is continuous through time.

2. Exhibits the form of a unimodal curve.

Theses assumptions create a distributional model and ordering is accomplished by arranging the matrix so that the class distributions approximate the required pattern. The resulting order is inferred to be chronological.

The following seriation methods are available:

seriate_average()

Correspondence analysis-based seriation (average ranking). Correspondence analysis (CA) is an effective method for the seriation of archaeological assemblages. The order of the rows and columns is given by the coordinates along one dimension of the CA space, assumed to account for temporal variation. The direction of temporal change within the correspondence analysis space is arbitrary: additional information is needed to determine the actual order in time.

seriate_rank()

Reciprocal ranking seriation. These procedures iteratively rearrange rows and/or columns according to their weighted rank in the data matrix until convergence. Note that this procedure could enter into an infinite loop. If no convergence is reached before the maximum number of iterations, it stops with a warning.

## Correspondence Analysis

bootstrap() allows to identify samples that are subject to sampling error or samples that have underlying structural relationships and might be influencing the ordering along the CA space.

This relies on a partial bootstrap approach to CA-based seriation where each sample is replicated n times. The maximum dimension length of the convex hull around the sample point cloud allows to remove samples for a given cutoff value.

According to Peebles and Schachner (2012), "[this] point removal procedure [results in] a reduced dataset where the position of individuals within the CA are highly stable and which produces an ordering consistent with the assumptions of frequency seriation."

## References

Desachy, B. (2004). Le sériographe EPPM: un outil informatisé de sériation graphique pour tableaux de comptages. Revue archéologique de Picardie, 3(1), 39-56. doi:10.3406/pica.2004.2396 .

Dunnell, R. C. (1970). Seriation Method and Its Evaluation. American Antiquity, 35(03), 305-319. doi:10.2307/278341 .

Ihm, P. (2005). A Contribution to the History of Seriation in Archaeology. In C. Weihs & W. Gaul (Eds.), Classification: The Ubiquitous Challenge. Berlin Heidelberg: Springer, p. 307-316. doi:10.1007/3-540-28084-7_34 .

Peeples, M. A., & Schachner, G. (2012). Refining correspondence analysis-based ceramic seriation of regional data sets. Journal of Archaeological Science, 39(8), 2818-2827. doi:10.1016/j.jas.2012.04.040 .

dimensio::ca()

N. Frerebeau

## Examples

## Replicates Desachy 2004 results
## Coerce dataset to abundance matrix
data("compiegne", package = "folio")

## Get seriation order for columns on EPPM using the reciprocal averaging method
## Expected column order: N, A, C, K, P, L, B, E, I, M, D, G, O, J, F, H
(indices <- seriate_rank(compiegne, EPPM = TRUE, margin = 2))
#> Found more than one class "PermutationOrder" in cache; using the first, from namespace 'tabula'
#> Also defined by ‘kairos’
#> Found more than one class "PermutationOrder" in cache; using the first, from namespace 'tabula'
#> Also defined by ‘kairos’
#> <RankPermutationOrder>
#> Permutation order for matrix seriation:
#> - Row order: 1 2 3 4 5...
#> - Column order: 14 1 3 11 16 12 2 5 9 13 4 7 15 10 6 8...

## Get permutation order
get_order(indices, 1) # rows
#> [1] 1 2 3 4 5
get_order(indices, 2) # columns
#>  [1] 14  1  3 11 16 12  2  5  9 13  4  7 15 10  6  8

## Permute columns
(new <- permute(compiegne, indices))
#>      N     A     C    K   P    L    B    E   I   M    D    G   O    J    F    H
#> 5 1510 13740  8270 1740   0  460  375   20   0   0  250   40 350    5   10   80
#> 4  565 13540 10110 7210 450 1785 1520 1230   0 410  740  265 310  105  635  400
#> 3  160 12490  4220 6750 275 5930 5255 1395  30 350  980  440  10  580 1415  680
#> 2  410  6940  5800 2130 410 2410 2880 1510 620 910 3400 1080 310 2075 2280 2840
#> 1  190  6490  6900 1080  50  570 2350  670 340 740 2745  950 985 2660 3020 6700

## See the vignette
if (FALSE) {
utils::vignette("seriation")
}