coda.base features’ enumeration

Marc Comas-Cufí

2023-11-25

library(coda.base)

Main functions

nP = 6
nO = 8
set.seed(1)
X = matrix(rlnorm(nP * nO), ncol = nP, nrow = nO)
colnames(X) = paste0('P', 1:nP)
rownames(X) = paste0('O', 1:nO)
X
#>           P1        P2        P3        P4        P5        P6
#> O1 0.5344838 1.7785196 0.9839401 1.8586041 1.4735458 0.8482977
#> O2 1.2015872 0.7368371 2.5698209 0.9454174 0.9476168 0.7761871
#> O3 0.4336018 4.5348008 2.2732743 0.8557342 0.2523194 2.0076470
#> O4 4.9297132 1.4767493 1.8110401 0.2297526 0.6603439 1.7448406
#> O5 1.3902836 0.5372775 2.5067256 0.6199292 0.6741586 0.5022006
#> O6 0.4402254 0.1091863 2.1861375 1.5188319 0.9424114 0.4928772
#> O7 1.6281250 3.0800041 1.0774154 3.8910520 3.0042422 1.4399119
#> O8 2.0924271 0.9560610 0.1367841 0.9023185 2.1450776 2.1566000

Descriptive statistics

center(X)
#>        P1        P2        P3        P4        P5        P6 
#> 0.1732294 0.1599997 0.1982046 0.1544340 0.1509712 0.1631611
variation_array(X)
#>           P1        P2       P3        P4        P5        P6
#> P1 0.0000000 1.7807354 2.154229 2.1457756 0.9638581 0.6955516
#> P2 1.7807354 0.0000000 2.614290 1.9008474 2.0593876 0.6793622
#> P3 2.1542290 2.6142898 0.000000 1.9166209 2.4966568 1.9518749
#> P4 2.1457756 1.9008474 1.916621 0.0000000 0.5296424 1.2179905
#> P5 0.9638581 2.0593876 2.496657 0.5296424 0.0000000 0.9414218
#> P6 0.6955516 0.6793622 1.951875 1.2179905 0.9414218 0.0000000

Aitchison distances between compositions

stats::dist() is rewritten to include the Aitchison distance between compositions:

dist(X, method = 'aitchison')
#>           O1        O2        O3        O4        O5        O6        O7
#> O2 1.7312698                                                            
#> O3 2.4651454 2.6482563                                                  
#> O4 3.2924718 2.2982518 3.1363020                                        
#> O5 2.1967501 0.5310050 2.9124924 2.1147115                              
#> O6 2.6637001 1.8840274 4.0189064 3.9336894 2.0813815                    
#> O7 0.7482808 1.9679763 2.9204289 3.2563331 2.3587517 2.8831297          
#> O8 2.7579161 3.2673090 4.1643719 3.2700093 3.5174190 4.0863918 2.2159481

Log-ratio coordinates. coordinates()

coordinates(X)
#>          ilr1        ilr2       ilr3       ilr4       ilr5
#> O1 -0.8501086 -0.00746765 -0.5560864 -0.2230977  0.3219244
#> O2  0.3457976 -0.82034125  0.2859262  0.2193991  0.3613081
#> O3 -1.6598694 -0.39448617  0.5671774  1.5316655 -0.6427156
#> O4  0.8523731  0.32550510  2.0182094  0.6189998 -0.3815869
#> O5  0.6722806 -0.86944130  0.5951600  0.3860022  0.5839787
#> O6  0.9858706 -1.87771387 -1.0123423 -0.3572872  0.2999825
#> O7 -0.4507819  0.59736115 -0.6896777 -0.3028747  0.4240687
#> O8  0.5538473  1.90737459 -0.2850948 -0.9953748 -0.8176105

By default, coda.base uses the isometric log-ratio coordinates defined in Egozcue et al. 2003.

To reduce typing, alr_c(), clr_c(), ilr_c() and olr_c() are functions that call coordinates() function with the option given by their name.

coordinates(X, B) accepts a log-contrast matrix \(B\) to build the log-ratio coordinates. Different log-contrast matrices \(B\) can be constructed (following section).

Functions to build log-contrast matrices

ilr_basis(nP)
#>          ilr1       ilr2       ilr3       ilr4       ilr5
#> c1  0.7071068  0.4082483  0.2886751  0.2236068  0.1825742
#> c2 -0.7071068  0.4082483  0.2886751  0.2236068  0.1825742
#> c3  0.0000000 -0.8164966  0.2886751  0.2236068  0.1825742
#> c4  0.0000000  0.0000000 -0.8660254  0.2236068  0.1825742
#> c5  0.0000000  0.0000000  0.0000000 -0.8944272  0.1825742
#> c6  0.0000000  0.0000000  0.0000000  0.0000000 -0.9128709
all.equal(as.numeric(coordinates(X, 'ilr')),
          as.numeric(log(X) %*% ilr_basis(nP)))
#> [1] TRUE

Log-ratio matrix transformations: