# procOPA: Ordinary Procrustes analysis In shapes: Statistical Shape Analysis

## Description

Ordinary Procustes analysis : the matching of one configuration to another using translation, rotation and (possibly) scale. Reflections can also be included if desired. The function matches configuration B onto A by least squares.

## Usage

 `1` ```procOPA(A, B, scale = TRUE, reflect = FALSE) ```

## Arguments

 `A` k x m matrix (or complex k-vector for 2D data), of k landmarks in m dimensions. This is the reference figure. `B` k x m matrix (or complex k-vector for 2D data). This is the figure which is to be transformed. `scale` logical indicating if scaling is required `reflect` logical indicating if reflection is allowed

## Value

A list with components:

 `R` The estimated rotation matrix (may be an orthogonal matrix if reflection is allowed) `s` The estimated scale matrix `Ahat` The centred configuration A `Bhat` The Procrustes registered configuration B `OSS` The ordinary Procrustes sum of squares, which is \$\|Ahat-Bhat\|^2\$ `rmsd` rmsd = sqrt(OSS/(km))

Ian Dryden

## References

Dryden, I.L. and Mardia, K.V. (1998). Statistical shape analysis. Wiley, Chichester.

procGPA,riemdist,tpsgrid

## Examples

 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41``` ```data(digit3.dat) A<-digit3.dat[,,1] B<-digit3.dat[,,2] ans<-procOPA(A,B) plotshapes(A,B,joinline=1:13) plotshapes(ans\$Ahat,ans\$Bhat,joinline=1:13) #Sooty Mangabey data data(sooty.dat) A<-sooty.dat[,,1] #juvenile B<-sooty.dat[,,2] #adult par(mfrow=c(1,3)) par(pty="s") plot(A,xlim=c(-2000,3000),ylim=c(-2000,3000),xlab=" ",ylab=" ") lines(A[c(1:12,1),]) points(B) lines(B[c(1:12,1),],lty=2) title("Juvenile (-------) Adult (- - - -)") #match B onto A out<-procOPA(A,B) #rotation angle print(atan2(out\$R[1,2],out\$R[1,1])*180/pi) #scale print(out\$s) plot(A,xlim=c(-2000,3000),ylim=c(-2000,3000),xlab=" ",ylab=" ") lines(A[c(1:12,1),]) points(out\$Bhat) lines(out\$Bhat[c(1:12,1),],lty=2) title("Match adult onto juvenile") #match A onto B out<-procOPA(B,A) #rotation angle print(atan2(out\$R[1,2],out\$R[1,1])*180/pi) #scale print(out\$s) plot(B,xlim=c(-2000,3000),ylim=c(-2000,3000),xlab=" ",ylab=" ") lines(B[c(1:12,1),],lty=2) points(out\$Bhat) lines(out\$Bhat[c(1:12,1),]) title("Match juvenile onto adult") ```

### Example output

```Attaching package: 'shapes'

The following object is masked from 'package:stats':

sigma

Warning messages:
1: In rgl.init(initValue, onlyNULL) : RGL: unable to open X11 display
2: 'rgl_init' failed, running with rgl.useNULL = TRUE