Skip to contents

A grouping of soil indicators by the function they serve, for use as the groups argument of pca_select_mds and na_select_mds. Selecting one indicator per function, rather than picking across the whole pool at once, is what the literature calls an expanded minimum data set (EMDS).

Usage

soil_function_groups

Format

A named list of five character vectors:

carbon_cycling

OM, SOC – the organic carbon pool

nutrient_cycling

N, P, K, Ca, Mg, S – plant-available nutrient supply

physical_structure

Sand, Silt, Clay, BD – texture and compaction

buffering_filtration

pH, CEC, EC – the capacity to buffer reaction and retain or transmit solutes

biodiversity

empty – see Details

Details

Why group by function rather than by physical/chemical/biological. Two independent lines of evidence point the same way.

Yuan and Shi (2026) found that fidelity to the total data set improved monotonically with grouping detail: an expanded, function-grouped minimum data set reached R-squared 0.74-0.77, above a reduced grouping, which was above no grouping at all. The function-grouped route was also the most stable across scoring and aggregation choices.

Maaz et al. (2023) attacked it from the other side. By confirmatory factor analysis they tested whether the familiar physical / chemical / biological split describes how soil indicators actually covary, and found it has no statistical support. It is a convention inherited from how laboratories are organised, not a structure present in the data.

This package still ships that split, as soil_property_sets$physical and $chemical. Those sets are exported, documented and depended upon, so they are not going anywhere – but they are a vocabulary for choosing which properties to measure, not a basis for selecting a minimum data set. Use soil_function_groups for selection.

The empty biodiversity group is deliberate. Yuan's fifth function, soil biodiversity maintenance, has no indicator in the vocabulary this package's example data provides – it needs microbial biomass carbon, enzyme activity, respiration or a community measure, none of which are present. The group is shipped empty rather than filled with a proxy, because a plausible-looking stand-in would silently misrepresent which functions the index actually covers. Selection functions skip empty groups.

Some indicators serve more than one function. Calcium and magnesium are placed in nutrient cycling because they are measured as plant-available nutrients, but they are also exchangeable bases and contribute to buffering. Clay contributes to structure and to cation retention. The assignment here is a defensible default, not a fact; supply your own list where your interpretation differs.

References

Yuan, X. and Shi, Y. (2026), after Li et al. (2023) – the five functions. Maaz, T. M. et al. (2023) – the confirmatory factor analysis.

See also

assign_function_groups to map an arbitrary set of property names onto these functions; soil_property_sets for the measurement-oriented sets

Examples

names(soil_function_groups)
#> [1] "carbon_cycling"       "nutrient_cycling"     "physical_structure"  
#> [4] "buffering_filtration" "biodiversity"        
soil_function_groups$carbon_cycling
#> [1] "OM"  "SOC"

# The biodiversity group ships empty; nothing in the example data measures it
soil_function_groups$biodiversity
#> character(0)

# Use it to select within functions rather than across the whole pool
props <- c("Sand", "Silt", "Clay", "pH", "OM", "SOC", "N", "P", "K",
           "CEC", "BD")
groups <- assign_function_groups(props)
pca_select_mds(standardize_numeric(soil_structured[, props]),
               groups = groups)
#> $mds
#> [1] "OM"   "N"    "P"    "Sand" "Silt" "BD"   "pH"   "CEC" 
#> 
#> $pca
#> Standard deviations (1, .., p=11):
#>  [1] 2.486867e+00 1.460784e+00 1.062110e+00 1.010308e+00 4.346819e-01
#>  [6] 3.981292e-01 3.086863e-01 2.329300e-01 1.695260e-01 8.403420e-02
#> [11] 2.270475e-16
#> 
#> Rotation (n x k) = (11 x 11):
#>              PC1         PC2         PC3         PC4         PC5         PC6
#> Sand  0.19766126 -0.58702512  0.08394402  0.09097461 -0.01387188 -0.02833608
#> Silt -0.07070105  0.26399338 -0.20667573 -0.86810767 -0.09233192  0.04870587
#> Clay -0.19273743  0.54396709  0.01112915  0.35110366  0.06473819  0.00732817
#> pH   -0.07435711 -0.07830663 -0.88703540  0.19262245  0.29114273  0.24130921
#> OM   -0.36914585 -0.23908254  0.08705770 -0.06371724 -0.02840634  0.20690357
#> SOC  -0.36788610 -0.24396470  0.07383768 -0.07353710  0.01539649  0.21841429
#> N    -0.35689332 -0.23891027  0.11813266 -0.09986352  0.10931065  0.42092758
#> P    -0.32635970 -0.20723936 -0.33230718  0.05017661 -0.61522719 -0.52922150
#> K    -0.37311938  0.13389860  0.10771989  0.12351735 -0.20521234  0.04633549
#> CEC  -0.36878700  0.20665373  0.08910808  0.16749023 -0.09255975  0.11664917
#> BD    0.36406102  0.07960387 -0.07952746  0.11166011 -0.67834399  0.61238685
#>              PC7         PC8          PC9          PC10          PC11
#> Sand  0.24455057 -0.03865604  0.155563755  0.0003183533  7.172961e-01
#> Silt  0.09304696 -0.03230926  0.055128458 -0.0042826446  3.245405e-01
#> Clay -0.33347772  0.06197745 -0.209994795  0.0018838673  6.165710e-01
#> pH    0.14313423 -0.02766828  0.003049187 -0.0121412763 -9.367507e-17
#> OM   -0.11487506 -0.38337596 -0.320953739 -0.6986638887 -3.469447e-16
#> SOC  -0.17943728 -0.39798608 -0.227118057  0.7100466294 -2.775558e-17
#> N    -0.25179824  0.70486932  0.204049422 -0.0247563789  8.326673e-17
#> P    -0.23911467  0.14135545  0.042370320  0.0079441326 -4.163336e-17
#> K     0.77820942  0.23484213 -0.326009795  0.0684893099 -8.326673e-17
#> CEC   0.15397710 -0.33823931  0.789346029 -0.0440555612 -1.665335e-16
#> BD   -0.06746429 -0.03326061 -0.035760246  0.0150162283  1.665335e-16
#> 
#> $loadings
#>              PC1         PC2         PC3         PC4         PC5         PC6
#> Sand  0.19766126 -0.58702512  0.08394402  0.09097461 -0.01387188 -0.02833608
#> Silt -0.07070105  0.26399338 -0.20667573 -0.86810767 -0.09233192  0.04870587
#> Clay -0.19273743  0.54396709  0.01112915  0.35110366  0.06473819  0.00732817
#> pH   -0.07435711 -0.07830663 -0.88703540  0.19262245  0.29114273  0.24130921
#> OM   -0.36914585 -0.23908254  0.08705770 -0.06371724 -0.02840634  0.20690357
#> SOC  -0.36788610 -0.24396470  0.07383768 -0.07353710  0.01539649  0.21841429
#> N    -0.35689332 -0.23891027  0.11813266 -0.09986352  0.10931065  0.42092758
#> P    -0.32635970 -0.20723936 -0.33230718  0.05017661 -0.61522719 -0.52922150
#> K    -0.37311938  0.13389860  0.10771989  0.12351735 -0.20521234  0.04633549
#> CEC  -0.36878700  0.20665373  0.08910808  0.16749023 -0.09255975  0.11664917
#> BD    0.36406102  0.07960387 -0.07952746  0.11166011 -0.67834399  0.61238685
#>              PC7         PC8          PC9          PC10          PC11
#> Sand  0.24455057 -0.03865604  0.155563755  0.0003183533  7.172961e-01
#> Silt  0.09304696 -0.03230926  0.055128458 -0.0042826446  3.245405e-01
#> Clay -0.33347772  0.06197745 -0.209994795  0.0018838673  6.165710e-01
#> pH    0.14313423 -0.02766828  0.003049187 -0.0121412763 -9.367507e-17
#> OM   -0.11487506 -0.38337596 -0.320953739 -0.6986638887 -3.469447e-16
#> SOC  -0.17943728 -0.39798608 -0.227118057  0.7100466294 -2.775558e-17
#> N    -0.25179824  0.70486932  0.204049422 -0.0247563789  8.326673e-17
#> P    -0.23911467  0.14135545  0.042370320  0.0079441326 -4.163336e-17
#> K     0.77820942  0.23484213 -0.326009795  0.0684893099 -8.326673e-17
#> CEC   0.15397710 -0.33823931  0.789346029 -0.0440555612 -1.665335e-16
#> BD   -0.06746429 -0.03326061 -0.035760246  0.0150162283  1.665335e-16
#> 
#> $var_exp
#>  [1] 5.622280e-01 1.939901e-01 1.025526e-01 9.279301e-02 1.717713e-02
#>  [6] 1.440971e-02 8.662475e-03 4.932397e-03 2.612643e-03 6.419770e-04
#> [11] 4.686417e-33
#> 
#> $groups
#> $groups$carbon_cycling
#> [1] "OM"  "SOC"
#> 
#> $groups$nutrient_cycling
#> [1] "N" "P" "K"
#> 
#> $groups$physical_structure
#> [1] "Sand" "Silt" "Clay" "BD"  
#> 
#> $groups$buffering_filtration
#> [1] "pH"  "CEC"
#> 
#> 
#> $group_results
#> $group_results$carbon_cycling
#> $group_results$carbon_cycling$mds
#> [1] "OM"
#> 
#> $group_results$carbon_cycling$norms
#> named numeric(0)
#> 
#> $group_results$carbon_cycling$n_indicators
#> [1] 2
#> 
#> 
#> $group_results$nutrient_cycling
#> $group_results$nutrient_cycling$mds
#> [1] "N" "P"
#> 
#> $group_results$nutrient_cycling$norms
#> named numeric(0)
#> 
#> $group_results$nutrient_cycling$n_indicators
#> [1] 3
#> 
#> 
#> $group_results$physical_structure
#> $group_results$physical_structure$mds
#> [1] "Sand" "Silt" "BD"  
#> 
#> $group_results$physical_structure$norms
#> named numeric(0)
#> 
#> $group_results$physical_structure$n_indicators
#> [1] 4
#> 
#> 
#> $group_results$buffering_filtration
#> $group_results$buffering_filtration$mds
#> [1] "pH"  "CEC"
#> 
#> $group_results$buffering_filtration$norms
#> named numeric(0)
#> 
#> $group_results$buffering_filtration$n_indicators
#> [1] 2
#> 
#> 
#> 
#> $selector
#> [1] "loading"
#> 
#> $within
#> NULL
#> 
#> $adequacy
#> PCA adequacy
#>   Observations: 120  Indicators: 11 
#> 
#> Kaiser-Meyer-Olkin: not computable
#>   The correlation matrix is singular, so it cannot be inverted and KMO is undefined. This usually means some indicators are exactly collinear -- particle-size fractions summing to 100 is the classic case. Pairs correlating above 0.99: OM/SOC.
#> 
#> Bartlett's test of sphericity
#>   Not computable: the correlation matrix is singular.
#>