-
Notifications
You must be signed in to change notification settings - Fork 24
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #115 from kbroman/master
Add create_snpinfo() for creating snp information table from cross
- Loading branch information
Showing
10 changed files
with
174 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
#' Create snp information table for a cross | ||
#' | ||
#' Create a table of snp information from a cross, for use with [scan1snps()]. | ||
#' | ||
#' @param cross Object of class `"cross2"`. For details, see the | ||
#' [R/qtl2 developer guide](https://kbroman.org/qtl2/assets/vignettes/developer_guide.html). | ||
#' | ||
#' @return A data frame of SNP information with the following columns: | ||
#' * `chr` - Character string or factor with chromosome | ||
#' * `pos` - Position (in same units as in the `"map"` | ||
#' attribute in `genoprobs`. | ||
#' * `snp` - Character string with SNP identifier (if | ||
#' missing, the rownames are used). | ||
#' * `sdp` - Strain distribution pattern: an integer, between | ||
#' 1 and \eqn{2^n - 2} where \eqn{n} is the number of strains, whose | ||
#' binary encoding indicates the founder genotypes | ||
#' SNPs with missing founder genotypes are omitted. | ||
#' | ||
#' @examples | ||
#' \dontrun{ | ||
#' # load example data and calculate genotype probabilities | ||
#' file <- paste0("https://raw.githubusercontent.com/rqtl/", | ||
#' "qtl2data/master/DO_Recla/recla.zip") | ||
#' recla <- read_cross2(file) | ||
#' snpinfo <- create_snpinfo(recla) | ||
#' | ||
#' # calculate genotype probabilities | ||
#' pr <- calc_genoprob(recla, error_prob=0.002, map_function="c-f") | ||
#' | ||
#' # index the snp information | ||
#' snpinfo <- index_snps(recla$pmap, snpinfo) | ||
#' | ||
#' # sex covariate | ||
#' sex <- setNames((recla$covar$Sex=="female")*1, rownames(recla$covar)) | ||
#' | ||
#' # perform a SNP scan | ||
#' out <- scan1snps(pr, recla$pmap, recla$pheno[,"bw"], addcovar=sex, snpinfo=snpinfo) | ||
#' | ||
#' # plot the LOD scores | ||
#' plot(out$lod, snpinfo, altcol="green3") | ||
#' } | ||
#' | ||
#' @seealso [index_snps()], [scan1snps()], [genoprob_to_snpprob()] | ||
#' @export | ||
create_snpinfo <- | ||
function(cross) | ||
{ | ||
if(!("cross2" %in% class(cross))) { | ||
stop("Input should be a cross2 object") | ||
} | ||
|
||
if("pmap" %in% names(cross)) map <- cross$pmap | ||
else if("gmap" %in% names(cross)) map <- cross$gmap | ||
else stop("cross contains neither pmap nor gmap") | ||
|
||
# convert map to a data frame | ||
nmar <- vapply(map, length, 1) # no. markers per chromosome | ||
markers <- unlist(lapply(map, names)) | ||
map <- data.frame(chr=rep(names(map), nmar), | ||
pos=unlist(map), | ||
snp=markers, | ||
stringsAsFactors=FALSE) | ||
rownames(map) <- map$snp | ||
|
||
# founder genotypes -> SDP | ||
if(!("founder_geno" %in% names(cross))) { | ||
stop("cross does not contain founder_geno") | ||
} | ||
fg <- do.call("cbind", cross$founder_geno) | ||
|
||
mar2drop <- (colSums(is.na(fg) | fg==0) > 0) | ||
|
||
# drop markers with missing data; calculate founder strain distribution patterns (SDPs) | ||
cbind(map[!mar2drop,,drop=FALSE], | ||
sdp=calc_sdp(t(fg[,!mar2drop]))) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
context("create snpinfo from cross2 object") | ||
|
||
test_that("create_snpinfo works", { | ||
|
||
if(isnt_karl()) skip("this test only run locally") | ||
|
||
file <- paste0("https://raw.githubusercontent.com/rqtl/", | ||
"qtl2data/master/DOex/DOex.zip") | ||
|
||
DOex <- read_cross2(file) | ||
|
||
snpinfo <- create_snpinfo(DOex) | ||
|
||
fg <- do.call("cbind", DOex$founder_geno) | ||
|
||
expect_equal(sum(colSums(fg==0)==0), nrow(snpinfo)) | ||
|
||
n <- sapply(DOex$founder_geno, function(a) sum(colSums(a==0)==0)) | ||
expect_equivalent(unclass(table(snpinfo$chr)), n) | ||
|
||
expect_equivalent(snpinfo$sdp, calc_sdp(t(fg[,colSums(fg==0)==0]))) | ||
|
||
}) |