## ---- label="load", message=FALSE---------------------------------------------
library(PhylogeneticEM)

## ---- label="Simus_tree", eval = FALSE----------------------------------------
#  set.seed(17920902)
#  ntaxa = 80
#  tree <- TreeSim::sim.bd.taxa.age(n = ntaxa, numbsim = 1, lambda = 0.1, mu = 0,
#                                   age = 1, mrca = TRUE)[[1]]

## ----label="Simus_tree_int", echo=FALSE---------------------------------------
set.seed(17920902)
ntaxa = 80
if (!requireNamespace("TreeSim", quietly = TRUE)) {
  tree <- ape::rphylo(n = ntaxa, birth = 0.1, death = 0, T0 = 1)
  tree$edge.length <- tree$edge.length / max(ape::vcv(tree))
} else {
  tree <- TreeSim::sim.bd.taxa.age(n = ntaxa, numbsim = 1, lambda = 0.1, mu = 0,
                                   age = 1, mrca = TRUE)[[1]]
}

## ---- label="Parameters"------------------------------------------------------
params <- params_process("OU",                             ## Process
                         p = 2,                            ## Dimension
                         variance = diag(0.5, 2, 2) + 0.5, ## Rate matrix
                         selection.strength = 3,           ## Selection Strength
                         random = TRUE,                    ## Root is random
                         stationary.root = TRUE,           ## Root is stationary
                         edges = c(16, 81, 124),           ## Positions of the shifts
                         values = cbind(c(5, 4),           ## Values of the shifts
                                        c(-4, -5),
                                        c(5, -3)))

## ---- fig.show='hold', fig.height=3, fig.width=3.4----------------------------
plot(params, phylo = tree, traits = 1, value_in_box = TRUE, shifts_bg = "white")
plot(params, phylo = tree, traits = 2, value_in_box = TRUE, shifts_bg = "white")

## ---- label="Simu_process", message=FALSE-------------------------------------
sim <- simul_process(params, tree)

## ---- label="extraction"------------------------------------------------------
data <- extract(sim,             ## The simul_process object
                what = "states", ## We want the actual values
                where = "tips")  ## Only at the tips of the tree

## ---- label="rownames"--------------------------------------------------------
rownames(data) <- c("A", "B")

## ---- fig.show='hold', fig.height=4, fig.width=7------------------------------
plot(params, phylo = tree, data = data)

## -----------------------------------------------------------------------------
nMiss <- floor(ntaxa * 2 * 0.1)                       ## 10% of missing data
miss <- sample(1:(2 * ntaxa), nMiss, replace = FALSE) ## sample missing randomly
chars <- (miss - 1) %% 2 + 1                          ## Trace back rows and columns
tips <- (miss - 1) %/% 2 + 1
for (i in 1:nMiss){
  data[chars[i], tips[i]] <- NA                       ## Forget some values
}

## ---- label="Fit_EM", warning=FALSE, eval = FALSE-----------------------------
#  ## Grid on alpha
#  alpha_grid <- c(1, 3)
#  
#  ## Run algorithm
#  res <- PhyloEM(phylo = tree,
#                 Y_data = data,
#                 process = "scOU",                   ## scalar OU model
#                 random.root = TRUE,                 ## Root is stationary (true model)
#                 stationary.root = TRUE,
#                 alpha = alpha_grid,                 ## On a grid of alpha
#                 K_max = 10,                         ## Maximal number of shifts
#                 parallel_alpha = TRUE,              ## This can be set to TRUE for
#                 Ncores = 2)                         ## parallel computations
#  res

## ----label="Fit_EM_int", echo=FALSE, warning = FALSE--------------------------
## Grid on alpha
alpha_grid <- c(1, 3)
## Run algorithm
res <- PhyloEM(phylo = tree,
               Y_data = data,
               process = "scOU",                   ## scalar OU model
               random.root = TRUE,                 ## Root is stationary (true model)
               stationary.root = TRUE,
               alpha = alpha_grid,                 ## On a grid of alpha
               K_max = 10,                         ## Maximal number of shifts
               parallel_alpha = FALSE)              ## This can be set to TRUE for
res

## ---- fig.show='hold', fig.height=4, fig.width=7, warning=FALSE---------------
plot(res)

## ---- fig.show='hold', fig.height=4, fig.width=4, warning=FALSE---------------
plot_criterion(res)

## ---- eval=FALSE--------------------------------------------------------------
#  plot(res, params = params_process(res, method.selection = "DDSE"))

## ---- fig.show='hold', fig.height=4, fig.width=7, warning=FALSE---------------
plot(res, params = params_process(res, K = 3, alpha = 1))

## -----------------------------------------------------------------------------
params_process(res, K = 3, alpha = 1)$shifts
params_process(res, K = 3, alpha = 3)$shifts

## -----------------------------------------------------------------------------
params_6 <- params_process(res, K = 6)

## ---- fig.show='hold', fig.height=4, fig.width=8, warning=FALSE---------------
plot(equivalent_shifts(tree, params_6))

