Pulling and pushing markers
Source:vignettes/articles/pulling-and-pushing.Rmd
pulling-and-pushing.RmdLinkage map construction is commonly preceded by some pruning of the marker set, typically the removal of markers exhibiting a high proportion of missing values or significant departure from their expected Mendelian segregation ratios. Such removal is usually permanent, and the potential value of the discarded markers is thereby overlooked. A marker that appears unsuitable when judged against unordered data may prove entirely well behaved once a map has been established.
A preferable approach is to identify the problematic markers and
place them aside, with the intention of reassessing their usefulness at
a later stage of the construction process. The functions pullCross() and pushCross() provide
this facility. Rather than deleting a marker, pullCross()
transfers it to a holding element of the cross object, retaining the
information required to restore it; pushCross()
subsequently reintroduces it into an established map.
The constructed map mapDH is used below to illustrate
both operations.
Marker types
Three types of marker may be set aside.
type |
Markers affected | Rationale |
|---|---|---|
"co.located" |
Markers separated from another marker by zero distance | They contribute no ordering information, yet add to the computational cost of construction |
"seg.distortion" |
Markers whose segregation distortion p-value falls below
seg.thresh
|
Distorted markers may not map to a unique location |
"missing" |
Markers whose proportion of missing values exceeds
miss.thresh
|
Sparsely scored markers are positioned less reliably |
The relevant thresholds are supplied by pp.init(), which
provides defaults of seg.thresh = 0.05 and
miss.thresh = 0.1. These may be overridden through the
pars argument.
Setting markers aside
In the following, markers are pulled that are co-located with another marker, that exhibit segregation distortion at a p-value below 0.02, or that are missing more than 3% of their scores.
mapDHs <- pullCross(mapDH, type = "co.located")
mapDHs <- pullCross(mapDHs, type = "seg.distortion", pars = list(seg.thresh = 0.02))
mapDHs <- pullCross(mapDHs, type = "missing", pars = list(miss.thresh = 0.03))
names(mapDHs)[1] "geno" "pheno" "co.located" "seg.distortion"
[5] "missing"
The object has acquired one element for each marker type. Each
contains a table summarising the markers concerned and a
data matrix of their scores, in the same genotype by marker
layout as the linkage groups themselves.
mapDHs$seg.distortion$table mark chr pos neglog10P missing AA AB
1 1A.m.34 1A 77.35004 1.830929 0.000000000 0.5825688 0.4174312
2 1A.m.37 1A 91.14416 1.830929 0.000000000 0.5825688 0.4174312
3 3B.m.15 3B 64.19254 1.997307 0.000000000 0.5871560 0.4128440
4 3B.m.16 3B 64.65088 2.170970 0.000000000 0.5917431 0.4082569
5 3B.m.17 3B 65.10962 1.872327 0.027522936 0.5849057 0.4150943
6 3B.m.18 3B 65.10962 1.997307 0.000000000 0.5871560 0.4128440
7 3B.m.19 3B 65.56831 1.830929 0.000000000 0.5825688 0.4174312
8 3B.m.20 3B 66.48546 1.830929 0.000000000 0.5825688 0.4174312
9 6D.m.12 6D 60.69446 1.756872 0.004587156 0.4193548 0.5806452
10 7B.m.6 7B 23.03041 1.769873 0.013761468 0.4186047 0.5813953
For the types "seg.distortion" and
"missing", the table combines positional information with
the output of geno.table() from the R/qtl package (Broman and Wu 2014), so
that the basis for each marker’s removal may be inspected.
head(mapDHs$co.located$table) bins chr mark
1 1 1B1 1B1.m.4
2 1 1B1 1B1.m.5
3 2 1D 1D.m.3
4 2 1D 1D.m.4
5 3 2B 2B.m.31
6 3 2B 2B.m.32
The table for "co.located" markers is of a different
form. Markers are assigned to bins, and within each bin the
first marker is retained in the map as a reference, the
remainder being pulled. It is this reference that permits the
co-locating markers to be restored to their correct position.
Reconstruction
Reconstruction with bychr = FALSE combines all remaining
markers and rebuilds the map in its entirety, in the course of which the
linkage groups are renamed. This provides a reasonably stringent test of
whether the markers set aside can subsequently be restored to their
correct positions.
mapDHs <- mstmap(mapDHs, bychr = FALSE, dist.fun = "kosambi", trace = FALSE,
anchor = TRUE)Number of linkage groups: 24
The size of the linkage groups are: 38 4 31 9 37 34 7 13 35 23 5 8 21 32 6 52 55 5 27 41 13 32 34 3
The number of bins in each linkage group: 38 4 31 9 37 34 7 13 35 23 5 8 21 32 6 52 55 5 27 41 13 32 34 3
nmar(mapDHs) L.1 L.10 L.11 L.12 L.13 L.14 L.15 L.16 L.17 L.18 L.19 L.2 L.20 L.21 L.22 L.23
38 23 5 8 21 32 6 52 55 5 27 4 41 13 32 34
L.24 L.3 L.4 L.5 L.6 L.7 L.8 L.9
3 31 9 37 34 7 13 35
Reversal of the thresholds
The thresholds operate in opposite senses in the two functions, and this is a frequent source of confusion.
pullCross()removes a marker when its segregation distortion p-value lies belowseg.thresh, whereaspushCross()restores it when that p-value lies aboveseg.thresh. The same applies tomiss.thresh.
Pulling and pushing at an identical threshold therefore returns no markers at all, and the function reports that there are none of that type to push back. The two thresholds are intended to differ, the value used when pushing being the less stringent of the two, so that a marker is restored only if it is adequately behaved in the context of the established map.
| Parameter | Pulled when | Restored when |
|---|---|---|
seg.thresh |
p-value < threshold | p-value > threshold |
miss.thresh |
missing proportion > threshold | missing proportion < threshold |
Markers were pulled above at seg.thresh = 0.02 and
miss.thresh = 0.03, and are accordingly restored at 0.001
and 0.05 respectively.
mapDHs <- pushCross(mapDHs, type = "co.located")
mapDHs <- pushCross(mapDHs, type = "seg.distortion", pars = list(seg.thresh = 0.001))
mapDHs <- pushCross(mapDHs, type = "missing", pars = list(miss.thresh = 0.05))
names(mapDHs)[1] "geno" "pheno"
Under these settings all markers of each type have been restored, and the holding elements have consequently been removed from the object.
Placement of the restored markers
pull.map(mapDHs)[[4]] 4A.m.1 4A.m.2 4A.m.4 4A.m.3 4A.m.5 4A.m.6 4A.m.7 4A.m.8
0.000000 1.376494 3.671683 4.130412 5.047946 5.506674 5.965403 5.965403
4A.m.9
7.801089
attr(,"class")
[1] "A"
pull.map(mapDHs)[[21]] 2B.m.1 2B.m.2 2B.m.3 2B.m.4 2B.m.5 2B.m.6 2B.m.7 2B.m.8
0.000000 2.779284 25.847324 26.306053 31.833042 41.112443 49.445632 51.281319
2B.m.9 2B.m.10 2B.m.11 2B.m.12 2B.m.13 2B.m.14 2B.m.15 2B.m.16
51.740047 52.198776 61.004291 61.921825 63.757512 65.134006 65.592735 66.051463
2B.m.17 2B.m.18 2B.m.19 2B.m.20 2B.m.21 2B.m.22 2B.m.23 2B.m.24
66.510191 67.427726 68.345260 69.721754 70.180483 71.556977 72.933472 73.392200
2B.m.25 2B.m.26 2B.m.27 2B.m.28 2B.m.29 2B.m.30 2B.m.31 2B.m.32
75.227887 75.686615 76.604149 77.521684 77.980412 78.439141 78.897869 78.897869
2B.m.34 2B.m.33 2B.m.35
80.274363 80.733092 97.376797
attr(,"class")
[1] "A"
Co-located markers are placed adjacent to their reference marker, as
for example 1D.m.4 beside 1D.m.3 on 1D.
Markers held in the "seg.distortion" and
"missing" elements cannot be positioned so precisely and
are appended to the end of the linkage group to which they are assigned;
the distorted marker 6D.m.12 appears at the end of 6D.
pushCross()assigns markers to linkage groups but does not order them. The map is not complete until MSTmap has been run again.
A final pass within each linkage group places all markers in their
optimal position. Setting p.value = 2 suppresses
clustering, so that the composition of the groups cannot change.
mapDHs <- mstmap(mapDHs, bychr = TRUE, dist.fun = "kosambi", trace = FALSE,
anchor = TRUE, p.value = 2)Number of linkage groups: 1
The size of the linkage groups are: 41
The number of bins in each linkage group: 41
Number of linkage groups: 1
The size of the linkage groups are: 30
The number of bins in each linkage group: 29
Number of linkage groups: 1
The size of the linkage groups are: 6
The number of bins in each linkage group: 5
Number of linkage groups: 1
The size of the linkage groups are: 9
The number of bins in each linkage group: 8
Number of linkage groups: 1
The size of the linkage groups are: 21
The number of bins in each linkage group: 21
Number of linkage groups: 1
The size of the linkage groups are: 32
The number of bins in each linkage group: 32
Number of linkage groups: 1
The size of the linkage groups are: 6
The number of bins in each linkage group: 6
Number of linkage groups: 1
The size of the linkage groups are: 54
The number of bins in each linkage group: 53
Number of linkage groups: 1
The size of the linkage groups are: 56
The number of bins in each linkage group: 55
Number of linkage groups: 1
The size of the linkage groups are: 6
The number of bins in each linkage group: 5
Number of linkage groups: 1
The size of the linkage groups are: 27
The number of bins in each linkage group: 27
Number of linkage groups: 1
The size of the linkage groups are: 5
The number of bins in each linkage group: 4
Number of linkage groups: 1
The size of the linkage groups are: 41
The number of bins in each linkage group: 41
Number of linkage groups: 1
The size of the linkage groups are: 15
The number of bins in each linkage group: 14
Number of linkage groups: 1
The size of the linkage groups are: 33
The number of bins in each linkage group: 32
Number of linkage groups: 1
The size of the linkage groups are: 37
The number of bins in each linkage group: 36
Number of linkage groups: 1
The size of the linkage groups are: 4
The number of bins in each linkage group: 3
Number of linkage groups: 1
The size of the linkage groups are: 33
The number of bins in each linkage group: 33
Number of linkage groups: 1
The size of the linkage groups are: 10
The number of bins in each linkage group: 9
Number of linkage groups: 1
The size of the linkage groups are: 40
The number of bins in each linkage group: 40
Number of linkage groups: 1
The size of the linkage groups are: 35
The number of bins in each linkage group: 34
Number of linkage groups: 1
The size of the linkage groups are: 8
The number of bins in each linkage group: 7
Number of linkage groups: 1
The size of the linkage groups are: 13
The number of bins in each linkage group: 13
Number of linkage groups: 1
The size of the linkage groups are: 37
The number of bins in each linkage group: 36
Markers not previously present in the map
pushCross() admits a fourth type,
"unlinked", which distributes markers residing in an
unlinked group of the geno element into the established
linkage groups. This provides the mechanism by which new markers are
introduced into a completed map, and is described in Worked example II in the
context of fine mapping and of unknown linkage groups.
Further reading
- Diagnosing genotypes and markers — determining which markers warrant setting aside
- Worked example I — the pull operation within a complete construction
-
pullCross(),pushCross(),pp.init()— full argument documentation