out1 <- simTrialData(
nvar = 50L,
nsite = 1L,
treatments = c("T0", "T1", "T2"),
nrep = 3L,
seed = 7L,
verbose = FALSE,
sim.options = list(g_cor_min = 0.55, g_cor_max = 0.70)
)
dat1 <- out1$dataRandom Regression of Treatment BLUPs from Multi-Treatment MET Analyses
randomRegress() and plot_randomRegress()
Overview
randomRegress() decomposes variety BLUPs from a multi-treatment, multi-environment trial into two biologically interpretable components:
- Efficiency — a variety’s genetic value under the baseline (typically low-input) treatment.
- Responsiveness (or Tolerance) — a variety’s capacity to respond genetically to the application of a treatment.
The decomposition is derived from the G-matrix (genetic variance–covariance matrix across Treatment × Site combinations) using Gaussian conditional distribution theory. It generalises naturally from two treatments to any number, with four built-in conditioning schemes used in this function.
plot_randomRegress() visualises the result as a regression scatter plot, an efficiency–responsiveness quadrant plot, or a G-matrix heatmap.
Mathematical Framework
The G-matrix
For full specification of the multi-treatment, multi-environment LMM see the Simulating Multi-Environment Trials vignette.
Let \hat{\mathbf{u}} be the vector of variety BLUPs stacked across all p = T \times S groups, where T is the number of treatments and S the number of sites. The genetic variance–covariance structure is described by the G-matrix:
\operatorname{Var}(\hat{\mathbf{u}}) = \mathbf{G} \otimes \mathbf{I}_n,
where \mathbf{I}_n is the n \times n identity over varieties and the p \times p G-matrix has a natural S \times S block structure, with each block being T \times T:
\mathbf{G} = \begin{pmatrix} \mathbf{G}_{11} & \mathbf{G}_{12} & \cdots & \mathbf{G}_{1S} \\ \mathbf{G}_{21} & \mathbf{G}_{22} & \cdots & \mathbf{G}_{2S} \\ \vdots & \vdots & \ddots & \vdots \\ \mathbf{G}_{S1} & \mathbf{G}_{S2} & \cdots & \mathbf{G}_{SS} \end{pmatrix}.
Each diagonal block \mathbf{G}_{ss} is the T \times T matrix of genetic (co)variances among treatments within site s:
\mathbf{G}_{ss} = \begin{pmatrix} \sigma^2_{1s} & \sigma_{1s,2s} & \cdots & \sigma_{1s,Ts} \\ \sigma_{2s,1s} & \sigma^2_{2s} & \cdots & \sigma_{2s,Ts} \\ \vdots & \vdots & \ddots & \vdots \\ \sigma_{Ts,1s} & \sigma_{Ts,2s} & \cdots & \sigma^2_{Ts} \end{pmatrix},
where \sigma^2_{ts} is the genetic variance for treatment t at site s and \sigma_{ts,t's} is the genetic covariance between treatments t and t' within the same site. Each off-diagonal block \mathbf{G}_{ss'} (s \neq s') is the analogous T \times T matrix of genetic covariances for treatment pairs across sites s and s'.
Allowable ASReml-R specifications
To obtain the \mathbf{G} matrix randomRegress() allows various specifications of the Treatment \times Site \times Variety interaction through its flexible term argument.
Supported ASReml-R covariance/correlation structures are:
| Description | Structure functions |
|---|---|
| Site relationships | fa(), us(), corgh(), corh(), diag() |
| Variety relationships | id(), ide(), vm() |
For ASReml-R models that used corgh() and corh(), randomRegress() will extract the estimated matrix and convert it to a fully unstructured variance matrix \mathbf{G} before genetic regression calculations are undertaken.
Example term strings
randomRegress(model, term = "fa(Site, 2):id(Variety)", ...)
randomRegress(model, term = "fa(Site, 1):vm(Variety, K)", ...)
randomRegress(model, term = "corgh(Site):id(Variety)", ...)
randomRegress(model, term = "us(Site):vm(Variety, K)", ...)
randomRegress(model, term = "corh(Site):Variety", ...)Conditional decomposition
Conditioning is performed within sites only. For a given site s, the T treatment groups are indexed locally as j = 1, \ldots, T. The scalar G_{jj} is the marginal genetic variance for treatment j at site s, i.e. the (j,j) element of the within-site diagonal block \mathbf{G}_{ss}. The sub-vector \mathbf{G}_{A_j j} contains the covariances between treatment j and the conditioning set A_j \subseteq \{1,\ldots,T\} \setminus \{j\}, drawn from the same block \mathbf{G}_{ss}.
With this specification the multivariate conditional normal distribution gives the regression of \hat{u}_{j} on \hat{\mathbf{u}}_{A_j}:
\hat{u}_{j} \mid \hat{\mathbf{u}}_{A_j} \sim \mathcal{N}\!\left( \boldsymbol{\beta}_j^\top \hat{\mathbf{u}}_{A_j},\; \sigma^2_{j \mid A_j} \right),
where the regression coefficients and conditional genetic variance are
\boldsymbol{\beta}_j = \mathbf{G}_{A_j A_j}^{-1}\, \mathbf{G}_{A_j j}, \qquad \sigma^2_{j \mid A_j} = G_{jj} - \mathbf{G}_{j A_j}\,\boldsymbol{\beta}_j.
Here \mathbf{G}_{A_j A_j}, \mathbf{G}_{A_j j}, and G_{jj} are all sub-blocks or elements of the within-site diagonal block \mathbf{G}_{ss}.
The responsiveness BLUP for variety v is the residual from this regression:
\tilde{u}_{j,v} = \hat{u}_{j,v} - \boldsymbol{\beta}_j^\top \hat{\mathbf{u}}_{A_j,v}.
Responsiveness BLUPs are:
- zero-mean within each treatment-site group (inherited from the BLUPs)
- orthogonal to the conditioning BLUPs in the G-matrix sense
- genetically independent of the efficiency signal, with variance \sigma^2_{j \mid A_j}
The transformation matrix
Collecting all conditioning relationships defines a sparse transformation matrix \mathbf{T} such that:
\tilde{\mathbf{u}} = \mathbf{T}\hat{\mathbf{u}}, \qquad \operatorname{Var}(\tilde{\mathbf{u}}) = \mathbf{T}\mathbf{G}\mathbf{T}^\top \equiv \mathbf{V}_T.
The diagonal blocks of \mathbf{V}_T are the conditional genetic variances \sigma^2_{j \mid A_j}. For type = "sequential" the full \mathbf{V}_T is diagonal — a complete Gram-Schmidt orthogonalisation of the BLUP space.
Conditioning schemes
The four built-in schemes differ only in how A_j is chosen:
| Scheme | A_j for treatment j | \mathbf{V}_T structure | Best for |
|---|---|---|---|
"baseline" |
\{\text{levs}[1]\} only | Block-diagonal | Comparing all treatments to one baseline |
"sequential" |
\{\text{levs}[1], \ldots, \text{levs}[j-1]\} | Diagonal (\mathbf{L}\mathbf{D}\mathbf{L}^\top Cholesky) | Fully orthogonal components |
"partial" |
All other treatments simultaneously | Dense | Partial genetic variances |
"custom" |
User-specified | Depends | Bespoke experimental logic |
Example 1 — Single site, partial conditioning
Requires: ASReml-R V4 and ASExtras4. The vignette is pre-rendered so no licence is needed to read it; run the code chunks only if you have both packages installed.
Simulated data
We simulate a single-site trial with 50 varieties and three nitrogen treatments (T0 = control, T1 = low N, T2 = high N), three replicates per treatment. With only one site, the G-matrix is a 3 \times 3 matrix describing the genetic (co)variances between treatments.
We use sim.options to restrict the auto-generated between-treatment genetic correlations to a moderate range (0.55–0.70). This keeps the true genetic structure well away from the parameter boundary, giving the corgh model a stable likelihood surface to optimise. The default sigma_genetic and error_sd values produce a per-plot heritability of approximately 0.60, an ample signal for reliable estimation with 50 varieties and 3 replicates.
The field layout can be examined with plot_simTrialData():
plot_simTrialData(out1, type = "trial", fill = "Treatment", ncol = 3L)The correlation heatmap confirms that the three treatments have positive genetic correlations with each other (true values in the range 0.55–0.70), reflecting that varieties with good baseline performance also tend to respond positively to applied nitrogen — but not perfectly. This partial sharing of genetic rankings is exactly the structure that partial conditioning is designed to dissect.
Forming TSite and fitting the model
ASReml-R requires a single factor to index the G-matrix columns. We create TSite by pasting the treatment label onto the site name. With only one site this simply appends the site label (e.g. "T0-Site1"), but the same code generalises directly to multi-site data:
dat1$TSite <- interaction(dat1$Treatment, dat1$Site, sep = "-")
dat1$Row <- factor(dat1$Row)
dat1$Column <- factor(dat1$Column)
levs1 <- c("T0", "T1", "T2")We fit a heterogeneous-correlation (corgh) model. With three treatments this parameterises the 3 \times 3 G-matrix with three genetic variances and three pairwise correlations — the most flexible fully-identified structure for this problem size:
model1 <- asreml(
yield ~ TSite,
random = ~ corgh(TSite):Variety + at(Site):Rep,
residual = ~ ar1(Row):ar1(Column),
data = dat1,
maxit = 30L
)
model1 <- update(model1)vc1 <- summary(model1)$varcomp
vc1[grepl("TSite", rownames(vc1)), 1:2] component std.error
TSite:Variety!TSite!T1-Env1:!TSite!T0-Env1.cor 8.266140e-01 2.075354e-01
TSite:Variety!TSite!T2-Env1:!TSite!T0-Env1.cor 6.284402e-01 3.756896e-01
TSite:Variety!TSite!T2-Env1:!TSite!T1-Env1.cor 6.492141e-01 3.901779e-01
TSite:Variety!TSite_T0-Env1 5.714666e+04 2.127251e+04
TSite:Variety!TSite_T1-Env1 4.931515e+04 1.969887e+04
TSite:Variety!TSite_T2-Env1 1.651471e+04 1.323835e+04
The corgh varcomp rows give the genetic variance for each TSite level (diagonal of the G-matrix) and the estimated genetic correlation between each pair. With true correlations in the range 0.55–0.70 and 50 varieties across 3 replicates, the estimates should be well away from the boundary (|r| \ll 1), ensuring the reconstructed G-matrix is positive definite and all conditional variances are positive.
Running randomRegress() — partial conditioning
With a single site, partial conditioning is the natural choice: each treatment is conditioned on all the others simultaneously, so the three responsiveness BLUPs capture the genetic signal that is unique to each treatment and unshared with the others.
res1 <- randomRegress(
model1,
term = "corgh(TSite):Variety",
levs = levs1,
type = "partial",
sep = "-"
)With a single site, beta has one row and sigmat has one row — the regression coefficients and conditional genetic variance are scalars:
# Site-specific regression coefficients (one site -> one row each)
res1$beta$T0
T1 T2
Env1 0.7789471 0.2951477
$T1
T0 T2
Env1 0.6427115 0.3705243
$T2
T0 T1
Env1 0.1558038 0.2370539
# Conditional genetic variances under partial conditioning
res1$sigmat T0 T1 T2
Env1 0.123181 0.101637 0.06502531
Each sigmat entry \sigma^2_{j \mid A_j} is the genetic variance in treatment j that is orthogonal to all other treatments. A small value relative to G_{jj} (the diagonal of Gmat) indicates that most of the genetic variation in that treatment is shared with the others; a value close to G_{jj} indicates a large treatment-specific genetic component.
# Compare conditional variances to marginal variances
data.frame(
treatment = levs1,
marginal = round(diag(res1$Gmat), 4),
conditional = round(res1$sigmat[1L, ], 4)
) treatment marginal conditional
T0-Env1 T0 0.4077 0.1232
T1-Env1 T1 0.3518 0.1016
T2-Env1 T2 0.1178 0.0650
Regression plots — added variable plots
Under partial conditioning every treatment has |A_j| = 2, so the regression of \hat{u}_j on A_j is inherently three-dimensional and cannot be shown in a single 2-D scatter. Both regression plots below are therefore added variable plots: for each panel, both the x-axis and the y-axis show partial residuals after projecting out the remaining conditioning treatment using the G-matrix, so that the annotated slope \hat{\beta} aligns correctly with the scatter.
Formally, for panel j with A_j = \{k, r\} and cond_x selecting k:
x_v = \hat{u}_{k,v} - \tfrac{G_{rk}}{G_{rr}}\,\hat{u}_{r,v}, \qquad y_v = \hat{u}_{j,v} - \tfrac{G_{rj}}{G_{rr}}\,\hat{u}_{r,v}.
The two plots show different 2-D slices of the same 3-D regression — cond_x = 1L projects onto the first conditioning treatment (after removing the second), and cond_x = 2L projects onto the second (after removing the first). Each strip label shows the full conditioning set, e.g. T1 | T0, T2. A per-panel integer vector, e.g. cond_x = c(2L, 1L, 2L), allows a different slice in each panel.
# Slice 1: first conditioning treatment on x (T1 for T0; T0 for T1 and T2)
p_reg1 <- plot_randomRegress(res1, type = "regress")
print(p_reg1)# Slice 2: second conditioning treatment on x (T2 for T0 and T1; T1 for T2)
p_reg1_cx <- plot_randomRegress(res1, type = "regress", cond_x = 2L)
print(p_reg1_cx)Comparing the slopes across the two slices reveals the relative contribution of each conditioning treatment to explaining the conditioned treatment’s BLUPs. A steeper slope in one slice than the other indicates that dimension of A_j carries more of the shared genetic signal.
Quadrant plot with default highlights
The quadrant plot places the T0 BLUPs on the x-axis and responsiveness on the y-axis. Under partial conditioning, every treatment has a responsiveness axis, so there are three quadrant panels:
p_quad1 <- plot_randomRegress(res1, type = "quadrant", highlight = "default")
print(p_quad1)The default highlight algorithm (highlight = "default") selects up to six varieties to annotate across all panels — up to three from the top-right quadrant (high efficiency + high responsiveness, shown in orange) and up to three from the bottom-left (low efficiency + low responsiveness, shown in blue). Within each quadrant the candidates are restricted to varieties whose distance from the origin exceeds the within-quadrant median, and the final selection is simply the most extreme of those candidates, ordered by decreasing distance from the origin. The same varieties are labelled in every site and treatment-pair panel, making it easy to trace how a variety’s relative position shifts across panels.
Varieties that appear in the top-right of all panels respond positively to every treatment; those that shift between quadrants across panels show treatment-specific responses. To highlight specific varieties instead, pass a character vector of variety names, e.g. highlight = c("Var01", "Var15", "Var22"); to suppress highlighting entirely, use highlight = NULL.
Example 2 — Multi-site, factor analytic model
Simulated data
We now scale to a multi-environment setting: 40 varieties, 4 sites, and the same three nitrogen treatments. The FA(2) model is the standard choice for MET analyses — it captures the dominant axes of genotype × environment interaction parsimoniously.
out2 <- simTrialData(
nvar = 40L,
nsite = 4L,
treatments = c("T0", "T1", "T2"),
nrep = 3L,
seed = 42L,
verbose = FALSE
)
dat2 <- out2$dataThe "blup" plot of plot_simTrialData() visualises the true genetic values across all 12 treatment × site groups, revealing the GEI structure baked into the simulation:
plot_simTrialData(out2, type = "blup", sort = TRUE)Varieties cluster into those with broadly positive responses across all treatment × site groups (top rows) and those with more variable or treatment-specific patterns — exactly the structure that randomRegress() is designed to unpack.
Forming TSite and fitting the FA(2) model
dat2$TSite <- interaction(dat2$Treatment, dat2$Site, sep = "-")
dat2$Row <- factor(dat2$Row)
dat2$Column <- factor(dat2$Column)
levs2 <- c("T0", "T1", "T2")A factor analytic model with 2 factors provides a parsimonious description of the 12 \times 12 G-matrix across 4 sites and 3 treatments. The two factors capture the dominant axes of genetic co-variation — typically a general adaptation factor and a GEI factor:
model2 <- asreml(
yield ~ TSite,
random = ~ fa(TSite, 2):Variety + at(Site):Rep,
residual = ~ dsum(~ ar1(Row):ar1(Column) | Site),
data = dat2,
maxit = 30L
)
model2 <- update(model2)vc2 <- summary(model2)$varcomp
vc2[grepl("TSite", rownames(vc2)), ] component std.error z.ratio bound %ch
fa(TSite, 2):Variety!T0-Env1!var 0.00000 NA NA F NA
fa(TSite, 2):Variety!T1-Env1!var 31170.65528 18120.99293 1.7201406 P 0.0
fa(TSite, 2):Variety!T2-Env1!var 0.00000 NA NA F NA
fa(TSite, 2):Variety!T0-Env2!var 54919.72761 24527.38851 2.2391184 P 0.0
fa(TSite, 2):Variety!T1-Env2!var 22880.46106 17110.94599 1.3371827 P 0.1
fa(TSite, 2):Variety!T2-Env2!var 16079.46438 15472.45593 1.0392316 P 0.1
fa(TSite, 2):Variety!T0-Env3!var 3029.38081 15818.20881 0.1915123 P 1.2
fa(TSite, 2):Variety!T1-Env3!var 0.00000 NA NA F NA
fa(TSite, 2):Variety!T2-Env3!var 13990.36450 15186.29669 0.9212493 P 0.2
fa(TSite, 2):Variety!T0-Env4!var 15399.67049 15740.09710 0.9783720 P 0.1
fa(TSite, 2):Variety!T1-Env4!var 52735.62150 24333.00831 2.1672463 P 0.0
fa(TSite, 2):Variety!T2-Env4!var 14054.12323 16686.09239 0.8422657 P 0.4
fa(TSite, 2):Variety!T0-Env1!fa1 296.57418 48.51737 6.1127422 P 0.0
fa(TSite, 2):Variety!T1-Env1!fa1 157.92909 51.57597 3.0620673 P 0.1
fa(TSite, 2):Variety!T2-Env1!fa1 130.69065 54.14897 2.4135388 P 0.0
fa(TSite, 2):Variety!T0-Env2!fa1 230.81038 62.90194 3.6693680 P 0.0
fa(TSite, 2):Variety!T1-Env2!fa1 219.42927 50.74392 4.3242475 P 0.0
fa(TSite, 2):Variety!T2-Env2!fa1 205.61597 48.34129 4.2534235 P 0.0
fa(TSite, 2):Variety!T0-Env3!fa1 275.90911 48.09771 5.7364288 P 0.0
fa(TSite, 2):Variety!T1-Env3!fa1 116.76063 60.85115 1.9187907 P 0.1
fa(TSite, 2):Variety!T2-Env3!fa1 257.16889 49.02995 5.2451391 P 0.0
fa(TSite, 2):Variety!T0-Env4!fa1 143.87189 49.51114 2.9058488 P 0.0
fa(TSite, 2):Variety!T1-Env4!fa1 206.09465 61.50535 3.3508409 P 0.0
fa(TSite, 2):Variety!T2-Env4!fa1 119.41365 54.91899 2.1743599 P 0.1
fa(TSite, 2):Variety!T0-Env1!fa2 0.00000 NA NA F NA
fa(TSite, 2):Variety!T1-Env1!fa2 -59.74533 57.44779 -1.0399935 P 0.3
fa(TSite, 2):Variety!T2-Env1!fa2 -190.85185 49.57640 -3.8496516 P 0.1
fa(TSite, 2):Variety!T0-Env2!fa2 -121.05435 65.76636 -1.8406728 P 0.3
fa(TSite, 2):Variety!T1-Env2!fa2 -53.32607 55.72052 -0.9570274 P 0.4
fa(TSite, 2):Variety!T2-Env2!fa2 -57.10362 53.42620 -1.0688317 P 0.2
fa(TSite, 2):Variety!T0-Env3!fa2 48.72724 54.13545 0.9000987 P 0.3
fa(TSite, 2):Variety!T1-Env3!fa2 -262.49742 49.07711 -5.3486735 P 0.0
fa(TSite, 2):Variety!T2-Env3!fa2 -33.78441 56.15143 -0.6016661 P 0.1
fa(TSite, 2):Variety!T0-Env4!fa2 -101.02471 50.52365 -1.9995529 P 0.2
fa(TSite, 2):Variety!T1-Env4!fa2 -114.49195 65.28623 -1.7536921 P 0.0
fa(TSite, 2):Variety!T2-Env4!fa2 -173.67649 53.08688 -3.2715521 P 0.2
The varcomp rows show the factor loadings (!fa1, !fa2) and specific variances (!var) for each TSite level. The G-matrix reconstructed from these is \hat{\mathbf{G}} = \hat{\boldsymbol{\Lambda}}\hat{\boldsymbol{\Lambda}}^\top + \hat{\boldsymbol{\Psi}}.
Running randomRegress() — baseline conditioning
For multi-site data with an FA model, baseline conditioning is the most widely used scheme: T0 is the efficiency (control) treatment, and T1 and T2 are conditioned on T0 to give treatment-specific responsiveness BLUPs.
res2 <- randomRegress(
model2,
term = "fa(TSite, 2):Variety",
levs = levs2,
type = "baseline",
sep = "-"
)With 4 sites, beta has 4 rows (one per site) and sigmat has 4 rows. The site-specific regression slopes in beta capture how the treatment response relationship changes across environments:
# Site-specific regression coefficients for T1 conditioned on T0
round(res2$beta$T1, 3) T0
Env1 0.533
Env2 0.465
Env3 0.238
Env4 0.890
Regression plot
p_reg2 <- plot_randomRegress(res2, type = "regress")
print(p_reg2)Each panel corresponds to one site × treatment pair. The dotted regression line through the origin carries the site-specific \hat{\beta} slope. Panels where \hat{\beta} differs substantially across sites indicate heterogeneous treatment responses — the G-matrix captures this as off-diagonal structure between treatment × site combinations.
Quadrant plot — default highlights
p_quad2 <- plot_randomRegress(res2, type = "quadrant", highlight = "default")
print(p_quad2)The automatic highlight algorithm identifies the six most informative archetypes by their position in the efficiency–responsiveness space, averaged across all sites. Orange points are top-right archetypes (broadly adapted and responsive); blue points are bottom-left archetypes (consistently poor performers). The same six varieties are labelled in every panel.
Filtering to a single treatment pair
For multi-site multi-treatment results, treatments restricts which panels are shown. This is useful when a particular treatment comparison is of primary interest:
p_t1 <- plot_randomRegress(res2, type = "quadrant",
treatments = "T1", highlight = "default")
print(p_t1)G-matrix heatmap
The 12 \times 12 G-matrix correlation heatmap reveals the full structure of genetic co-variation across all treatment × site combinations:
p_gmat2 <- plot_randomRegress(res2, type = "gmat")
print(p_gmat2)Within-treatment correlations (e.g. T0-Env1 with T0-Env2) are typically high, reflecting consistent genetic ranking for that treatment across sites. Correlations across treatments (e.g. T0-Env1 with T2-Env3) reflect the combined effect of genotype × treatment and genotype × environment interaction.
Bespoke visualisation with return_data = TRUE
All three plot types support return_data = TRUE, which returns the tidy data frame used to build the plot. This enables custom ggplot2 visualisations beyond the built-in types:
df_t1 <- plot_randomRegress(res2, type = "quadrant",
treatments = "T1",
return_data = TRUE)
ggplot(df_t1, aes(x = x, y = y, colour = Site)) +
geom_hline(yintercept = 0, linetype = "dotted", colour = "grey40") +
geom_vline(xintercept = 0, linetype = "dotted", colour = "grey40") +
geom_point(size = 1.8, alpha = 0.8) +
facet_wrap(~ Site, nrow = 2L) +
labs(x = "Efficiency (T0 BLUP)",
y = "Responsiveness (T1 | T0)",
title = "T1 responsiveness by site") +
theme_bw() +
theme(legend.position = "none")Summary
randomRegress()
| Task | Code |
|---|---|
| Baseline conditioning | type = "baseline" (default) |
| Fully orthogonal (Gram-Schmidt) | type = "sequential" |
| Partial genetic variances | type = "partial" |
| Bespoke conditioning | type = "custom", cond = list(...) |
| Single site, corgh term | term = "corgh(TSite):Variety" |
| Multi-site, FA term | term = "fa(TSite, 2):Variety" |
| Genomic relationship matrix | term = "us(TSite):vm(Variety, giv1)" |
plot_randomRegress()
| Task | Code |
|---|---|
| Regression scatter plot | plot_randomRegress(res, type = "regress") |
| Efficiency–responsiveness plot | plot_randomRegress(res, type = "quadrant") |
| G-matrix heatmap | plot_randomRegress(res, type = "gmat") |
| Default highlights | highlight = "default" |
| Named variety highlights | highlight = c("Var01", "Var15") |
| Suppress highlights | highlight = NULL |
| Restrict treatment panels | treatments = "T1" |
| Select x-axis conditioning treatment | cond_x = 2L |
| Export plot data | return_data = TRUE |
| Absolute yield scale | centre = TRUE |
References
Lemerle, D., Smith, A., Verbeek, B., Koetz, E., Lockley, P. & Martin, P. (2006). Incremental crop tolerance to weeds: A measure for selecting competitive ability in Australian wheats. Euphytica, 149, 85–95. https://doi.org/10.1007/s10681-005-9056-5
McDonald G, Bovill W, Taylor J, Wheeler R. (2015) Responses to phosphorus among wheat genotypes. Crop and Pasture Science, 66(5), 430–444. https://doi.org/10.1071/CP14191