-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathaltAddTraitAD.R
More file actions
85 lines (76 loc) · 2.99 KB
/
altAddTraitAD.R
File metadata and controls
85 lines (76 loc) · 2.99 KB
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
#' @title Alternative method for adding an AD trait
#'
#' @description An alternative method for adding a trait with additive
#' and dominance effects to an AlphaSimR simulation. The function attempts
#' to create a trait matching user defined values for number of QTL, inbreeding
#' depression, additive genetic variance and dominance genetic variance.
#'
#' @param nQtlPerChr number of QTLs per chromosome. Can be a single value or nChr values.
#' @param mean desired mean of the trait
#' @param varA desired additive variance
#' @param varD desired dominance variance
#' @param inbrDepr desired inbreeding depression
#' @param limMeanDD limits for meanDD, see details
#' @param limVarDD limits for varDD, see details
#' @param name optional name for trait
#' @param silent should summary details be printed to the console
#' @param simParam an object of 'SimParam' class
#'
#' @details
#' TO DO
#'
#' @return NULL, the trait is added directly to simParam
#'
#' @export
altAddTraitAD = function(nQtlPerChr, mean, varA, varD, inbrDepr,
limMeanDD = c(0, 1.5),
limVarDD = c(0, 0.3),
name = NULL, silent=FALSE,
simParam = NULL){
if(is.null(simParam)){
simParam = get("SP",envir=.GlobalEnv)
}
# Check that simParam still has it's founderPop
stopifnot("'simParam$founderPop' must have a 'RawPop'" =
is(simParam$founderPop, "RawPop"))
# Add a placeholder trait
simParam$addTraitAD(nQtlPerChr = nQtlPerChr,
name = name)
# Initialize the tuner object using objects from simParam
tuner = TuneAD$new(LociMap = simParam$traits[[simParam$nTraits]],
Pop = simParam$founderPop,
mean_ = mean,
varA_ = varA,
varD_ = varD,
inbrDepr_ = inbrDepr,
nThreads_ = simParam$nThreads)
# Run optim to optimize meanDD and varDD
optOut = optim(par = c(mean(limMeanDD), mean(sqrt(limVarDD))),
fn = tuner$objective,
gr = NULL,
method = "L-BFGS-B",
lower = c(limMeanDD[1], sqrt(limVarDD[1])),
upper = c(limMeanDD[2], sqrt(limVarDD[2])))
# Sumarize parameters
meanDD = optOut$par[1]
varDD = optOut$par[2]^2
output = tuner$finalize(meanDD_ = meanDD,
stdDevDD_ = sqrt(varDD))
# Set new trait
nTraits = simParam$nTraits
trait = simParam$traits[[nTraits]]
trait@addEff = c(output$a)
trait@domEff = c(output$d)
trait@intercept = c(output$intercept)
simParam$switchTrait(nTraits, trait)
# Report trait details
if(!silent){
cat("New trait called", simParam$traitNames[nTraits], "was added \n")
cat("Dominance variance is", output$varD, "\n")
cat("Inbreeding depression is", output$inbrDepr, "\n")
cat("Used meanDD equals", meanDD, "\n")
cat("Used varDD equals", varDD, "\n")
}
rm(tuner)
return(invisible())
}