## 3.2 Design the experiment

The experimental design is described by the number of plots per location, the number of locations, the number of replications of the different germplasms within and between locations.

Function design_experiment sets the experimental design based on :

• the number of entries
• the number of controls per block
• the number of blocks
• the number of columns in the design. The number of rows is computed automaticaly.

The function returns a list with

• a data frame
• an image of the experimental design

A description of the algorithm is describe in the help of the function: ?design_experiment.

The four experimental designs are

• D1 - fully-repicated
• D2 - incomplete block design
• D3 - row-colum
• D4 - satellite-farm and regional-farm

### 3.2.1 Fully-replicated (D1)

In fully replicated design, all entries are replicated with randomly choosen order into different blocks.

The decision tree where fully-replicated designs are used is displayed in Figure 3.3.

The R code to implement is the following :

p_fr = design_experiment(
location = "Location-1",
year = "2016",
expe.type = "fully-replicated",
germplasm = paste("germ", c(1:20), sep = ":"),
nb.blocks = 3,
nb.cols = 4)

By default, the data frame is under a standard format:

head(p_fr$"fully-replicated"$data.frame)
##     location year germplasm block X Y
## 1 Location-1 2016    germ:1     1 A 1
## 2 Location-1 2016   germ:18     1 A 2
## 3 Location-1 2016    germ:4     1 A 3
## 4 Location-1 2016    germ:6     1 A 4
## 5 Location-1 2016   germ:13     1 A 5
## 6 Location-1 2016    germ:2     1 B 1

You can set the format to a SHiNeMaS8 reproduction template file:

p_fr = design_experiment(
location = "Location-2",
year = "2016",
expe.type = "fully-replicated",
germplasm = paste("germ", c(1:20), sep = ":"),
nb.blocks = 3,
nb.cols = 4,
return.format = "shinemas")
head(p_fr$"fully-replicated"$data.frame)
##   project sown_year harvested_year        id_seed_lot_sown
## 1              2016                germ:12_Location-2_2016
## 2              2016                germ:17_Location-2_2016
## 3              2016                germ:10_Location-2_2016
## 4              2016                germ:16_Location-2_2016
## 5              2016                 germ:4_Location-2_2016
## 6              2016                germ:14_Location-2_2016
##   intra_selection_name etiquette split quantity_sown quantity_harvested
## 1
## 2
## 3
## 4
## 5
## 6
##   block X Y
## 1     1 A 1
## 2     1 A 2
## 3     1 A 3
## 4     1 A 4
## 5     1 A 5
## 6     1 B 1
p_fr$"fully-replicated"$design

### 3.2.2 Incomplete Block Design (D2)

The decision tree where incomplete block designs are used is displayed in Figure 3.5.

Entries are not replicated on a location. Some entries are common to some locations. Each block is an independent unit and can be allocated to any location. Each farmer has to choose one or several pre-designed blocks. Therefore, the experiment can be handled by several locations that can not receive a high number of plots.

p_ibd = design_experiment(
year = "2016",
expe.type = "IBD",
germplasm = paste("germ", c(1:10), sep = ":"),
nb.blocks = 8, # i.e. number of location if each location has one block
nb.cols = 4)
head(p_ibd$IBD$data.frame)
##   germplasm block X Y year
## 1    germ:1     1 A 1 2016
## 2    germ:6     2 A 2 2016
## 3    germ:2     3 A 3 2016
## 4    germ:1     4 A 4 2016
## 5    germ:4     5 A 5 2016
## 6    germ:3     6 A 6 2016
p_ibd$IBD$design

### 3.2.3 Row-column (D3)

In Row-column design, a control is replicated in row and columns to catch as much as possible of the variation.

The decision tree where row-column design are used is displayed in Figure 3.7.

The R code to implement is the following :

p_case2 = design_experiment(
location = "Location-3",
year = "2016",
expe.type = "row-column",
germplasm = paste("germ", c(1:20), sep = ":"),
controls = "germ:ctrl",
nb.controls.per.block = 7,
nb.blocks = 1,
nb.cols = 7)
head(p_case2$"row-column"$data.frame)
##     location year germplasm block X Y
## 1 Location-3 2016    germ:5     1 A 1
## 2 Location-3 2016   germ:15     1 A 2
## 3 Location-3 2016 germ:ctrl     1 A 3
## 4 Location-3 2016    germ:3     1 A 4
## 5 Location-3 2016 germ:ctrl     1 B 1
## 6 Location-3 2016   germ:16     1 B 2
p_case2$"row-column"$design

Note that if controls are missing in rows or columns, the function will return an error message. The controls must catch as much as possible of the trial variation.

### 3.2.4 Regional and satellite farms (D4)

Regional farms receive several entries (i.e. a germplasm in an environment) in two or more blocks with some entries (i.e. controls) replicated in each block. Satellite farms have a single block and only one entry (i.e. the control) is replicated twice. Farmers choose all entries that are not replicated. The number of entries may vary between farms. Note that at least 25 environments (location $$\times$$ year) are need in order to get robust results.

The decision tree where regional and satellite farms designs are used is displayed in Figure 3.9.

The R code to implement is the following :

As an example here, six designs are generated: four for satellite farms and two for regional farms.

p_case3_sf1 = design_experiment(
location = "Location-4",
year = "2016",
expe.type = "satellite-farm",
germplasm = paste("germ", c(1:6), sep = ":"),
controls = "germ:ctrl",
nb.controls.per.block = 2,
nb.blocks = 1,
nb.cols = 2)
p_case3_sf1 = p_case3_sf1$satellite-farms$design
p_case3_sf1
p_case3_sf2 = design_experiment(
location = "Location-5",
year = "2016",
expe.type = "satellite-farm",
germplasm = paste("germ", c(1:6), sep = ":"),
controls = "germ:ctrl",
nb.controls.per.block = 2,
nb.blocks = 1,
nb.cols = 2)
p_case3_sf2 = p_case3_sf2$satellite-farms$design
p_case3_sf2
p_case3_sf3 = design_experiment(
location = "Location-6",
year = "2016",
expe.type = "satellite-farm",
germplasm = paste("germ", c(1:6), sep = ":"),
controls = "germ:ctrl",
nb.controls.per.block = 2,
nb.blocks = 1,
nb.cols = 2)
p_case3_sf3 = p_case3_sf3$satellite-farms$design
p_case3_sf3
p_case3_rf1 = design_experiment(
location = "Location-7",
year = "2016",
expe.type = "regional-farm",
germplasm = paste("germ", c(1:16), sep = ":"),
controls = c("c1", "c2", "c3", "c4"),
nb.controls.per.block = 4,
nb.blocks = 2,
nb.cols = 4)
p_case3_rf1 = p_case3_rf1$regional-farms$design
p_case3_rf1
p_case3_rf2 = design_experiment(
location = "Location-8",
year = "2016",
expe.type = "regional-farm",
germplasm = paste("germ", c(1:16), sep = ":"),
controls = c("c1", "c2", "c3"),
nb.controls.per.block = 3,
nb.blocks = 2,
nb.cols = 3)
## Warning in place_controls(d, expe.type): Controls are missing in columns 1.
## You can rise nb.controls.per.block.
## Warning in place_controls(d, expe.type): Controls are missing in rows 3.
## You can rise nb.controls.per.block.
## Warning in place_controls(d, expe.type): Controls are missing in columns 1.
## You can rise nb.controls.per.block.
## Warning in place_controls(d, expe.type): Controls are missing in rows 1.
## You can rise nb.controls.per.block.
p_case3_rf2 = p_case3_rf2$regional-farms$design
p_case3_rf2

If you have enought space and lots of seeds, you can adapt the satellite farm design with only one column. Each row beeing a sower width. Then you must be careful to have several sample for a given row to be as representative as possible.

p_case3_sf4 = design_experiment(
location = "Location-9",
year = "2016",
expe.type = "satellite-farm",
germplasm = paste("germ", c(1:6), sep = ":"),
controls = "C",
nb.controls.per.block = 2,
nb.blocks = 1,
nb.cols = 1)
p_case3_sf4 = p_case3_sf4$satellite-farms$design
p_case3_sf4

There some constraints regarding expe.type = "satellite-farm":

• if nb.entries > 10, a warning message recommands to have less than 10 germplasms or to choose expe.type = "regional-farm".
• There are two controls per block
• There is one block
• There are maximum two columns

For expe.type = "regional-farm", there is a warning message if controls are missing in rows or columns. It is better to catch as much as possible of the trial variation. If there are less than 2 blocks, an error message is returned.