-
Notifications
You must be signed in to change notification settings - Fork 0
/
report.Rhtml
executable file
·458 lines (372 loc) · 26 KB
/
report.Rhtml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
<!DOCTYPE html>
<!--[if IE 8]> <html lang="en" class="ie8"> <![endif]-->
<!--[if IE 9]> <html lang="en" class="ie9"> <![endif]-->
<!--[if !IE]><!--> <html lang="en"> <!--<![endif]-->
<head>
<title>Genotype QC report</title>
<!-- Meta -->
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link href='http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800' rel='stylesheet' type='text/css'>
<!-- Global CSS -->
<link rel="stylesheet" href="assets/plugins/bootstrap/css/bootstrap.min.css">
<!-- Plugins CSS -->
<link rel="stylesheet" href="assets/plugins/font-awesome/css/font-awesome.css">
<link rel="stylesheet" href="assets/plugins/prism/prism.css">
<link rel="stylesheet" href="assets/plugins/elegant_font/css/style.css">
<!-- Theme CSS -->
<link id="theme-style" rel="stylesheet" href="assets/css/styles.css">
<!-- Slideshow CSS -->
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body class="body-green">
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
opts_chunk$set(fig.width=5, fig.height=5)
options(knitr.table.format = "html")
options(warn=-1)
options(scipen=999)
for (lib in c("knitr","kableExtra","data.table","gtools","dplyr"))
suppressMessages(library(lib,character.only=T))
params = commandArgs(trailingOnly=TRUE)[1]
getParam = function(param) system(paste0("source ",params,"; echo $",param),intern=T)
de = strsplit(date()," +")[[1]]
reportDate = paste(de[3],de[2],de[5],"at",paste(strsplit(de[4],":")[[1]][1:2],collapse=":"))
end.rcode-->
<div class="page-wrapper">
<!-- ******Header****** -->
<header id="header" class="header">
<div class="container">
<div class="branding">
<h1 class="logo">
<span aria-hidden="true" class="icon_documents_alt icon"></span>
<span class="text-highlight">Genotype QC report: </span><span class="text-bold"><!--rinline I(getParam("PROJECTNAME")) --></span>
</h1>
</div><!--//branding-->
<div class="meta"><i class="fa fa-clock-o"></i> Generated on <!--rinline I(reportDate) --> by user <!--rinline I(getParam("USER")) --></div>
</div><!--//container-->
</header><!--//header-->
<div class="doc-wrapper">
<div class="container">
<div class="doc-body">
<div class="doc-content">
<div class="content-inner">
<section id="input-section" class="doc-section">
<h2 class="section-title">Input data</h2>
<div class="section-block">
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
filenames = list.files(file.path(getParam("OUTPATH"),"batch_data"), pattern="n*.fam", full=T)
keptTab = t(sapply(filenames, function(x) c(system(paste0("wc -l <",x),intern=T),gsub("[.].*","",basename(x)))))
keptTab = as.data.table(keptTab)
colnames(keptTab) = c("kept", "BATCH")
keptTab[,kept:=as.numeric(kept)]
filenames = list.files(file.path(getParam("OUTPATH"),"report/data"), pattern="n*.fail-imisshet-qc.txt", full=T)
dt = rbindlist(lapply(filenames, function(x)cbind(fread(x),BATCH=gsub("[.].*","",basename(x)))))
dt[,CID:=paste(FID,IID)]
batchFiltTab = merge(dcast(dt[,.N,by=list(BATCH,FAILED)], BATCH~FAILED, value.var="N"),
dt[,.(excluded=length(unique(CID))),by=BATCH], by="BATCH")
batchFiltTab[is.na(batchFiltTab)] = 0
samplesTab = merge(batchFiltTab, keptTab, by="BATCH")
samplesTab[,total:=excluded+kept]
samplesTab = samplesTab[mixedorder(samplesTab$BATCH),]
setcolorder(samplesTab, c("BATCH", "total", "kept", "excluded", "high_imiss", "high_het", "low_het"))
nSamplesExcl = sum(samplesTab$excluded)
nSamplesTotal = sum(samplesTab$total)
nBatches = nrow(samplesTab)
infiles = strsplit(getParam("INFILES")," ")[[1]]
if (nBatches==1) {
cat('<p>QC was performed directly on the whole dataset, treated as a single batch, consisting of <b>',nSamplesTotal,' samples</b>.</p>')
cat('<p>Input data was read from the following file: </p>')
cat(paste0("<p>",infiles,"</p>"))
} else {
cat(paste0('<p>QC was performed on <b>',nSamplesTotal,' samples</b> distributed across ',nBatches,' batches in the following files:</p>'))
if (length(unique(dirname(infiles)))==1) { # samples share base directory
cat(paste0("<p>",paste(basename(infiles), collapse=", "),"</p>"))
cat("<p>The files were in this folder:</p>")
cat(paste0("<p>",unique(dirname(infiles)),"</p>"))
} else {
cat(paste0("<p>",infiles,"</p>"))
}
}
filenames = list.files(file.path(getParam("OUTPATH"),"report/data"), pattern="n*.raw.count", full=T)
countsTab = sapply(filenames, function(x) read.table(x)[,1])
# assert(sum(countsTab[1,])==nSamplesTotal)
nMarkersTotal = min(countsTab[2,]) # assuming markers in batches overlap but some batches may have extra markers
end.rcode-->
</div>
<div id="input1" class="section-block">
<h3 class="block-title">Preprocessing</h3>
<p>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
zcallinput = as.logical(toupper(getParam("ZCALLINPUT")))
affyids = getParam("AFFYIDS")
genomebuild = getParam("GENOMEBUILD")
if (zcallinput) {
s = ifelse(nBatches==1,"","s")
wasWere = ifelse(nBatches==1,"was","were")
cat(paste0("The input Illumina GenomeStudio report",s," ",wasWere,
" parsed into PLINK binary files for subsequent analysis."))
} else {
cat("No preprocessing was necessary.")
}
end.rcode-->
</p>
</div><!--//section-block-->
</section><!--//doc-section-->
<section id="sampleqc-section" class="doc-section">
<h2 class="section-title">Sample QC</h2>
<p/>
<p>Per-sample QC consisted of four steps: 1) identification of biological sex for each sample, 2) identification of samples with outlying missing genotype or heterozygosity rates, 3) identification of duplicated or related individuals and 4) identification of individuals of divergent ancestry.
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
if (nBatches>1)
cat(' Steps 2 and 3 were carried out per-batch individually, whereas steps 3 and 4 were applied on the whole sample set.')
end.rcode-->
</p>
<div id="sampleqc1" class="section-block">
<h3 class="block-title">Identification of biological sex for each sample</h3>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
mapSexToInts = function(x) {
x = tolower(x)
x[x%in%c("m","male",1)] = "Male"
x[x%in%c("f","female",2)] = "Female"
x[!x%in%c("Male","Female")] = "N/A"
x
}
filenames = list.files(file.path(getParam("OUTPATH"),"report/data"), pattern="n*.sexcheck", full=T)
sexes = mapSexToInts(unlist(lapply(filenames, function(x) fread(x,header=T)$SNPSEX)))
male = length(which(sexes=="Male"))
female = length(which(sexes=="Female"))
dt_sex_fam = fread(file.path(getParam("OUTPATH"),"all.clean-base.fam"))
names(dt_sex_fam)[c(2,5)] = c("iid","sex_fam")
dt_sex_fam[,sex_fam:=mapSexToInts(sex_fam)]
maleAfter = length(which(dt_sex_fam$sex_fam=="Male"))
femaleAfter = length(which(dt_sex_fam$sex_fam=="Female"))
naAfter = length(which(dt_sex_fam$sex_fam=="N/A"))
end.rcode-->
<p>Biological sex for each sample was assigned to the one imputed based on chromosome X inbreeding coefficients. <!--rinline I(male) --> males and <!--rinline I(female) --> females were identified. After QC, <!--rinline I(femaleAfter) --> females, <!--rinline I(maleAfter) --> males and <!--rinline I(naAfter) --> individuals of undetermined sex remained.</p>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
if (getParam("SEXFILE")!="") {
dt_sex_self = fread(getParam("SEXFILE"))
dt_sex_self[,sex:=mapSexToInts(sex)]
dt_sex = merge(dt_sex_fam, dt_sex_self, all.x=T, all.y=F)
sexTab = addmargins(table(dt_sex$sex, dt_sex$sex_fam))
sexTab = cbind("Self-reported", rownames(sexTab), sexTab)
cat("The following table summarizes the concordance between self-reported and imputed sex:")
kable(sexTab, row.names=F) %>%
kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"), full_width=T) %>%
column_spec(1, bold = T) %>%
column_spec(2, bold = T) %>%
collapse_rows(columns = 1) %>%
add_header_above(c(" " = 1, " " = 1, "Genotype-imputed" = 4))
}
end.rcode-->
</div><!--//section-block-->
<div id="sampleqc2" class="section-block">
<h3 class="block-title">Samples with outlying missing genotype or heterozygosity rates</h3>
<p>Large variations exist in DNA sample quality and these can have substantial effects on genotype call rate and genotype accuracy. Samples of low DNA quality or concentration often have below-average call rates and genotype accuracy. The genotype failure rate and heterozygosity rate per individual are both measures of DNA sample quality. Therefore, individuals with more than <b><!--rinline I(as.numeric(getParam("IMISS"))*100) -->% missing genotypes</b> were removed. Those with an excessive or reduced proportion of <b>heterozygote genotypes (<!--rinline I(getParam("HET")) --> standard deviations from the batch mean)</b>, which may be indicative of DNA sample contamination, inbreeding or differing population, were equally removed.</p>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
samplesTabDisplay = samplesTab
if (nrow(samplesTabDisplay)==1) {
samplesTabDisplay$BATCH[1] = "ALL"
} else {
samplesTabDisplay = rbind(t(c(BATCH="ALL",apply(samplesTabDisplay[,-1],2,sum))), samplesTabDisplay)
}
kable(samplesTabDisplay) %>%
kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"), full_width=F) %>%
row_spec(1, bold = T) %>%
add_header_above(c(" " = 1, " " = 1, " " = 1, " " = 1, "Filters" = 3))
end.rcode-->
<div class='w3-content w3-display-container' style='width:70%;margin:auto'>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
filenames = list.files(file.path(getParam("OUTPATH"),"report/data"), pattern="n*.imiss-vs-het.png", full=F)
for (f in filenames) {
cat("<div class='w3-display-container mySlides screenshot-holder'>")
cat(paste0("<a href='data/",f,"' target='_new'><img src='data/",f,"' style='mix-blend-mode:multiply;border-width:0;width:100%' /></a>"))
cat(paste0("<a class='mask' href='data/",f,"' target='_new'><i class='icon fa fa-search-plus'></i></a>"))
cat("<div class='w3-display-topmiddle w3-large w3-container w3-light-grey'>")
cat(paste0("Batch ",gsub("[.].*","",f)))
cat("</div>")
cat("</div>")
}
end.rcode-->
<button class='w3-button w3-light-grey w3-display-topleft' onclick='plusDivs(-1)'>❮</button>
<button class='w3-button w3-light-grey w3-display-topright' onclick='plusDivs(1)'>❯</button>
</div>
<script>
var slideIndex = 1; showDivs(slideIndex); function plusDivs(n) { showDivs(slideIndex += n); }
function showDivs(n) {
var i; var x = document.getElementsByClassName("mySlides");
if (n > x.length) {slideIndex = 1}
if (n < 1) {slideIndex = x.length}
for (i = 0; i < x.length; i++) { x[i].style.display = "none"; }
x[slideIndex-1].style.display = "block";
}
</script>
</div><!--//section-block-->
<div id="sampleqc3" class="section-block">
<h3 class="block-title">Duplicated or related individuals</h3>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
rel = getParam("REL")
if (rel>0.5) {
whRel = "genetically identical"
} else if (rel>0.25) {
whRel = "first-degree"
} else if (rel>0.125) {
whRel = "second-degree"
} else {
whRel = "both low and high-degree (i.e. second-degree)"
}
IBDFailFile = file.path(getParam("OUTPATH"),"report/data/fail-ibd-qc.txt")
nIBDFail = as.numeric(system(paste0("wc -l <", IBDFailFile), intern=T))
end.rcode-->
<p>If duplicates or high-degree relatives are present, a bias may be introduced in the study because the genotypes within families will be overrepresented, and thus the sample may no longer be a fair reflection of the allele frequencies in the entire population. To identify duplicate and related individuals, identity by state (IBS) was calculated for each pair of individuals based on the average proportion of alleles shared in common at genotyped SNPs. Because the method works best when only independent SNPs are included in the analysis, regions of extended linkage disequilibrium (LD) were removed remaining regions were pruned so that no pair of SNPs within a 50 kb window were correlated at r2 > 0.2. SNPs with a call rate lower than <!--rinline I(100-as.numeric(getParam("GENO"))*100) -->% or with a HWE p-value less than <!--rinline I(getParam("HWE")) --> were not considered either. The degree of recent shared ancestry for a pair of individuals (identity by descent, IBD, from 0 to 1) was then estimated with genome-wide IBS data.</p>
<p>A threshold of <!--rinline I(rel) --> was used to identify duplicates and <b><!--rinline I(whRel) --> relatives</b>. One member of each pair of samples with observed genomic relatedness greater than this cutoff value was excluded, trying to maximize the final sample size. This resulted in <!--rinline I(nIBDFail) --> sample exclusions.</p>
</div><!--//section-block-->
<div id="sampleqc4" class="section-block">
<h3 class="block-title">Individuals of divergent ancestry</h3>
<p>In genetic studies, a major source of confounding is population stratification, in which genotypic differences between cases and controls are generated because of different population origins rather than because of any effect on disease risk. Efforts were made to reduce the effect of population stratification through the removal of individuals of divergent ancestry. For this purpose, principal component analysis (PCA) was used, a multivariate statistical method used here to derive uncorrelated variables from the overall set of (correlated) markers. The principal component model was built using pruned genome-wide genotype data from populations of known ancestry, namely, the HapMap genotype data from Europe (CEU), Asia (CHB + JPT) and Africa (YRI). The PCA was then applied to predict principal component scores for the sample set, thus allowing them to be clustered in terms of ancestry alongside the HapMap samples. Regions of extended high LD (including the HLA region) were removed before the analysis because these can overly influence the principal component model.</p>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
ancestryFailFile = file.path(getParam("OUTPATH"),"report/data/fail-ancestry-qc.txt")
nAncFail = as.numeric(system(paste0("wc -l <", ancestryFailFile), intern=T))
end.rcode-->
<p>The <b>CEU population</b> was the closest to the majority of individuals in the sample set. A <b>maximum distance of <!--rinline I(getParam("ANC")) --> from this population</b> in the Euclidean space formed by the first two principal components was set as a threshold to remove <!--rinline I(nAncFail) --> individuals with divergent ancestry.
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
ancestryTabFile = file.path(getParam("OUTPATH"),"report/data/ancestry.csv")
if (file.exists(ancestryTabFile)) {
cat(" See the table below for a breakdown by self-reported ancestry and how it matches the applied genotype-based filtering:</p>")
dt_anc = fread(ancestryTabFile, header=T)
setnames(dt_anc, "V1", "Ancestry")
dt_anc[,Total:=Kept+Filtered]
setcolorder(dt_anc, c("Ancestry", "Total", "Kept", "Filtered"))
kable(dt_anc) %>%
kable_styling(bootstrap_options=c("striped","hover","condensed","responsive"), full_width=F) %>%
add_footnote(c("Some individuals without ancestry information may have been filtered. See text for a total."), notation="symbol")
} else {
cat("</p>")
}
end.rcode-->
<p>The following figure shows the individuals on the first two principal components, with the HapMap populations represented as black dots:</p>
<div class="screenshot-holder" style='width:80%;margin:auto'>
<a href="data/ancestry.png" target="_new"><img style='mix-blend-mode:multiply;border-width:0' class="img-responsive" src="data/ancestry.png" alt="Ancestry PCA" /></a>
<a class="mask" href="data/ancestry.png" target="_new"><i class="icon fa fa-search-plus"></i></a>
</div>
<br/>
<p>A table with the first 10 principal components can be found in a separate CSV file. Click on this icon to download/open:</p>
<div class=" w3-display-container screenshot-holder" style='width:35%;margin:auto'>
<a href="data/ancestry_pcs.csv" target="_self"><img style='mix-blend-mode:multiply;border-width:0' class="img-responsive" src="assets/images/csv.png" alt="Ancestry PCA CSV" /></a>
<a class="mask" href="data/ancestry_pcs.csv" target="_self"><i class="icon fa fa-link"></i></a>
<div class='w3-small w3-container w3-transparent '>
Ancestry principal component table
</div>
</div>
</div><!--//section-block-->
</section><!--//doc-section-->
<section id="markerqc-section" class="doc-section">
<h2 class="section-title">Marker QC</h2>
<p/>
<p>Per-marker QC of GWA data consisted of three steps: 1) identification of SNPs with an excessive missing genotype, 2) identification of SNPs demonstrating a significant deviation from Hardy-Weinberg equilibrium (HWE) and 3) the removal of all makers with a very low minor allele frequency.
</p>
<!--begin.rcode, results='asis', echo=FALSE, warnings=FALSE, messages=FALSE
filename = file.path(getParam("OUTPATH"),"report/data/all.clean-base.log")
logStr = readChar(filename, file.info(filename)$size)
genoRm = as.numeric(gsub(".*\n([0-9]+) variants removed due to missing genotype data.*","\\1",logStr))
hweRm = as.numeric(gsub(".*\n--hwe: ([0-9]+) variants removed due to Hardy-Weinberg exact test.*","\\1",logStr))
mafRm = as.numeric(gsub(".*\n([0-9]+) variants removed due to minor allele threshold.*","\\1",logStr))
end.rcode-->
<div id="markerqc1" class="section-block">
<h3 class="block-title">Excessive genotyping missingness</h3>
<p>Sub-optimal markers is key to the success of a GWA study, because they can present as false-positives and reduce the ability to identify true associations correlated with disease-risk. Therefore, <!--rinline I(genoRm) --> markers with a <b>call rate less than <!--rinline I(100-as.numeric(getParam("GENO"))*100) -->%</b> were removed from further study.
</p>
<div class="screenshot-holder" style='width:60%;margin:auto'>
<a href="data/missingness.png" target="_new"><img style='mix-blend-mode:multiply;border-width:0' class="img-responsive" src="data/missingness.png" alt="Missingness histogram" /></a>
<a class="mask" href="data/missingness.png" target="_new"><i class="icon fa fa-search-plus"></i></a>
</div>
</div><!--//section-block-->
<div id="markerqc2" class="section-block">
<h3 class="block-title">Deviation from Hardy-Weinberg equilibrium (HWE)</h3>
<p>Extensive deviation from Hardy-Weinberg equilibrium (HWE) can be indicative of a genotyping or genotype calling error. <!--rinline I(hweRm) --> SNPs with a <b>HWE p-value less than <!--rinline I(getParam("HWE")) --></b> were removed.
</p>
</div><!--//section-block-->
<div id="markerqc3" class="section-block">
<h3 class="block-title">Low minor allele frequency (MAF)</h3>
<p>The final step of the marker QC was to remove <!--rinline I(mafRm) --> SNPs with a <b>minor allele frequency (MAF) lower than <!--rinline I(as.numeric(getParam("MAF"))*100) -->%.</b> For these SNPs with such low MAF, The small size of the heterozygote and rare homozygote clusters makes these variants difficult to call using current genotype calling algorithms and, even when well called, association signals seen at these rare SNPs are less robust because they are driven by the genotypes of only a few individuals. Given that power to detect association at rare variants is so low, their removal should have minimal impact.
</p>
</div><!--//section-block-->
</section><!--//doc-section-->
<section id="summary-section" class="doc-section">
<h2 class="section-title">Summary</h2>
<div class="section-block">
<p>A total of <b><!--rinline I(nSamplesExcl+nIBDFail+nAncFail) --> samples (<!--rinline I(round((nSamplesExcl+nIBDFail+nAncFail)/nSamplesTotal*100,2)) -->%) were removed</b> during the QC process:
</p>
<ul class="list">
<li><!--rinline I(round(nSamplesExcl/nSamplesTotal*100,2)) -->% for having high missingness or outlier heterozygosity rates.</li>
<li><!--rinline I(round(nIBDFail/nSamplesTotal*100,2)) -->% because of duplication or high degree of relatedness.</li>
<li><!--rinline I(round(nAncFail/nSamplesTotal*100,2)) -->% due to divergent ancestry.</li>
</ul>
<p>In turn, a total of <b><!--rinline I(genoRm+hweRm+mafRm) --> markers (<!--rinline I(round((genoRm+hweRm+mafRm)/nMarkersTotal*100,2)) -->%) were removed</b>:
</p>
<ul class="list">
<li><!--rinline I(round(genoRm/nMarkersTotal*100,2)) -->% due to high missingness.</li>
<li><!--rinline I(round(hweRm/nMarkersTotal*100,2)) -->% due to significantly deviated HWE.</li>
<li><!--rinline I(round(mafRm/nMarkersTotal*100,2)) -->% for having too low MAF.</li>
</ul>
</div>
</section><!--//doc-section-->
</div><!--//content-inner-->
</div><!--//doc-content-->
<div class="doc-sidebar hidden-xs">
<nav id="doc-nav">
<ul id="doc-menu" class="nav doc-menu" data-spy="affix">
<li>
<a class="scrollto" href="#input-section">Input data</a>
<ul class="nav doc-sub-menu">
<li><a class="scrollto" href="#input1">Preprocessing</a></li>
</ul><!--//nav-->
</li>
<li>
<a class="scrollto" href="#sampleqc-section">Sample QC</a>
<ul class="nav doc-sub-menu">
<li><a class="scrollto" href="#sampleqc1">Sex</a></li>
<li><a class="scrollto" href="#sampleqc2">Missingness & heterozygosity</a></li>
<li><a class="scrollto" href="#sampleqc3">Duplication & relatedness</a></li>
<li><a class="scrollto" href="#sampleqc4">Ancestry</a></li>
</ul><!--//nav-->
</li>
<li>
<a class="scrollto" href="#markerqc-section">Marker QC</a>
<ul class="nav doc-sub-menu">
<li><a class="scrollto" href="#markerqc1">Marker missingness</a></li>
<li><a class="scrollto" href="#markerqc2">Hardy-Weinberg equilibrium</a></li>
<li><a class="scrollto" href="#markerqc3">Minor allele frequency</a></li>
</ul><!--//nav-->
</li>
<li><a class="scrollto" href="#summary-section">Summary</a></li>
</ul><!--//doc-menu-->
</nav>
</div><!--//doc-sidebar-->
</div><!--//doc-body-->
</div><!--//container-->
</div><!--//doc-wrapper-->
</div><!--//page-wrapper-->
<footer id="footer" class="footer text-center">
<div class="container">
<small class="copyright">Report generated by <a href="http://linkedin.com/in/davidmosen/" targe="_blank">David Mosen-Ansorena</a> based on a design by <a href="http://themes.3rdwavemedia.com/" targe="_blank">Xiaoying Riley</a>.
</small>
</div><!--//container-->
</footer><!--//footer-->
<!-- Main Javascript -->
<script type="text/javascript" src="assets/plugins/jquery-1.12.3.min.js"></script>
<script type="text/javascript" src="assets/plugins/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="assets/plugins/prism/prism.js"></script>
<script type="text/javascript" src="assets/plugins/jquery-scrollTo/jquery.scrollTo.min.js"></script>
<script type="text/javascript" src="assets/plugins/jquery-match-height/jquery.matchHeight-min.js"></script>
<script type="text/javascript" src="assets/js/main.js"></script>
</body>
</html>