Nothing
################################################################################
# Generic skeleton for the alelle call based HMM.
################################################################################
hmm.allele = function(data, founders, sex, snps, chr, trans.prob.fxn) {
maxIter = 100
epsilon = 5 # NOTE: We change this in the first iteration below.
p = 1
lastLogLik = -Inf
logLik = -.Machine$double.xmax
# Convert genotypes to numbers.
tmp = convert.allele.calls(data$geno, founders$geno)
data$geno = tmp[[1]]
founders$geno = tmp[[2]]
rm(tmp)
# Initialize the HMM.
init.hmm = initialize.hmm(snps = snps[,1], samples = rownames(data$geno),
states = founders$states)
# Get emission probabilities.
b = emission.probs.allele(founders = founders, chr = chr, snps = snps,
sex = sex)
# Save the initial emission probabilities as pseudocounts.
pseudocounts = b
a = NULL
if(attr(data, "sampletype") %in% c("DO", "DOF1", "HS", "HSrat")) {
a = trans.prob.fxn(states = founders$states, snps = snps, chr = chr,
sex = sex, gen = data$gen)
} else {
a = list(trans.prob.fxn(states = founders$states, snps = snps, chr = chr,
sex = "F"))
} # else
while(p <= maxIter & logLik - lastLogLik > epsilon) {
print(date())
print(p)
# Optional plotting code to watch the HMM progress.
if(TRUE) {
prsmth.plot(1, founders$states, init.hmm$prsmth)
} # if(plot)
# Initialize the log-likelihood to a large negative number.
lastLogLik = logLik
# Filter and smooth each generation separately because they each have a
# different transition probability matrix.
print("Running HMM ...")
lltmp = matrix(-.Machine$double.xmax, 1, 1)
for(i in 1:length(a)) {
# Filter
gen = 1:nrow(data$geno)
if(any(names(data) == "gen") & attr(data, "sampletype") != "CC") {
print(paste("gen", names(a)[i]))
gen = which(data$gen == names(a)[i])
} # if(any(names(data) == "gen"))
res = .C(C_filter_smooth_allele,
dims = as.integer(c(dim(init.hmm$prsmth[,gen,,drop = FALSE]), nrow(b))),
geno = as.integer(data$geno[gen,]),
a = as.double(a[[i]]),
b = as.double(b),
prsmth = as.double(init.hmm$prsmth[,gen,,drop = FALSE]),
init = as.double(init.hmm$init),
loglik = as.double(lltmp))
init.hmm$prsmth[,gen,] = res$prsmth
lltmp = addLog(lltmp, res$loglik)
} # for(i)
logLik = lltmp
print(paste("LogLik =", logLik))
if(p == 1) {
epsilon = abs(logLik * 0.001)
} # if(p == 1)
# Update the parameters and state means and variances.
print("Updating Parameters ...")
b = parameter.update.alleles(geno = data$geno, b = b,
pseudocounts = pseudocounts, prsmth = init.hmm$prsmth)
p = p + 1
} # while(p < maxIter & logLik - lastLogLik > epsilon
print(date())
# If we reached the end of the interations.
if(p >= maxIter) {
print("Maximum iterations reached")
} # if(p >= maxIter)
return(list(b = b, prsmth = init.hmm$prsmth))
} # hmm.allele
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.