This vignette describes how to use Olink® Analyze to randomize the
samples with an option to keep subjects on the same plate. When a study
is well randomized the experimental variables can be considered to be
evenly distributed across each plate, even for a larger study. What
variables to randomize for should be decided for each study as these
vary with the study purpose. Correct sample randomization will empower
your study and minimize the risk of introducing any bias that can
confound downstream analyses. If at all possible, samples from the same
subject that are taken at various times during a longitudinal research
should all be placed on the same plate to further limit data
fluctuation. In order to evenly disperse the remaining experimental
variables between plates, the individuals should subsequently be
distributed. If randomization is not performed true biological variation
may be missed or misidentified as e.g. technical variations. However, it
would be challenging for us to control every variable. Most of the time,
a complete randomization will be carried out, and the outcomes can be
assessed by visualizing the layout of the plates. In this vignette, you
will learn how to achieve this using the
olink_plate_randomizer()
function. And on top of that, you
will also learn how to use olink_displayPlateLayout()
and
olink_displayPlateDistributions()
to evaluate the performed
randomization based on a given grouping variable.
The input manifest should be a tibble/data frame in long format containing all sample ID’s. Sample ID column must be named SampleID. An example manifest is shown in Table 1.
SubjectID | Visit | SampleID | Site |
---|---|---|---|
A | 1 | A 1 | Site1 |
A | 2 | A 2 | Site1 |
A | 3 | A 3 | Site1 |
A | 4 | A 4 | Site1 |
A | 5 | A 5 | Site1 |
A | 6 | A 6 | Site1 |
B | 1 | B 1 | Site1 |
B | 2 | B 2 | Site1 |
B | 3 | B 3 | Site1 |
B | 4 | B 4 | Site1 |
The simplest way to randomize the samples is to perform complete randomization.
In the case of multiple samples per subject (e.g. in longitudinal
studies), Olink recommends keeping each subject on the same plate to
further reduce variation in the data. The individuals should then be
distributed so that the remaining experimental variables of interest are
evenly distributed across plates. This could be achieved by using the
SubjectColumn
argument. The SubjectColumn
argument must correspond to a column within the manifest and cannot be
SampleID. If SubjectColumn
is specified, every SampleID
must have a value in the subject column, even if there is only 1 sample
for that subject.
However, if there are to many samples per subject (>8), complete
randomization is recommended. The number of samples on each plate could
be specified via the available.spots
argument. For example,
the following code will lead to 78 samples on the first plate, and 30
samples on the second and the third plates. The number of iterations for
fitting subjects on the same plate can be set by the
iterations
argument.
randomized.manifest <- olink_plate_randomizer(manifest,
SubjectColumn="SubjectID",
available.spots=c(48,48,42),
iterations = 500,
seed=123456)
The plate size can be either directly set to 48 or 96 using the
PlateSize
argument or can be inferred by setting the
Product
argument to “Target 96”, “Target 48”, “Explore
384”,“Explore 3072”, or “Explore HT.” The number of Olink external
controls can be set using the num_ctrl
argument, which
defaults to 8 controls. The Olink external controls can also be set to
be randomized throughout the plate using the rand_ctrl
argument.
randomized_manifest <- olink_plate_randomizer(manifest,
Product = "Explore HT",
SubjectColumn = "SampleID",
num_ctrl = 10,
rand_ctrl = TRUE)
SubjectID | Visit | SampleID | Site | plate | column | row | well |
---|---|---|---|---|---|---|---|
W 2 | 2 | W 2 | Site2 | Plate 1 | Column 1 | A | A1 |
P 2 | 2 | P 2 | Site2 | Plate 1 | Column 1 | B | B1 |
G 1 | 1 | G 1 | Site1 | Plate 1 | Column 1 | C | C1 |
C 2 | 2 | C 2 | Site1 | Plate 1 | Column 1 | D | D1 |
I 4 | 4 | I 4 | Site1 | Plate 1 | Column 1 | E | E1 |
T 2 | 2 | T 2 | Site2 | Plate 1 | Column 1 | F | F1 |
D 3 | 3 | D 3 | Site1 | Plate 1 | Column 1 | G | G1 |
W 6 | 6 | W 6 | Site2 | Plate 1 | Column 1 | H | H1 |
C 6 | 6 | C 6 | Site1 | Plate 1 | Column 2 | A | A2 |
F 6 | 6 | F 6 | Site1 | Plate 1 | Column 2 | B | B2 |
To illustrate the goodness of randomization, both
olink_displayPlateLayout()
and
olink_displayPlateDistributions
functions could be
used.
The olink_displayPlateLayout()
function could be used to
visualize the layouts of the plate and specifying the color for the
variable of interest using the color_g
argument. The label
of the colored variable could be shown in the plot via the
include.label
argument.
The label of the colored variable could be shown in the plot via the
include.label
argument.
The distribution of the given grouping variable on each plate could
be visualized via a bar chart using function
olink_displayPlateDistributions
. By setting
fill.color = 'SubjectID'
, we could make sure all the
samples from the same subject were put on the same plate.
We could also check the distribution of other variables. For
examples, the distribution of the variable Site
could be
visualized by setting fill.color = 'Site'
.
In the case of the randomization is not performed well, the randomization could be performed again with different seed number and iterations number.
The output of the randomization function would be a “tibble” including SampleID, SubjectID etc. assigned to well positions. Columns include same columns as Manifest with additional columns:
plate: Plate number
column: Column on the plate
row: Row on the plate
well: Well location on the plate
The randomized manifest could be outputted as an Excel file using the
write_xlsx
function from Package writexl
.
We are always happy to help. Email us with any questions:
[email protected] for statistical services and general stats questions
[email protected] for Olink Analyze and Shiny app support
[email protected] for Olink lab product and technical support
[email protected] for more information