proportionsInAdmixture<-function
(MarkerMeansPure,
datE.Admixture,
calculateConditionNumber = FALSE,
coefToProportion = TRUE)
{
datE.Admixture = data.frame(datE.Admixture)
if (sum(is.na(names(datE.Admixture))) > 0) {
warning("Some of the column names of datE.Admixture are missing. Recommendation: check or assign column names. But for your convenience, we remove the corresponding columns of datE.Admixture from the analysis.")
datE.Admixture = datE.Admixture[, !is.na(names(datE.Admixture))]
}
if (sum(names(datE.Admixture) == "") > 0) {
warning("Some of the column names of datE.Admixture are missing. Recommendation: check or assign column names. But for your convenience, we remove the corresponding columns of datE.Admixture from the analysis.")
datE.Admixture = datE.Admixture[, names(datE.Admixture) !=
""]
}
MarkerID = MarkerMeansPure[, 1]
if (sum(is.na(MarkerID)) > 0) {
warning("Some of the marker are missing (NA). Recommendation: check the first column of the input MarkerMeansPure. It should contain marker names. But for your convenience, we remove the corresponding markers from the analysis.")
MarkerMeansPure = MarkerMeansPure[!is.na(MarkerID), ]
MarkerID = MarkerMeansPure[, 1]
}
if (sum(MarkerID == "", na.rm = T) > 0) {
warning("Some of the marker names are empty strings. Recommendation: check the first column of the input MarkerMeansPure. It should contain marker names. But for your convenience, we remove the corresponding markers from the analysis.")
MarkerMeansPure = MarkerMeansPure[MarkerID != "", ]
MarkerID = MarkerMeansPure[, 1]
}
noMissingValuesMarker = as.numeric(apply(is.na(MarkerMeansPure[,
-1]), 1, sum))
if (max(noMissingValuesMarker, na.rm = T) > 0) {
warning("Some of the markers (rows of MarkerMeansPure) contain missing values. This is problematic.\nFor your convenience, we remove the corresponding markers (rows) from the analysis.")
MarkerMeansPure = MarkerMeansPure[noMissingValuesMarker ==
0, ]
MarkerID = MarkerMeansPure[, 1]
}
match1 = match(MarkerID, names(datE.Admixture))
match1 = match1[!is.na(match1)]
if (length(match1) == 0)
stop("None of the marker names correspond to column names of the input datE.Admixture. Possible solutions: Transpose datE.Admixture or MarkerMeansPure. Or make sure to assign suitable names to the columns of datE.Admixture, e.g. as follows dimnames(datE.Admixture)[[2]]=GeneSymbols.")
if (length(match1) < dim(MarkerMeansPure)[[1]]) {
warning(paste("Only", length(match1), "out of ", dim(MarkerMeansPure)[[1]],
"rows of MarkerMeansPure correspond to columns of datE.Admixture. \nIf this suprises you, check the the first column of MarkerMeansPure or the column names of datE.Admixture. \nThe output contains a list of markers that could be identified."))
}
datE.MarkersAdmixtureTranspose = t(datE.Admixture[, match1])
match2 = match(names(datE.Admixture)[match1], MarkerID)
match2 = match2[!is.na(match2)]
MarkerMeansPure = MarkerMeansPure[match2, ]
if (sum(as.character(MarkerMeansPure[, 1]) != dimnames(datE.MarkersAdmixtureTranspose)[[1]],
na.rm = T) > 0)
stop("I am sorry but things do not line up. Maybe you need to look inside the R code. Specifically,\nas.character(MarkerMeansPure) != dimnames(datE.MarkersAdmixtureTranspose)[[1]]")
conditionNumber = NA
if (dim(MarkerMeansPure)[[2]] == 2) {
A = as.matrix(MarkerMeansPure[, -1], ncol = 1)
}
else {
A = as.matrix(MarkerMeansPure[, -1])
}
if (dim(as.matrix(A))[[2]] > 1 & dim(as.matrix(A))[[1]] >
1 & calculateConditionNumber) {
conditionNumber = kappa(A)
}
datCoef = t(lm(datE.MarkersAdmixtureTranspose ~ A)$coefficients[-1,
])
coef2prop = function(coef) {
prop = rep(NA, length(coef))
coef[coef < 0] = 0
if (sum(coef, na.rm = T) > 0 & !is.na(sum(coef, na.rm = T))) {
prop = coef/sum(coef, na.rm = T)
}
prop
}
if (coefToProportion) {
PredictedProportions = data.frame(t(apply(datCoef, 1,
coef2prop)))
}
else {
PredictedProportions = datCoef
}
dimnames(PredictedProportions)[[1]] = dimnames(datE.Admixture)[[1]]
out = list(PredictedProportions = PredictedProportions, datCoef = datCoef,
conditionNumber = conditionNumber, markersUsed = as.character(MarkerMeansPure[,
1]))
out
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.