Last updated on 2019-11-26 00:52:01 CET.
Flavor | Version | Tinstall | Tcheck | Ttotal | Status | Flags |
---|---|---|---|---|---|---|
r-devel-linux-x86_64-debian-clang | 2.0.9 | 58.36 | 123.42 | 181.78 | ERROR | |
r-devel-linux-x86_64-debian-gcc | 2.0.9 | 44.03 | 93.80 | 137.83 | ERROR | |
r-devel-linux-x86_64-fedora-clang | 2.0.9 | 237.92 | OK | |||
r-devel-linux-x86_64-fedora-gcc | 2.0.9 | 237.74 | OK | |||
r-devel-windows-ix86+x86_64 | 2.0.9 | 169.00 | 279.00 | 448.00 | OK | |
r-devel-windows-ix86+x86_64-gcc8 | 2.0.9 | 121.00 | 213.00 | 334.00 | ERROR | |
r-patched-linux-x86_64 | 2.0.9 | 49.23 | 124.45 | 173.68 | OK | |
r-patched-solaris-x86 | 2.0.9 | 307.80 | OK | |||
r-release-linux-x86_64 | 2.0.9 | 47.60 | 127.10 | 174.70 | OK | |
r-release-windows-ix86+x86_64 | 2.0.9 | 158.00 | 269.00 | 427.00 | OK | |
r-release-osx-x86_64 | 2.0.9 | WARN | ||||
r-oldrel-windows-ix86+x86_64 | 2.0.9 | 85.00 | 260.00 | 345.00 | OK | |
r-oldrel-osx-x86_64 | 2.0.9 | OK |
Version: 2.0.9
Check: examples
Result: ERROR
Running examples in 'phylocurve-Ex.R' failed
The error most likely occurred in:
> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
> ### Name: K.mult
> ### Title: Test phylogenetic signal (Kmult) using phylogenetic simulation
> ### Aliases: K.mult
>
> ### ** Examples
>
> rand.data <- sim.traits()
> null.model <- evo.model(tree = rand.data$tree,
+ Y = rand.data$trait_data,method = "Pairwise ML")
----------- FAILURE REPORT --------------
--- failure: the condition has length > 1 ---
--- srcref ---
:
--- package (from environment) ---
phylocurve
--- call from context ---
evo.model(tree = rand.data$tree, Y = rand.data$trait_data, method = "Pairwise ML")
--- call from argument ---
if (class(Y) == "data.frame") {
species_col <- match(species.id, colnames(Y))
if (is.na(species_col))
stop("Name of species.id much match a column in Y (if supplying a data frame).")
trait_names <- colnames(Y)
if (trait_names[1] != species.id) {
Y <- data.frame(Y[, species_col], Y[, -species_col, drop = FALSE])
}
colnames(Y) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_Y <- as.matrix(Y[, 2:ncol(Y), drop = FALSE])
rownames(new_Y) <- as.character(Y[, 1])
Y <- new_Y
}
} else if (class(Y) == "matrix") {
if (is.null(rownames(Y))) {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(Y))
if (class(nms) == "list") {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(Y)))
colnames(Y) <- paste("V", 1:ncol(Y), sep = "")
} else if (class(Y) == "numeric") {
if (is.null(names(Y))) {
warning("No species names provided for Y. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(Y))
if (class(nms) == "list") {
warning("Names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
Y <- matrix(data = Y, nrow = nspecies, ncol = 1, dimnames = list(names(Y),
"V1"))
}
}
--- R stacktrace ---
where 1: evo.model(tree = rand.data$tree, Y = rand.data$trait_data, method = "Pairwise ML")
--- value of length: 2 type: logical ---
[1] FALSE FALSE
--- function from context ---
function (tree, Y, fixed.effects = NA, species.groups, trait.groups,
model = "BM", diag.phylocov = FALSE, method = "Pairwise REML",
force.zero.phylocov = character(), species.id = "species",
max.combn = 10000, painted.edges, ret.level = 2, plot.LL.surface = FALSE,
par.init.iters = 50, fixed.par = numeric(), multirate = FALSE,
subset = TRUE, bounds)
{
tree <- reorder(tree, "postorder")
if (length(tree$edge.length) > nrow(tree$edge))
tree$edge.length <- tree$edge.length[1:nrow(tree$edge)]
if (model == "OU")
model <- "OUfixedRoot"
if (missing(species.groups)) {
nrates.species <- 1
species.group.levels <- NA
}
else {
species.groups <- species.groups[match(tree$tip.label,
names(species.groups))]
if (missing(painted.edges)) {
painted.edges <- paint.edges(tree, species.groups)
}
nrates.species <- nlevels(species.groups)
species.group.levels <- levels(species.groups)
}
if (missing(trait.groups)) {
nrates.traits <- 1
trait.group.levels <- NA
}
else {
nrates.traits <- nlevels(trait.groups)
trait.group.levels <- levels(trait.groups)
}
if (multirate == FALSE & nrates.traits > 1) {
multirate <- TRUE
warning("Setting multirate to TRUE because trait.groups was specified.",
immediate. = TRUE)
}
if (method == "Pairwise REML" | method == "Full REML")
REML <- 1
else REML <- 0
evo.model.args <- as.list(environment())
evo.model.args$REML <- evo.model.args$trait.group.levels <- evo.model.args$nrates.traits <- evo.model.args$species.group.levels <- evo.model.args$nrates.species <- NULL
nspecies <- length(tree$tip.label)
nedge <- nrow(tree$edge)
intraspecific <- FALSE
if (class(fixed.effects) == "logical") {
X <- numeric(0)
X1 <- matrix(1, nspecies)
rownames(X1) <- tree$tip.label
}
else {
X <- fixed.effects
if (class(X) == "data.frame") {
species_col <- match(species.id, colnames(X))
if (is.na(species_col))
stop("Name of species.id much match a column in X (if supplying a data frame).")
trait_names <- colnames(X)
if (trait_names[1] != species.id) {
X <- data.frame(X[, species_col], X[, -species_col,
drop = FALSE])
}
colnames(X) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_X <- as.matrix(X[, 2:ncol(X), drop = FALSE])
rownames(new_X) <- as.character(X[, 1])
X <- new_X
}
}
else if (class(X) == "matrix") {
if (is.null(rownames(X))) {
rownames(X) <- tree$tip.label
warning("Row names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(X))
if (class(nms) == "list") {
rownames(X) <- tree$tip.label
warning("Row names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(X)))
colnames(X) <- paste("X", 1:ncol(X), sep = "")
}
else if (class(X) == "numeric") {
if (is.null(names(X))) {
warning("No species names provided for X. Assuming data are in order of tips.",
immediate. = TRUE)
names(X) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(X))
if (class(nms) == "list") {
warning("Names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(X) <- tree$tip.label
}
X <- matrix(data = X, nrow = nspecies, ncol = 1,
dimnames = list(names(X), "X1"))
}
}
X <- X[tree$tip.label, , drop = FALSE]
evo.model.args$fixed.effects <- X
X1 <- cbind(1, X)
}
if (class(Y) == "data.frame") {
species_col <- match(species.id, colnames(Y))
if (is.na(species_col))
stop("Name of species.id much match a column in Y (if supplying a data frame).")
trait_names <- colnames(Y)
if (trait_names[1] != species.id) {
Y <- data.frame(Y[, species_col], Y[, -species_col,
drop = FALSE])
}
colnames(Y) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_Y <- as.matrix(Y[, 2:ncol(Y), drop = FALSE])
rownames(new_Y) <- as.character(Y[, 1])
Y <- new_Y
}
}
else if (class(Y) == "matrix") {
if (is.null(rownames(Y))) {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(Y))
if (class(nms) == "list") {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(Y)))
colnames(Y) <- paste("V", 1:ncol(Y), sep = "")
}
else if (class(Y) == "numeric") {
if (is.null(names(Y))) {
warning("No species names provided for Y. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(Y))
if (class(nms) == "list") {
warning("Names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
Y <- matrix(data = Y, nrow = nspecies, ncol = 1,
dimnames = list(names(Y), "V1"))
}
}
if (all(complete.cases(Y)))
missing_data <- FALSE
if (ncol(Y) == 1)
if (method == "Pairwise ML")
method <- "Full ML"
else if (method == "Pairwise REML")
method <- "Full REML"
if (!intraspecific & !missing_data) {
Y <- Y[tree$tip.label, , drop = FALSE]
evo.model.args$Y <- Y
ndims <- ncol(Y)
diagndims <- diag(ndims)
diag2 <- diag(2)
if (method == "Full ML" | method == "Full REML") {
MC <- FALSE
}
else {
ncombn <- round(exp(lfactorial(ndims) - (log(2) +
lfactorial(ndims - 2))))
if (ncombn <= max.combn) {
MC <- FALSE
subsets <- matrix(0, 2, ncombn)
counter <- 1
for (r in 1:(ndims - 1)) {
for (s in (r + 1):ndims) {
subsets[, counter] <- c(r, s)
counter <- counter + 1
}
}
}
else {
MC <- TRUE
subsets <- apply(matrix(0, max.combn, 2), 1,
function(X) sample(x = ndims, size = 2, replace = FALSE))
}
}
if (nrates.species == 1) {
simple_BM <- function(temp_tree, ditree, ret_pars = FALSE) {
pY$edge_len <- ditree$edge.length
a_results <- do.call(multipic, pY)
suminvV_and_logdV <- c(a_results[[2]], a_results[[3]])
a <- a_results[[1]]
if (length(X) > 0) {
pX$edge_len <- ditree$edge.length
x_results <- do.call(multipic, pX)
x <- x_results[[1]]
XANC <- x_results$root[1, ]
XX <- crossprod(cbind(0, x)) + tcrossprod(c(1,
XANC)) * suminvV_and_logdV[1]
betas <- solve(crossprod(x), crossprod(x, a))
C <- crossprod(a - x %*% betas)/(nspecies -
REML)
}
else C <- crossprod(a)/(nspecies - REML)
colnames(C) <- rownames(C) <- colnames(Y)
if (ret_pars)
if (length(X > 0)) {
XY <- crossprod(cbind(0, x), a) + tcrossprod(c(1,
XANC), a_results$root[1, ]) * suminvV_and_logdV[1]
BETAS <- solve(XX, XY)
predicted <- X1 %*% BETAS
multipic.results <- list(X.multipic = x_results,
Y.multipic = a_results)
}
else {
predicted <- matrix(1, nspecies) %*% a_results$root[1,
]
multipic.results <- list(Y.multipic = a_results)
}
if (diag.phylocov)
C[upper.tri(C)] <- C[lower.tri(C)] <- 0
diagC <- diag(C)
if (nrates.traits > 1) {
temp_C <- C
for (i in 1:nrates.traits) {
group_i <- which(trait.groups == trait.group.levels[i])
diag(temp_C)[group_i] <- mean(diagC[group_i]) *
if (subset)
1
else length(group_i)
diagC[group_i] <- diag(temp_C)[group_i]
}
temp_C <- matrix(nearPD(x = temp_C, corr = FALSE,
keepDiag = TRUE)$mat, ncol(C), ncol(C))
C <- temp_C
}
else if (multirate) {
diag(C) <- mean(diagC) * if (subset)
1
else ndims
C <- matrix(nearPD(x = C, corr = FALSE, keepDiag = TRUE)$mat,
ncol(C), ncol(C))
diagC <- diag(C)
}
if (length(force.zero.phylocov) > 0) {
other <- (1:ncol(C))[-match(force.zero.phylocov,
colnames(C))]
C[force.zero.phylocov, other] <- C[other, force.zero.phylocov] <- 0
}
if (method == "Full REML" | method == "Full ML") {
const <- (nspecies * ndims - ndims * REML) *
(log(2 * pi))
ndims_logd <- ndims * suminvV_and_logdV[2]
ndims_invV <- ndims * log(suminvV_and_logdV[1])
log_Csub <- determinant(C, logarithm = TRUE)$modulus[[1]]
if (length(X) > 0) {
YY <- sum(tcrossprod(a - x %*% betas, backsolve(chol(C),
diagndims, transpose = TRUE))^2)
if (class(YY) == "try-error")
YY <- sum(diag(solve(C) %*% crossprod(a -
x %*% betas)))
logdetXWX <- determinant(XX)$modulus[[1]] *
ncol(C) - determinant(C)$modulus[[1]] *
(ncol(X) + 1)
}
else {
YY <- try(sum(tcrossprod(a, backsolve(chol(C),
diagndims, transpose = TRUE))^2), silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(C) %*% crossprod(a)))
logdetXWX <- (-log_Csub + ndims_invV)
}
logL <- -(const + (nspecies * log_Csub + ndims_logd) +
REML * logdetXWX + YY)/2
}
else if (method == "Pairwise REML" | method ==
"Pairwise ML") {
const <- (nspecies * 2 - 2 * REML) * (log(2 *
pi))
ndims_logd <- 2 * suminvV_and_logdV[2]
ndims_invV <- 2 * log(suminvV_and_logdV[1])
logL <- 0
if (MC)
subsets <- apply(matrix(0, max.combn, 2),
1, function(X) sample(x = ndims, size = 2,
replace = FALSE))
for (i in 1:ncol(subsets)) {
r <- subsets[1, i]
s <- subsets[2, i]
Csub <- C[c(r, s), c(r, s)]
log_Csub <- log(Csub[1, 1] * Csub[2, 2] -
Csub[1, 2]^2)
if (length(X) > 0) {
try(YY <- sum(tcrossprod(a[, c(r, s)] -
x %*% betas[, c(r, s)], backsolve(chol(Csub),
diag2, transpose = TRUE))^2), silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(Csub) %*% crossprod(a[,
c(r, s)] - x %*% betas[, c(r, s)])))
logdetXWX <- determinant(XX)$modulus[[1]] *
2 - log_Csub * (ncol(X) + 1)
}
else {
try(YY <- sum(tcrossprod(a[, c(r, s)],
backsolve(chol(Csub), diag2, transpose = TRUE))^2),
silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(Csub) %*% crossprod(a[,
c(r, s)])))
logdetXWX <- (-log_Csub + ndims_invV)
}
logL <- logL - (const + (nspecies * log_Csub +
ndims_logd) + REML * logdetXWX + YY)
}
logL <- logL/i * ncombn/2
}
if (ret_pars)
return(list(phylocov = C, logL = logL, predicted = predicted,
transf_tree = temp_tree, multipic.results = multipic.results))
else return(logL)
}
}
else {
ind <- 0L:1L
tempY <- matrix(0, nspecies * 2, 1)
tempY_span <- 1:(nspecies * 2)
simple_BM <- function(temp_tree, ditree, ret_pars = FALSE) {
pY$edge_len <- ditree$edge.length
a_results <- do.call(multipic, pY)
suminvV_and_logdV <- c(a_results[[2]], a_results[[3]])
a <- a_results[[1]]
Y_anc <- a_results$root[1, ]
if (length(X) > 0) {
pX$edge_len <- ditree$edge.length
x_results <- do.call(multipic, pX)
x <- x_results[[1]]
XANC <- x_results$root[1, ]
YANC <- a_results$root[1, ]
XX <- crossprod(cbind(0, x)) + tcrossprod(c(1,
XANC)) * suminvV_and_logdV[1]
betas <- solve(crossprod(x), crossprod(x, a))
XY <- crossprod(cbind(0, x), a) + tcrossprod(c(1,
XANC), YANC) * suminvV_and_logdV[1]
BETAS <- solve(XX, XY)
C <- crossprod(a - x %*% betas)/(nspecies -
REML)
anc <- X1 %*% BETAS
}
else {
anc <- matrix(1, nspecies) %*% a_results$root[1,
]
C <- crossprod(a)/(nspecies - REML)
}
colnames(C) <- rownames(C) <- colnames(Y)
if (ret_pars)
if (length(X > 0)) {
predicted <- anc
multipic.results <- list(X.multipic = x_results,
Y.multipic = a_results)
}
else {
predicted <- anc
multipic.results <- list(Y.multipic = a_results)
}
resid <- fast_transform(vcv(temp_tree)) %*% (Y -
anc)
rownames(resid) <- rownames(Y)
species.subsets <- Clist <- diagClist <- vector("list",
nrates.traits)
for (j in 1:nrates.species) {
species.subsets[[j]] <- which(!is.na(match(species.groups,
species.group.levels[j])))
Clist[[j]] <- t(resid[species.subsets[[j]],
]) %*% resid[species.subsets[[j]], ]/(length(species.subsets[[j]]) -
REML)
if (diag.phylocov)
Clist[[j]][upper.tri(Clist[[j]])] <- Clist[[j]][lower.tri(Clist[[j]])] <- 0
diagClist[[j]] <- diag(Clist[[j]])
if (nrates.traits > 1) {
temp_C <- Clist[[j]]
for (i in 1:nrates.traits) {
group_i <- which(trait.groups == trait.group.levels[i])
diag(temp_C)[group_i] <- mean(diagClist[[j]][group_i]) *
if (subset)
1
else length(group_i)
}
temp_C <- matrix(nearPD(x = temp_C, corr = FALSE,
keepDiag = TRUE)$mat, ncol(Clist[[j]]),
ncol(Clist[[j]]))
Clist[[j]] <- temp_C
diagClist[[j]] <- diag(Clist[[j]])
}
else if (multirate) {
diag(Clist[[j]]) <- mean(diagClist[[j]]) *
if (subset)
1
else length(diagClist[[j]])
Clist[[j]] <- matrix(nearPD(x = Clist[[j]],
corr = FALSE, keepDiag = TRUE)$mat, ncol(Clist[[j]]),
ncol(Clist[[j]]))
diagClist[[j]] <- diag(Clist[[j]])
}
if (length(force.zero.phylocov) > 0) {
other <- which(is.na(match(colnames(Clist[[j]]),
force.zero.phylocov)))
Clist[[j]][force.zero.phylocov, other] <- Clist[[j]][other,
force.zero.phylocov] <- 0
}
if (is.null(temp_tree$root.edge))
temp_tree$edge.length <- c(temp_tree$edge.length[1:nedge],
0)
else temp_tree$edge.length <- c(temp_tree$edge.length[1:nedge],
temp_tree$root.edge)
}
if (method == "Full REML" | method == "Full ML") {
if (length(X) > 0) {
ret <- Rinv5(nspecies = nspecies, nedge = nedge,
edge.length = temp_tree$edge.length, anc = tree$edge[,
1], des = tree$edge[, 2], L = X1, R = Y,
painted.edges = painted.edges, phylocov_list = Clist)
}
else {
ret <- Rinv3(nspecies = nspecies, nedge = nedge,
edge.length = temp_tree$edge.length, anc = tree$edge[,
1], des = tree$edge[, 2], R = Y, painted.edges = painted.edges,
phylocov_list = Clist)
}
if (method == "Full REML")
logL <- ret$ReLogLik
else logL <- ret$LogLik
}
else if (method == "Pairwise REML" | method ==
"Pairwise ML") {
logL <- 0
if (MC)
subsets <- apply(matrix(0, max.combn, 2),
1, function(X) sample(x = ndims, size = 2,
replace = FALSE))
anc_nodes <- temp_tree$edge[, 1] - 1
des_nodes <- temp_tree$edge[, 2] - 1
len_vec <- temp_tree$edge.length
for (i in 1:ncol(subsets)) {
r <- subsets[1, i]
s <- subsets[2, i]
tempC <- lapply(Clist, function(X) X[c(r,
s), c(r, s)])
tempY[tempY_span] <- Y[, c(r, s)]
tempCmat <- matrix(0, 2 * nrates.species,
2)
for (zz in 1:length(tempC)) {
tempCmat[1:2 + 2 * (zz - 1), ] <- tempC[[zz]]
}
if (length(X) > 0) {
ret <- Rinv6(nspecies = nspecies, nedge = nedge,
ngroups = nrates.species, ind = ind,
len_vec = len_vec, anc = anc_nodes, des = des_nodes,
L = X1, R = tempY, painted_edges = painted.edges,
phylocovs = tempCmat, REML = REML)
}
else {
ret <- Rinv4(nspecies = nspecies, nedge = nedge,
ngroups = nrates.species, ind = ind,
len_vec = len_vec, anc = anc_nodes, des = des_nodes,
R = tempY, painted_edges = painted.edges,
phylocovs = tempCmat, REML = REML)
}
logL <- logL + ret
}
logL <- logL/i * ncombn
}
if (ret_pars) {
theta <- matrix(0, ncol(X1), ndims)
for (i in 1:ndims) theta[, i] <- theta_Rinv6(nspecies = nspecies,
nedge = nedge, ngroups = nrates.species,
ind = 0L, len_vec = temp_tree$edge.length,
anc = tree$edge[, 1] - 1, des = tree$edge[,
2] - 1, L = X1, R = Y[, i, drop = FALSE],
painted_edges = painted.edges, phylocovs = matrix(sapply(Clist,
function(X) X[i, i])), REML = REML)
predicted <- X1 %*% theta
}
if (ret_pars)
return(list(phylocov = Clist, logL = logL,
predicted = predicted, transf_tree = temp_tree))
else return(logL)
}
}
}
else {
stop("Missing data and intraspecific observations are not yet supported.")
}
if (!is.binary.tree(tree)) {
binary <- TRUE
ditree <- multi2di(tree, random = FALSE)
}
else {
binary <- FALSE
ditree <- tree
}
pY <- prep_multipic(Y, tree)
if (length(X) > 0)
pX <- prep_multipic(X, tree)
if (model != "BM") {
if (model != "BM")
if ((model == "OUfixedRoot" | model == "OUrandomRoot") &
!is.ultrametric(tree) & nrates.species > 1)
stop("Non-ultrametric trees not currently supported for OU model with multiple species groups.")
dis <- pruningwise.distFromRoot(reorder(tree, "pruningwise"))[1:nspecies]
Tmax <- mean(dis)
bounds.default <- matrix(c(1e-07/Tmax, max(50/Tmax, 5),
1e-07/Tmax, max(50/Tmax, 5), 1e-07, 1, 1e-06, 1,
1e-05, 3, min(-4, -3/Tmax), 0), ncol = 2, byrow = TRUE)
rownames(bounds.default) <- c("alpha", "alpha", "lambda",
"kappa", "delta", "rate")
colnames(bounds.default) <- c("min", "max")
starting.values.default <- c(0.5/Tmax, 0.5/Tmax, 0.5,
0.5, 0.5, -1/Tmax)
if (!missing(bounds)) {
bounds.default[, 1] <- bounds[1]
bounds.default[, 2] <- bounds[2]
if (any(starting.values.default < bounds[1]) | any(starting.values.default >
bounds[1])) {
starting.values.default[1:length(starting.values.default)] <- mean(bounds[1:2])
}
}
names(starting.values.default) <- c("OUrandomRoot", "OUfixedRoot",
"lambda", "kappa", "delta", "EB")
model_i <- match(model, names(starting.values.default))
bounds.default <- bounds.default[model_i, , drop = FALSE]
starting.values.default <- starting.values.default[model_i]
names(starting.values.default) <- rownames(bounds.default)
if (length(fixed.par) > 0) {
plot.LL.surface <- FALSE
bounds.default[1:2] <- rep(fixed.par, 2)
starting.values.default[1] <- fixed.par
}
if (model != "EB" & model != "BM") {
starting.values.default <- log(starting.values.default)
bounds.default <- log(bounds.default)
}
if (model[1] == "BM")
starting.values.default <- bounds.default <- NULL
geiger_args <- list(x = tree, model = if (model == "OUfixedRoot" |
model == "OUrandomRoot") "OU" else model, par = 5)
names(geiger_args)[3] <- names(starting.values.default)
if (model == "EB")
names(geiger_args)[3] <- "a"
if (model == "OUrandomRoot" | model == "OUfixedRoot" |
model == "OU") {
temp_args <- list(phy = tree, model = model, parameters = list(pars = 5))
names(temp_args$parameters) <- names(starting.values.default)
}
model_LL <- function(par, ret_pars = FALSE) {
if (model != "EB")
par <- exp(par)
if (model == "OUrandomRoot" | model == "OUfixedRoot" |
model == "OU") {
temp_args$parameters <- list(alpha = par)
temp_tree <- do.call(transf.branch.lengths, temp_args)$tree
}
else {
geiger_args[[3]] <- par
temp_tree <- do.call(rescale, geiger_args)
}
temp_tree <- reorder(temp_tree, "postorder")
if (!binary)
temp_ditree <- multi2di(temp_tree, random = FALSE)
else temp_ditree <- temp_tree
ret <- try(simple_BM(temp_tree = temp_tree, ditree = temp_ditree,
ret_pars = ret_pars), silent = TRUE)
if (class(ret) == "try-error")
return(-.Machine$double.xmax)
else return(ret)
}
if (MC)
try_length <- max(50, par.init.iters)
else try_length <- par.init.iters
if (length(fixed.par) > 0)
try_length <- 1
if (model != "EB")
try_theta <- log(seq(exp(min(bounds.default)), exp(max(bounds.default)),
length = try_length))
else try_theta <- (seq((min(bounds.default)), (max(bounds.default)),
length = try_length))
try_LL <- double(length(try_theta))
for (i in 1:length(try_theta)) {
try_LL[i] <- model_LL(try_theta[i])
}
if (plot.LL.surface & !MC)
try({
plot(if (model != "EB")
exp(try_theta)
else try_theta, try_LL)
}, silent = TRUE)
starting.values.default <- try_theta[which.max(try_LL)]
if (MC & length(fixed.par) == 0) {
if (model != "EB")
try_theta <- exp(try_theta)
if (model != "EB")
bounds.default <- exp(bounds.default)
best <- double(round(length(try_theta)/2))
for (i in 1:length(best)) {
best[i] <- BIC(lm(try_LL ~ poly(try_theta, degree = i)))
}
degree <- which.min(best)
LL_surface <- lm(try_LL ~ poly(try_theta, degree = degree))
theta_start <- try_theta[which(predict(LL_surface) ==
max(predict(LL_surface)))][1]
o <- optim(par = theta_start, fn = function(X) predict.lm(LL_surface,
newdata = data.frame(try_theta = X)), control = list(fnscale = -1),
method = "L-BFGS-B", lower = bounds.default[1],
upper = bounds.default[2])
if (plot.LL.surface)
try({
plot(try_theta, try_LL)
points(try_theta, predict.lm(LL_surface), col = "blue")
points(o$par, o$value, col = "red", pch = 16)
}, silent = TRUE)
ret <- model_LL(par = if (model != "EB")
log(o$par)
else o$par, ret_pars = ret.level > 1)
ret$model.par[[rownames(bounds.default)]] <- o$par
if (ret.level > 1 & (model == "OUfixedRoot" | model ==
"OUrandomRoot" | model == "OU")) {
if (nrates.species > 1) {
for (i in 1:nrates.species) ret$phylocov[[i]] <- 2 *
ret$phylocov[[i]] * ret$alpha
}
else ret$phylocov <- 2 * ret$phylocov * ret$alpha
}
}
else {
if (length(fixed.par) > 0) {
o <- list(par = starting.values.default, value = model_LL(starting.values.default))
}
else o <- optim(starting.values.default, model_LL,
control = list(fnscale = -1), method = "L-BFGS-B",
lower = bounds.default[1], upper = bounds.default[2])
ret <- model_LL(par = o$par, ret_pars = ret.level >
1)
if (model != "EB")
o$par <- exp(o$par)
if (ret.level > 1) {
ret$model.par[[rownames(bounds.default)]] <- o$par
if (ret.level > 1 & (model == "OUfixedRoot" |
model == "OUrandomRoot" | model == "OU")) {
if (nrates.species > 1) {
for (i in 1:nrates.species) ret$phylocov[[i]] <- 2 *
ret$phylocov[[i]] * ret$model.par[[1]]
}
else ret$phylocov <- 2 * ret$phylocov * ret$model.par[[1]]
}
}
}
}
else ret <- simple_BM(temp_tree = tree, ditree = ditree,
ret_pars = ret.level > 1)
if (ret.level <= 1)
return(ret)
if (ret.level > 1) {
ret$method <- method
sigma2.mult <- vector("list", nrates.species)
if (nrates.species > 1) {
for (i in 1:nrates.species) {
if (nrates.traits < 2)
sigma2.mult[[i]] <- mean(diag(ret$phylocov[[i]]))
else {
for (j in 1:nrates.traits) {
group_j <- which(trait.groups == trait.group.levels[j])
sigma2.mult[[i]] <- c(sigma2.mult[[i]], mean(diag(ret$phylocov[[i]])[group_j]) *
if (subset) 1 else length(group_j))
}
names(sigma2.mult[[i]]) <- levels(trait.groups)
}
}
names(sigma2.mult) <- levels(species.groups)
}
else {
if (nrates.traits < 2)
sigma2.mult <- mean(diag(ret$phylocov))
else {
sigma2.mult <- double()
for (j in 1:nrates.traits) {
group_j <- which(trait.groups == trait.group.levels[j])
sigma2.mult <- c(sigma2.mult, mean(diag(ret$phylocov)[group_j]) *
if (subset) 1 else length(group_j))
}
names(sigma2.mult) <- levels(trait.groups)
}
}
if (ret.level < 3)
ret$phylocov <- NULL
ret <- c(ret, list(sigma2.mult = sigma2.mult, evo.model.args = evo.model.args))
}
class(ret) <- "evo.model"
return(ret)
}
<bytecode: 0xcad4ef8>
<environment: namespace:phylocurve>
--- function search by body ---
Function evo.model in namespace phylocurve has this body.
----------- END OF FAILURE REPORT --------------
Fatal error: the condition has length > 1
Flavor: r-devel-linux-x86_64-debian-clang
Version: 2.0.9
Check: examples
Result: ERROR
Running examples in ‘phylocurve-Ex.R’ failed
The error most likely occurred in:
> base::assign(".ptime", proc.time(), pos = "CheckExEnv")
> ### Name: K.mult
> ### Title: Test phylogenetic signal (Kmult) using phylogenetic simulation
> ### Aliases: K.mult
>
> ### ** Examples
>
> rand.data <- sim.traits()
> null.model <- evo.model(tree = rand.data$tree,
+ Y = rand.data$trait_data,method = "Pairwise ML")
----------- FAILURE REPORT --------------
--- failure: the condition has length > 1 ---
--- srcref ---
:
--- package (from environment) ---
phylocurve
--- call from context ---
evo.model(tree = rand.data$tree, Y = rand.data$trait_data, method = "Pairwise ML")
--- call from argument ---
if (class(Y) == "data.frame") {
species_col <- match(species.id, colnames(Y))
if (is.na(species_col))
stop("Name of species.id much match a column in Y (if supplying a data frame).")
trait_names <- colnames(Y)
if (trait_names[1] != species.id) {
Y <- data.frame(Y[, species_col], Y[, -species_col, drop = FALSE])
}
colnames(Y) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_Y <- as.matrix(Y[, 2:ncol(Y), drop = FALSE])
rownames(new_Y) <- as.character(Y[, 1])
Y <- new_Y
}
} else if (class(Y) == "matrix") {
if (is.null(rownames(Y))) {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(Y))
if (class(nms) == "list") {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(Y)))
colnames(Y) <- paste("V", 1:ncol(Y), sep = "")
} else if (class(Y) == "numeric") {
if (is.null(names(Y))) {
warning("No species names provided for Y. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(Y))
if (class(nms) == "list") {
warning("Names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
Y <- matrix(data = Y, nrow = nspecies, ncol = 1, dimnames = list(names(Y),
"V1"))
}
}
--- R stacktrace ---
where 1: evo.model(tree = rand.data$tree, Y = rand.data$trait_data, method = "Pairwise ML")
--- value of length: 2 type: logical ---
[1] FALSE FALSE
--- function from context ---
function (tree, Y, fixed.effects = NA, species.groups, trait.groups,
model = "BM", diag.phylocov = FALSE, method = "Pairwise REML",
force.zero.phylocov = character(), species.id = "species",
max.combn = 10000, painted.edges, ret.level = 2, plot.LL.surface = FALSE,
par.init.iters = 50, fixed.par = numeric(), multirate = FALSE,
subset = TRUE, bounds)
{
tree <- reorder(tree, "postorder")
if (length(tree$edge.length) > nrow(tree$edge))
tree$edge.length <- tree$edge.length[1:nrow(tree$edge)]
if (model == "OU")
model <- "OUfixedRoot"
if (missing(species.groups)) {
nrates.species <- 1
species.group.levels <- NA
}
else {
species.groups <- species.groups[match(tree$tip.label,
names(species.groups))]
if (missing(painted.edges)) {
painted.edges <- paint.edges(tree, species.groups)
}
nrates.species <- nlevels(species.groups)
species.group.levels <- levels(species.groups)
}
if (missing(trait.groups)) {
nrates.traits <- 1
trait.group.levels <- NA
}
else {
nrates.traits <- nlevels(trait.groups)
trait.group.levels <- levels(trait.groups)
}
if (multirate == FALSE & nrates.traits > 1) {
multirate <- TRUE
warning("Setting multirate to TRUE because trait.groups was specified.",
immediate. = TRUE)
}
if (method == "Pairwise REML" | method == "Full REML")
REML <- 1
else REML <- 0
evo.model.args <- as.list(environment())
evo.model.args$REML <- evo.model.args$trait.group.levels <- evo.model.args$nrates.traits <- evo.model.args$species.group.levels <- evo.model.args$nrates.species <- NULL
nspecies <- length(tree$tip.label)
nedge <- nrow(tree$edge)
intraspecific <- FALSE
if (class(fixed.effects) == "logical") {
X <- numeric(0)
X1 <- matrix(1, nspecies)
rownames(X1) <- tree$tip.label
}
else {
X <- fixed.effects
if (class(X) == "data.frame") {
species_col <- match(species.id, colnames(X))
if (is.na(species_col))
stop("Name of species.id much match a column in X (if supplying a data frame).")
trait_names <- colnames(X)
if (trait_names[1] != species.id) {
X <- data.frame(X[, species_col], X[, -species_col,
drop = FALSE])
}
colnames(X) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_X <- as.matrix(X[, 2:ncol(X), drop = FALSE])
rownames(new_X) <- as.character(X[, 1])
X <- new_X
}
}
else if (class(X) == "matrix") {
if (is.null(rownames(X))) {
rownames(X) <- tree$tip.label
warning("Row names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(X))
if (class(nms) == "list") {
rownames(X) <- tree$tip.label
warning("Row names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(X)))
colnames(X) <- paste("X", 1:ncol(X), sep = "")
}
else if (class(X) == "numeric") {
if (is.null(names(X))) {
warning("No species names provided for X. Assuming data are in order of tips.",
immediate. = TRUE)
names(X) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(X))
if (class(nms) == "list") {
warning("Names of X do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(X) <- tree$tip.label
}
X <- matrix(data = X, nrow = nspecies, ncol = 1,
dimnames = list(names(X), "X1"))
}
}
X <- X[tree$tip.label, , drop = FALSE]
evo.model.args$fixed.effects <- X
X1 <- cbind(1, X)
}
if (class(Y) == "data.frame") {
species_col <- match(species.id, colnames(Y))
if (is.na(species_col))
stop("Name of species.id much match a column in Y (if supplying a data frame).")
trait_names <- colnames(Y)
if (trait_names[1] != species.id) {
Y <- data.frame(Y[, species_col], Y[, -species_col,
drop = FALSE])
}
colnames(Y) <- c("species", trait_names[-species_col])
if (!intraspecific) {
new_Y <- as.matrix(Y[, 2:ncol(Y), drop = FALSE])
rownames(new_Y) <- as.character(Y[, 1])
Y <- new_Y
}
}
else if (class(Y) == "matrix") {
if (is.null(rownames(Y))) {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
nms <- name.check(phy = tree, data.names = rownames(Y))
if (class(nms) == "list") {
rownames(Y) <- tree$tip.label
warning("Row names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
}
if (is.null(colnames(Y)))
colnames(Y) <- paste("V", 1:ncol(Y), sep = "")
}
else if (class(Y) == "numeric") {
if (is.null(names(Y))) {
warning("No species names provided for Y. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
else {
nms <- name.check(phy = tree, data.names = names(Y))
if (class(nms) == "list") {
warning("Names of Y do not match tip labels of tree. Assuming data are in order of tips.",
immediate. = TRUE)
names(Y) <- tree$tip.label
}
Y <- matrix(data = Y, nrow = nspecies, ncol = 1,
dimnames = list(names(Y), "V1"))
}
}
if (all(complete.cases(Y)))
missing_data <- FALSE
if (ncol(Y) == 1)
if (method == "Pairwise ML")
method <- "Full ML"
else if (method == "Pairwise REML")
method <- "Full REML"
if (!intraspecific & !missing_data) {
Y <- Y[tree$tip.label, , drop = FALSE]
evo.model.args$Y <- Y
ndims <- ncol(Y)
diagndims <- diag(ndims)
diag2 <- diag(2)
if (method == "Full ML" | method == "Full REML") {
MC <- FALSE
}
else {
ncombn <- round(exp(lfactorial(ndims) - (log(2) +
lfactorial(ndims - 2))))
if (ncombn <= max.combn) {
MC <- FALSE
subsets <- matrix(0, 2, ncombn)
counter <- 1
for (r in 1:(ndims - 1)) {
for (s in (r + 1):ndims) {
subsets[, counter] <- c(r, s)
counter <- counter + 1
}
}
}
else {
MC <- TRUE
subsets <- apply(matrix(0, max.combn, 2), 1,
function(X) sample(x = ndims, size = 2, replace = FALSE))
}
}
if (nrates.species == 1) {
simple_BM <- function(temp_tree, ditree, ret_pars = FALSE) {
pY$edge_len <- ditree$edge.length
a_results <- do.call(multipic, pY)
suminvV_and_logdV <- c(a_results[[2]], a_results[[3]])
a <- a_results[[1]]
if (length(X) > 0) {
pX$edge_len <- ditree$edge.length
x_results <- do.call(multipic, pX)
x <- x_results[[1]]
XANC <- x_results$root[1, ]
XX <- crossprod(cbind(0, x)) + tcrossprod(c(1,
XANC)) * suminvV_and_logdV[1]
betas <- solve(crossprod(x), crossprod(x, a))
C <- crossprod(a - x %*% betas)/(nspecies -
REML)
}
else C <- crossprod(a)/(nspecies - REML)
colnames(C) <- rownames(C) <- colnames(Y)
if (ret_pars)
if (length(X > 0)) {
XY <- crossprod(cbind(0, x), a) + tcrossprod(c(1,
XANC), a_results$root[1, ]) * suminvV_and_logdV[1]
BETAS <- solve(XX, XY)
predicted <- X1 %*% BETAS
multipic.results <- list(X.multipic = x_results,
Y.multipic = a_results)
}
else {
predicted <- matrix(1, nspecies) %*% a_results$root[1,
]
multipic.results <- list(Y.multipic = a_results)
}
if (diag.phylocov)
C[upper.tri(C)] <- C[lower.tri(C)] <- 0
diagC <- diag(C)
if (nrates.traits > 1) {
temp_C <- C
for (i in 1:nrates.traits) {
group_i <- which(trait.groups == trait.group.levels[i])
diag(temp_C)[group_i] <- mean(diagC[group_i]) *
if (subset)
1
else length(group_i)
diagC[group_i] <- diag(temp_C)[group_i]
}
temp_C <- matrix(nearPD(x = temp_C, corr = FALSE,
keepDiag = TRUE)$mat, ncol(C), ncol(C))
C <- temp_C
}
else if (multirate) {
diag(C) <- mean(diagC) * if (subset)
1
else ndims
C <- matrix(nearPD(x = C, corr = FALSE, keepDiag = TRUE)$mat,
ncol(C), ncol(C))
diagC <- diag(C)
}
if (length(force.zero.phylocov) > 0) {
other <- (1:ncol(C))[-match(force.zero.phylocov,
colnames(C))]
C[force.zero.phylocov, other] <- C[other, force.zero.phylocov] <- 0
}
if (method == "Full REML" | method == "Full ML") {
const <- (nspecies * ndims - ndims * REML) *
(log(2 * pi))
ndims_logd <- ndims * suminvV_and_logdV[2]
ndims_invV <- ndims * log(suminvV_and_logdV[1])
log_Csub <- determinant(C, logarithm = TRUE)$modulus[[1]]
if (length(X) > 0) {
YY <- sum(tcrossprod(a - x %*% betas, backsolve(chol(C),
diagndims, transpose = TRUE))^2)
if (class(YY) == "try-error")
YY <- sum(diag(solve(C) %*% crossprod(a -
x %*% betas)))
logdetXWX <- determinant(XX)$modulus[[1]] *
ncol(C) - determinant(C)$modulus[[1]] *
(ncol(X) + 1)
}
else {
YY <- try(sum(tcrossprod(a, backsolve(chol(C),
diagndims, transpose = TRUE))^2), silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(C) %*% crossprod(a)))
logdetXWX <- (-log_Csub + ndims_invV)
}
logL <- -(const + (nspecies * log_Csub + ndims_logd) +
REML * logdetXWX + YY)/2
}
else if (method == "Pairwise REML" | method ==
"Pairwise ML") {
const <- (nspecies * 2 - 2 * REML) * (log(2 *
pi))
ndims_logd <- 2 * suminvV_and_logdV[2]
ndims_invV <- 2 * log(suminvV_and_logdV[1])
logL <- 0
if (MC)
subsets <- apply(matrix(0, max.combn, 2),
1, function(X) sample(x = ndims, size = 2,
replace = FALSE))
for (i in 1:ncol(subsets)) {
r <- subsets[1, i]
s <- subsets[2, i]
Csub <- C[c(r, s), c(r, s)]
log_Csub <- log(Csub[1, 1] * Csub[2, 2] -
Csub[1, 2]^2)
if (length(X) > 0) {
try(YY <- sum(tcrossprod(a[, c(r, s)] -
x %*% betas[, c(r, s)], backsolve(chol(Csub),
diag2, transpose = TRUE))^2), silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(Csub) %*% crossprod(a[,
c(r, s)] - x %*% betas[, c(r, s)])))
logdetXWX <- determinant(XX)$modulus[[1]] *
2 - log_Csub * (ncol(X) + 1)
}
else {
try(YY <- sum(tcrossprod(a[, c(r, s)],
backsolve(chol(Csub), diag2, transpose = TRUE))^2),
silent = TRUE)
if (class(YY) == "try-error")
YY <- sum(diag(solve(Csub) %*% crossprod(a[,
c(r, s)])))
logdetXWX <- (-log_Csub + ndims_invV)
}
logL <- logL - (const + (nspecies * log_Csub +
ndims_logd) + REML * logdetXWX + YY)
}
logL <- logL/i * ncombn/2
}
if (ret_pars)
return(list(phylocov = C, logL = logL, predicted = predicted,
transf_tree = temp_tree, multipic.results = multipic.results))
else return(logL)
}
}
else {
ind <- 0L:1L
tempY <- matrix(0, nspecies * 2, 1)
tempY_span <- 1:(nspecies * 2)
simple_BM <- function(temp_tree, ditree, ret_pars = FALSE) {
pY$edge_len <- ditree$edge.length
a_results <- do.call(multipic, pY)
suminvV_and_logdV <- c(a_results[[2]], a_results[[3]])
a <- a_results[[1]]
Y_anc <- a_results$root[1, ]
if (length(X) > 0) {
pX$edge_len <- ditree$edge.length
x_results <- do.call(multipic, pX)
x <- x_results[[1]]
XANC <- x_results$root[1, ]
YANC <- a_results$root[1, ]
XX <- crossprod(cbind(0, x)) + tcrossprod(c(1,
XANC)) * suminvV_and_logdV[1]
betas <- solve(crossprod(x), crossprod(x, a))
XY <- crossprod(cbind(0, x), a) + tcrossprod(c(1,
XANC), YANC) * suminvV_and_logdV[1]
BETAS <- solve(XX, XY)
C <- crossprod(a - x %*% betas)/(nspecies -
REML)
anc <- X1 %*% BETAS
}
else {
anc <- matrix(1, nspecies) %*% a_results$root[1,
]
C <- crossprod(a)/(nspecies - REML)
}
colnames(C) <- rownames(C) <- colnames(Y)
if (ret_pars)
if (length(X > 0)) {
predicted <- anc
multipic.results <- list(X.multipic = x_results,
Y.multipic = a_results)
}
else {
predicted <- anc
multipic.results <- list(Y.multipic = a_results)
}
resid <- fast_transform(vcv(temp_tree)) %*% (Y -
anc)
rownames(resid) <- rownames(Y)
species.subsets <- Clist <- diagClist <- vector("list",
nrates.traits)
for (j in 1:nrates.species) {
species.subsets[[j]] <- which(!is.na(match(species.groups,
species.group.levels[j])))
Clist[[j]] <- t(resid[species.subsets[[j]],
]) %*% resid[species.subsets[[j]], ]/(length(species.subsets[[j]]) -
REML)
if (diag.phylocov)
Clist[[j]][upper.tri(Clist[[j]])] <- Clist[[j]][lower.tri(Clist[[j]])] <- 0
diagClist[[j]] <- diag(Clist[[j]])
if (nrates.traits > 1) {
temp_C <- Clist[[j]]
for (i in 1:nrates.traits) {
group_i <- which(trait.groups == trait.group.levels[i])
diag(temp_C)[group_i] <- mean(diagClist[[j]][group_i]) *
if (subset)
1
else length(group_i)
}
temp_C <- matrix(nearPD(x = temp_C, corr = FALSE,
keepDiag = TRUE)$mat, ncol(Clist[[j]]),
ncol(Clist[[j]]))
Clist[[j]] <- temp_C
diagClist[[j]] <- diag(Clist[[j]])
}
else if (multirate) {
diag(Clist[[j]]) <- mean(diagClist[[j]]) *
if (subset)
1
else length(diagClist[[j]])
Clist[[j]] <- matrix(nearPD(x = Clist[[j]],
corr = FALSE, keepDiag = TRUE)$mat, ncol(Clist[[j]]),
ncol(Clist[[j]]))
diagClist[[j]] <- diag(Clist[[j]])
}
if (length(force.zero.phylocov) > 0) {
other <- which(is.na(match(colnames(Clist[[j]]),
force.zero.phylocov)))
Clist[[j]][force.zero.phylocov, other] <- Clist[[j]][other,
force.zero.phylocov] <- 0
}
if (is.null(temp_tree$root.edge))
temp_tree$edge.length <- c(temp_tree$edge.length[1:nedge],
0)
else temp_tree$edge.length <- c(temp_tree$edge.length[1:nedge],
temp_tree$root.edge)
}
if (method == "Full REML" | method == "Full ML") {
if (length(X) > 0) {
ret <- Rinv5(nspecies = nspecies, nedge = nedge,
edge.length = temp_tree$edge.length, anc = tree$edge[,
1], des = tree$edge[, 2], L = X1, R = Y,
painted.edges = painted.edges, phylocov_list = Clist)
}
else {
ret <- Rinv3(nspecies = nspecies, nedge = nedge,
edge.length = temp_tree$edge.length, anc = tree$edge[,
1], des = tree$edge[, 2], R = Y, painted.edges = painted.edges,
phylocov_list = Clist)
}
if (method == "Full REML")
logL <- ret$ReLogLik
else logL <- ret$LogLik
}
else if (method == "Pairwise REML" | method ==
"Pairwise ML") {
logL <- 0
if (MC)
subsets <- apply(matrix(0, max.combn, 2),
1, function(X) sample(x = ndims, size = 2,
replace = FALSE))
anc_nodes <- temp_tree$edge[, 1] - 1
des_nodes <- temp_tree$edge[, 2] - 1
len_vec <- temp_tree$edge.length
for (i in 1:ncol(subsets)) {
r <- subsets[1, i]
s <- subsets[2, i]
tempC <- lapply(Clist, function(X) X[c(r,
s), c(r, s)])
tempY[tempY_span] <- Y[, c(r, s)]
tempCmat <- matrix(0, 2 * nrates.species,
2)
for (zz in 1:length(tempC)) {
tempCmat[1:2 + 2 * (zz - 1), ] <- tempC[[zz]]
}
if (length(X) > 0) {
ret <- Rinv6(nspecies = nspecies, nedge = nedge,
ngroups = nrates.species, ind = ind,
len_vec = len_vec, anc = anc_nodes, des = des_nodes,
L = X1, R = tempY, painted_edges = painted.edges,
phylocovs = tempCmat, REML = REML)
}
else {
ret <- Rinv4(nspecies = nspecies, nedge = nedge,
ngroups = nrates.species, ind = ind,
len_vec = len_vec, anc = anc_nodes, des = des_nodes,
R = tempY, painted_edges = painted.edges,
phylocovs = tempCmat, REML = REML)
}
logL <- logL + ret
}
logL <- logL/i * ncombn
}
if (ret_pars) {
theta <- matrix(0, ncol(X1), ndims)
for (i in 1:ndims) theta[, i] <- theta_Rinv6(nspecies = nspecies,
nedge = nedge, ngroups = nrates.species,
ind = 0L, len_vec = temp_tree$edge.length,
anc = tree$edge[, 1] - 1, des = tree$edge[,
2] - 1, L = X1, R = Y[, i, drop = FALSE],
painted_edges = painted.edges, phylocovs = matrix(sapply(Clist,
function(X) X[i, i])), REML = REML)
predicted <- X1 %*% theta
}
if (ret_pars)
return(list(phylocov = Clist, logL = logL,
predicted = predicted, transf_tree = temp_tree))
else return(logL)
}
}
}
else {
stop("Missing data and intraspecific observations are not yet supported.")
}
if (!is.binary.tree(tree)) {
binary <- TRUE
ditree <- multi2di(tree, random = FALSE)
}
else {
binary <- FALSE
ditree <- tree
}
pY <- prep_multipic(Y, tree)
if (length(X) > 0)
pX <- prep_multipic(X, tree)
if (model != "BM") {
if (model != "BM")
if ((model == "OUfixedRoot" | model == "OUrandomRoot") &
!is.ultrametric(tree) & nrates.species > 1)
stop("Non-ultrametric trees not currently supported for OU model with multiple species groups.")
dis <- pruningwise.distFromRoot(reorder(tree, "pruningwise"))[1:nspecies]
Tmax <- mean(dis)
bounds.default <- matrix(c(1e-07/Tmax, max(50/Tmax, 5),
1e-07/Tmax, max(50/Tmax, 5), 1e-07, 1, 1e-06, 1,
1e-05, 3, min(-4, -3/Tmax), 0), ncol = 2, byrow = TRUE)
rownames(bounds.default) <- c("alpha", "alpha", "lambda",
"kappa", "delta", "rate")
colnames(bounds.default) <- c("min", "max")
starting.values.default <- c(0.5/Tmax, 0.5/Tmax, 0.5,
0.5, 0.5, -1/Tmax)
if (!missing(bounds)) {
bounds.default[, 1] <- bounds[1]
bounds.default[, 2] <- bounds[2]
if (any(starting.values.default < bounds[1]) | any(starting.values.default >
bounds[1])) {
starting.values.default[1:length(starting.values.default)] <- mean(bounds[1:2])
}
}
names(starting.values.default) <- c("OUrandomRoot", "OUfixedRoot",
"lambda", "kappa", "delta", "EB")
model_i <- match(model, names(starting.values.default))
bounds.default <- bounds.default[model_i, , drop = FALSE]
starting.values.default <- starting.values.default[model_i]
names(starting.values.default) <- rownames(bounds.default)
if (length(fixed.par) > 0) {
plot.LL.surface <- FALSE
bounds.default[1:2] <- rep(fixed.par, 2)
starting.values.default[1] <- fixed.par
}
if (model != "EB" & model != "BM") {
starting.values.default <- log(starting.values.default)
bounds.default <- log(bounds.default)
}
if (model[1] == "BM")
starting.values.default <- bounds.default <- NULL
geiger_args <- list(x = tree, model = if (model == "OUfixedRoot" |
model == "OUrandomRoot") "OU" else model, par = 5)
names(geiger_args)[3] <- names(starting.values.default)
if (model == "EB")
names(geiger_args)[3] <- "a"
if (model == "OUrandomRoot" | model == "OUfixedRoot" |
model == "OU") {
temp_args <- list(phy = tree, model = model, parameters = list(pars = 5))
names(temp_args$parameters) <- names(starting.values.default)
}
model_LL <- function(par, ret_pars = FALSE) {
if (model != "EB")
par <- exp(par)
if (model == "OUrandomRoot" | model == "OUfixedRoot" |
model == "OU") {
temp_args$parameters <- list(alpha = par)
temp_tree <- do.call(transf.branch.lengths, temp_args)$tree
}
else {
geiger_args[[3]] <- par
temp_tree <- do.call(rescale, geiger_args)
}
temp_tree <- reorder(temp_tree, "postorder")
if (!binary)
temp_ditree <- multi2di(temp_tree, random = FALSE)
else temp_ditree <- temp_tree
ret <- try(simple_BM(temp_tree = temp_tree, ditree = temp_ditree,
ret_pars = ret_pars), silent = TRUE)
if (class(ret) == "try-error")
return(-.Machine$double.xmax)
else return(ret)
}
if (MC)
try_length <- max(50, par.init.iters)
else try_length <- par.init.iters
if (length(fixed.par) > 0)
try_length <- 1
if (model != "EB")
try_theta <- log(seq(exp(min(bounds.default)), exp(max(bounds.default)),
length = try_length))
else try_theta <- (seq((min(bounds.default)), (max(bounds.default)),
length = try_length))
try_LL <- double(length(try_theta))
for (i in 1:length(try_theta)) {
try_LL[i] <- model_LL(try_theta[i])
}
if (plot.LL.surface & !MC)
try({
plot(if (model != "EB")
exp(try_theta)
else try_theta, try_LL)
}, silent = TRUE)
starting.values.default <- try_theta[which.max(try_LL)]
if (MC & length(fixed.par) == 0) {
if (model != "EB")
try_theta <- exp(try_theta)
if (model != "EB")
bounds.default <- exp(bounds.default)
best <- double(round(length(try_theta)/2))
for (i in 1:length(best)) {
best[i] <- BIC(lm(try_LL ~ poly(try_theta, degree = i)))
}
degree <- which.min(best)
LL_surface <- lm(try_LL ~ poly(try_theta, degree = degree))
theta_start <- try_theta[which(predict(LL_surface) ==
max(predict(LL_surface)))][1]
o <- optim(par = theta_start, fn = function(X) predict.lm(LL_surface,
newdata = data.frame(try_theta = X)), control = list(fnscale = -1),
method = "L-BFGS-B", lower = bounds.default[1],
upper = bounds.default[2])
if (plot.LL.surface)
try({
plot(try_theta, try_LL)
points(try_theta, predict.lm(LL_surface), col = "blue")
points(o$par, o$value, col = "red", pch = 16)
}, silent = TRUE)
ret <- model_LL(par = if (model != "EB")
log(o$par)
else o$par, ret_pars = ret.level > 1)
ret$model.par[[rownames(bounds.default)]] <- o$par
if (ret.level > 1 & (model == "OUfixedRoot" | model ==
"OUrandomRoot" | model == "OU")) {
if (nrates.species > 1) {
for (i in 1:nrates.species) ret$phylocov[[i]] <- 2 *
ret$phylocov[[i]] * ret$alpha
}
else ret$phylocov <- 2 * ret$phylocov * ret$alpha
}
}
else {
if (length(fixed.par) > 0) {
o <- list(par = starting.values.default, value = model_LL(starting.values.default))
}
else o <- optim(starting.values.default, model_LL,
control = list(fnscale = -1), method = "L-BFGS-B",
lower = bounds.default[1], upper = bounds.default[2])
ret <- model_LL(par = o$par, ret_pars = ret.level >
1)
if (model != "EB")
o$par <- exp(o$par)
if (ret.level > 1) {
ret$model.par[[rownames(bounds.default)]] <- o$par
if (ret.level > 1 & (model == "OUfixedRoot" |
model == "OUrandomRoot" | model == "OU")) {
if (nrates.species > 1) {
for (i in 1:nrates.species) ret$phylocov[[i]] <- 2 *
ret$phylocov[[i]] * ret$model.par[[1]]
}
else ret$phylocov <- 2 * ret$phylocov * ret$model.par[[1]]
}
}
}
}
else ret <- simple_BM(temp_tree = tree, ditree = ditree,
ret_pars = ret.level > 1)
if (ret.level <= 1)
return(ret)
if (ret.level > 1) {
ret$method <- method
sigma2.mult <- vector("list", nrates.species)
if (nrates.species > 1) {
for (i in 1:nrates.species) {
if (nrates.traits < 2)
sigma2.mult[[i]] <- mean(diag(ret$phylocov[[i]]))
else {
for (j in 1:nrates.traits) {
group_j <- which(trait.groups == trait.group.levels[j])
sigma2.mult[[i]] <- c(sigma2.mult[[i]], mean(diag(ret$phylocov[[i]])[group_j]) *
if (subset) 1 else length(group_j))
}
names(sigma2.mult[[i]]) <- levels(trait.groups)
}
}
names(sigma2.mult) <- levels(species.groups)
}
else {
if (nrates.traits < 2)
sigma2.mult <- mean(diag(ret$phylocov))
else {
sigma2.mult <- double()
for (j in 1:nrates.traits) {
group_j <- which(trait.groups == trait.group.levels[j])
sigma2.mult <- c(sigma2.mult, mean(diag(ret$phylocov)[group_j]) *
if (subset) 1 else length(group_j))
}
names(sigma2.mult) <- levels(trait.groups)
}
}
if (ret.level < 3)
ret$phylocov <- NULL
ret <- c(ret, list(sigma2.mult = sigma2.mult, evo.model.args = evo.model.args))
}
class(ret) <- "evo.model"
return(ret)
}
<bytecode: 0x5582e4b92e90>
<environment: namespace:phylocurve>
--- function search by body ---
Function evo.model in namespace phylocurve has this body.
----------- END OF FAILURE REPORT --------------
Fatal error: the condition has length > 1
Flavor: r-devel-linux-x86_64-debian-gcc
Version: 2.0.9
Check: whether package can be installed
Result: ERROR
Installation failed.
Flavor: r-devel-windows-ix86+x86_64-gcc8
Version: 2.0.9
Check: whether package can be installed
Result: WARN
Found the following significant warnings:
Warning: 'rgl_init' failed, running with rgl.useNULL = TRUE
Flavor: r-release-osx-x86_64