Nothing
## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(echo = TRUE)
hook_output <- knitr::knit_hooks$get("output")
knitr::knit_hooks$set(output = function(x, options) {
if (!is.null(n <- options$out.lines)) {
x <- xfun::split_lines(x)
if (length(x) > n) {
# truncate the output
x <- c(head(x, n), "....\n")
}
x <- paste(x, collapse = "\n")
}
hook_output(x, options)
})
##
### Load packages here:
##
### Figure counter:
(
function() {
log <- list(
labels = character(),
captions = character()
)
list(
register = function(label, caption) {
log$labels <<- c(log$labels, label)
log$captions <<- c(log$captions, caption)
invisible(NULL)
},
getNumber = function(label) {
which(log$labels == label)
},
getCaption = function(label) {
a <- which(log$labels == label)
cap <- log$captions[a]
cat(sprintf("Fig. %d. %s\n\n---\n",a,cap))
invisible(NULL)
}
)
}
)() -> figCounter
## ----load_package-------------------------------------------------------------
library(MPSEM)
## ----load_data----------------------------------------------------------------
data(perissodactyla,package="caper")
## ----plot_phylogeny, echo=FALSE, fig.height=4, fig.width = 7------------------
par(mar=c(2,2,2,2))
plot(perissodactyla.tree)
par(mar=c(5,4,4,2))
figCounter$register(
"theTree",
"The phylogenetic tree used for this example."
)
## ----plot_phylogeny_cap, echo=FALSE, results='asis'---------------------------
figCounter$getCaption("theTree")
## ----data_table, echo=FALSE, results="latex"----------------------------------
knitr::kable(perissodactyla.data[,c(1L,2L,4L)])
## ----droping_species----------------------------------------------------------
match(
perissodactyla.tree$tip.label,
perissodactyla.data[,1L]
) -> spmatch
drop.tip(
perissodactyla.tree,
perissodactyla.tree$tip.label[is.na(spmatch)]
) -> perissodactyla.tree
## ----check_order--------------------------------------------------------------
cbind(perissodactyla.tree$tip.label, perissodactyla.data[,1L])
## ----re-order_species---------------------------------------------------------
match(
perissodactyla.tree$tip.label,
perissodactyla.data[,1L]
) -> spmatch
perissodactyla.data[spmatch,] -> perissodactyla.data
all(perissodactyla.tree$tip.label == perissodactyla.data[,1L])
## ----change_rownames----------------------------------------------------------
perissodactyla.data[,1L] -> rownames(perissodactyla.data)
perissodactyla.data[,-1L] -> perissodactyla.data
## ----re-arranged_data, echo=FALSE, results="latex"----------------------------
knitr::kable(perissodactyla.data[,c(1L,3L)])
## ----training_testing_datasets------------------------------------------------
perissodactyla.data[-1L,,drop=FALSE] -> perissodactyla.train
perissodactyla.data[1L,,drop=FALSE] -> perissodactyla.test
drop.tip(
perissodactyla.tree,
tip = "Dicerorhinus sumatrensis"
) -> perissodactyla.tree.train
## ----display_weighting, echo=FALSE, fig.height=5, fig.width = 7---------------
par(mar=c(4.5,4.5,1,7) + 0.1)
d <- seq(0, 2, length.out=1000)
a <- c(0,0.33,0.67,1,0.25,0.75,0)
psi <- c(1,1,1,1,0.65,0.65,0.4)
cc <- c(1,1,1,1,1,1,1)
ll <- c(1,2,2,2,3,3,3)
trial <- cbind(a, psi)
colnames(trial) <- c("a","psi")
ntrials <- nrow(trial)
nd <- length(d)
matrix(
NA,
ntrials,
nd,
dimnames=list(paste("a=", trial[,"a"], ", psi=", trial[,"psi"], sep=""),
paste("d=", round(d,4), sep=""))
) -> w
for(i in 1:ntrials)
w[i,] <- MPSEM::PEMweights(d, trial[i,"a"], trial[i,"psi"])
plot(NA, xlim=c(0,2), ylim=c(0,1.6), ylab="Weight", xlab="Distance", axes=FALSE)
axis(1, at=seq(0,2,0.5), label=seq(0,2,0.5))
axis(2, las=1)
text(expression(paste(~~~a~~~~~~~psi)),x=2.2,y=1.57,xpd=TRUE,adj=0)
for(i in 1:ntrials) {
lines(x=d, y=w[i,], col=cc[i], lty=ll[i])
text(paste(sprintf("%.2f", trial[i,1]), sprintf("%.2f",trial[i,2]), sep=" "),
x=rep(2.2,1), y=w[i,1000], xpd=TRUE, adj=0)
}
rm(d,a,psi,cc,ll,trial,ntrials,nd,w,i)
figCounter$register(
"edgeWeighting",
paste(
"Output of the edge weighting function for different sets of parameters",
"$a$ and $\\psi$."
)
)
## ----display_weighting_cap, echo=FALSE, results='asis'------------------------
figCounter$getCaption("edgeWeighting")
## ----convert_to_graph---------------------------------------------------------
Phylo2DirectedGraph(
perissodactyla.tree.train
) -> perissodactyla.pgraph
## ----graph_storage,echo=FALSE-------------------------------------------------
str(perissodactyla.pgraph)
## ----tree_labelled, fig.height=5, fig.width = 7-------------------------------
perissodactyla.tree.train -> tree
paste("N",1L:tree$Nnode) -> tree$node.label
par(mar=c(2,2,2,2))
plot(tree,show.node.label=TRUE)
edgelabels(
1L:nrow(tree$edge),
edge=1L:nrow(tree$edge),
bg="white",
cex=0.75
)
## ----tree_labelled_cap, echo=FALSE, results='asis'----------------------------
figCounter$register(
"trainingTree",
"The labelled training species tree for this example."
)
figCounter$getCaption("trainingTree")
## ----set_param----------------------------------------------------------------
rep(0,attr(perissodactyla.pgraph,"ev")[1L]) -> steepness
rep(1,attr(perissodactyla.pgraph,"ev")[1L]) -> evol_rate
steepness[15L:21] <- 0.25
evol_rate[15L:21] <- 2
steepness[9L:13] <- 0.8
evol_rate[9L:13] <- 0.5
## ----calculate_PEM------------------------------------------------------------
PEM.build(
perissodactyla.pgraph,
d="distance",
sp="species",
a=steepness,
psi=evol_rate
) -> perissodactyla.PEM
## ----Eigenvector_example, fig.height=4, fig.width=7.5-------------------------
layout(matrix(c(1,1,1,2,2,3,3),1L,7L))
par(mar=c(5.1,2.1,4.1,2.1))
## Singular vectors are extracted using the as.data.frame method:
as.data.frame(perissodactyla.PEM) -> perissodactyla.U
plot(perissodactyla.tree.train, x.lim=60, cex=1.5)
plot(y = 1L:nrow(perissodactyla.train), ylab="", xlab = "Loading",
x = perissodactyla.U[,1L], xlim=0.5*c(-1,1),
axes=FALSE, main = expression(bold(v)[1]), cex=1.5)
axis(1)
abline(v=0)
plot(y = 1L:nrow(perissodactyla.train), ylab="", xlab = "Loading",
x = perissodactyla.U[,5L], xlim=0.5*c(-1,1),
axes=FALSE, main = expression(bold(v)[5]), cex=1.5)
axis(1)
abline(v=0)
## ----Eigenvector_example_cap, echo=FALSE, results='asis'----------------------
figCounter$register(
"eigenvectorExample",
"Example of two eigenvectors obtained from the training species phylogeny."
)
figCounter$getCaption("eigenvectorExample")
## ----PEM_opt1-----------------------------------------------------------------
PEM.fitSimple(
y = perissodactyla.train[,"log.neonatal.wt"],
x = NULL,
w = perissodactyla.pgraph,
d = "distance",
sp="species",
lower = 0,
upper = 1
) -> perissodactyla.PEM_opt1
## ----PEM_opt2-----------------------------------------------------------------
PEM.fitSimple(
y = perissodactyla.train[,"log.neonatal.wt"],
x = perissodactyla.train[,"log.female.wt"],
w = perissodactyla.pgraph,
d = "distance",
sp="species",
lower = 0,
upper = 1
) -> perissodactyla.PEM_opt2
## ----build_PEM_models---------------------------------------------------------
lmforwardsequentialAICc(
y = perissodactyla.train[,"log.neonatal.wt"],
object = perissodactyla.PEM_opt1
) -> lm1
summary(lm1)
lmforwardsequentialAICc(
y = perissodactyla.train[,"log.neonatal.wt"],
x = perissodactyla.train[,"log.female.wt",drop=FALSE],
object = perissodactyla.PEM_opt2
) -> lm2
summary(lm2)
## ----make_prediction----------------------------------------------------------
getGraphLocations(
perissodactyla.tree,
targets = "Dicerorhinus sumatrensis"
) -> perissodactyla.loc
predict(
object = perissodactyla.PEM_opt2,
targets = perissodactyla.loc,
lmobject = lm2,
newdata = perissodactyla.test,
interval = "prediction",
level = 0.95) -> pred
## ----cross-validation---------------------------------------------------------
data.frame(
perissodactyla.data,
predictions = NA,
lower = NA,
upper = NA
) -> perissodactyla.data
jackinfo <- list()
for(i in 1L:nrow(perissodactyla.data)) {
jackinfo[[i]] <- list()
getGraphLocations(
perissodactyla.tree,
targets = rownames(perissodactyla.data)[i]
) -> jackinfo[[i]][["loc"]]
PEM.fitSimple(
y = perissodactyla.data[-i,"log.neonatal.wt"],
x = perissodactyla.data[-i,"log.female.wt"],
w = jackinfo[[i]][["loc"]]$x
) -> jackinfo[[i]][["PEM"]]
lmforwardsequentialAICc(
y = perissodactyla.data[-i,"log.neonatal.wt"],
x = perissodactyla.data[-i,"log.female.wt",drop=FALSE],
object = jackinfo[[i]][["PEM"]]
) -> jackinfo[[i]][["lm"]]
predict(
object = jackinfo[[i]][["PEM"]],
targets = jackinfo[[i]][["loc"]],
lmobject = jackinfo[[i]][["lm"]],
newdata = perissodactyla.data[i,"log.female.wt",drop=FALSE],
interval = "prediction",
level = 0.95
) -> predictions
unlist(predictions) -> perissodactyla.data[i, c("predictions", "lower", "upper")]
}
rm(i, predictions)
## ----plot_pred_obs, echo=FALSE, fig.height=7, fig.width=7---------------------
par(mar=c(5,5,2,2)+0.1)
range(
perissodactyla.data[,"log.neonatal.wt"],
perissodactyla.data[,c("predictions","lower","upper")]
) -> rng
plot(NA, xlim = rng, ylim = rng, xlab = "observed", ylab = "Predicted",
asp = 1, las = 1)
points(
x = perissodactyla.data[,"log.neonatal.wt"],
y = perissodactyla.data[,"predictions"]
)
abline(0,1)
arrows(
x0 = perissodactyla.data[,"log.neonatal.wt"],
x1 = perissodactyla.data[,"log.neonatal.wt"],
y0 = perissodactyla.data[,"lower"],
y1 = perissodactyla.data[,"upper"],
length = 0.05,
angle = 90,
code = 3
)
figCounter$register(
"crossPreds",
paste(
"Leave-one-out crossvalidated prediction of the neonatal weight for",
nrow((perissodactyla.data)),
"odd-toed ungulate species."
)
)
## ----plot_pred_obs_cap, echo=FALSE, results='asis'----------------------------
figCounter$getCaption("crossPreds")
## ----influence_matrix---------------------------------------------------------
InflMat(perissodactyla.pgraph) -> res
res
## ----PEM_updater--------------------------------------------------------------
PEM.updater(object = perissodactyla.PEM, a = 0, psi = 1) -> res
res
## ----forcedSimple-------------------------------------------------------------
PEM.forcedSimple(
y = perissodactyla.train[,"log.neonatal.wt"],
x = perissodactyla.train[,"log.female.wt"],
w = perissodactyla.pgraph,
a = steepness,
psi = evol_rate
) -> res
res
## ----get_scores---------------------------------------------------------------
Locations2PEMscores(
object = perissodactyla.PEM_opt2,
gsc = perissodactyla.loc
) -> scores
scores
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.