Choosing a method

Muhammad Yaseen

2026-11-05

1 Abstract

Stability has two meanings, and the methods of the package answer different questions. This vignette matches the question to the function.

2 Two concepts of stability

Static (biological) stability: a genotype yields the same everywhere. Its measure is the variance over environments (stab_measures(), column Var). Static stability is usually bought with low yield.

Dynamic (agronomic) stability: a genotype follows the average response of all genotypes, ranking the same in good and poor environments. Its measures are the ecovalence, the stability variance, the regression parameters and the AMMI statistics (Becker and Leon 1988). Breeders mostly want dynamic stability combined with high yield.

3 Decision table

Question Function
Is the interaction significant, and how large? add_anova()
Can the environments be pooled? How precise is each? indiv_anova()
How does each genotype respond to better environments? stab_reg(), er_anova()
What share of the interaction does each genotype carry? stab_measures()
Which genotypes are unstable (tested)? Which to select for yield and stability? stab_par()
A simple ranking of yield and stability together stab_kang(), stab_fox()
Which genotype is safest when a poor yield must be avoided (risk set by alpha)? stab_eskridge(), stab_reliability()
Which genotype is closest to the best in every environment? stab_superiority()
Which genotypes keep their rank (nonparametric, with tests)? stab_huehn()
How many patterns of interaction are there, and which genotypes follow them? ammi(), ammi_biplot()
An AMMI-based stability ranking stab_asv(), stab_masv(), stab_dist()
Which genotype wins where? Which are the mega-environments? Which test environments are best? gge_biplot() (vignette 7 shows which .which and .svp to use)
What are the means and winners of each environment? ge_means(), ge_effects()
What does a result mean? stab_interpret()

4 Columns and data

d <- ge_data
names(d)[names(d) == "Yield"] <- "GrainYield"
k <-
  stab_kang(
      .data = d
    , .y    = "GrainYield"
    , .rep  = Rep
    , .gen  = Gen
    , .env  = Env
    )
head(x = k$Kang, n = 3)
        Gen     Mean ShuklaVar rMean rShukaVar rStab
     <char>    <num>     <num> <int>     <int> <int>
1:   V14154 4364.727  58121.11     5         2     7
2: 013BT034 4247.500  94993.42    11         8    19
3:    PR115 4444.273 122904.01     3        17    20

Columns are given by name, as strings or as vectors. Every genotype must appear in every environment; a missing plot is allowed (cell means and the sequential analysis of variance are then used), a missing genotype-environment cell is reported:

d <- subset(x = ge_data, subset = !(Gen == "PR115" & Env == "FSD"))
tryCatch(
    expr  = add_anova(
        .data = d
      , .y    = Yield
      , .rep  = Rep
      , .gen  = Gen
      , .env  = Env
      )
  , error = function(e) conditionMessage(e)
  )
[1] "add_anova(): 1 genotype-environment combination(s) have no data (for example genotype PR115 in environment FSD); every genotype must be grown in every environment."

5 Summary

Decide first whether the interaction matters (add_anova()), then which kind of stability is wanted; combine one regression or variance method with one multivariate view (AMMI or GGE).

6 References

Becker, H. C. and Leon, J. (1988). Stability analysis in plant breeding. Plant Breeding, 101(1), 1–23.