mirror of
https://github.com/Polarolouis/anova-phylogenetique-projet-msv.git
synced 2026-06-17 18:25:25 +02:00
109 lines
3.3 KiB
R
109 lines
3.3 KiB
R
library(ggplot2)
|
|
library(dplyr)
|
|
|
|
# # Number of BM indep coordinates
|
|
# N <- 1000
|
|
# time_delta <- 0.5
|
|
|
|
generate_brownian_motion_traj <- function(N, time_delta, variance = 1) {
|
|
# BM indep vector
|
|
bm_indep <- rnorm(N, mean = 0, sqrt(time_delta * variance))
|
|
|
|
# The trajectory
|
|
bm_traj <- cumsum(bm_indep)
|
|
time_serie <- cumsum(rep(time_delta, N))
|
|
|
|
return(data.frame(time_serie = time_serie, bm_traj = bm_traj))
|
|
}
|
|
|
|
# bm_traj_and_time <- generate_brownian_motion_traj(N, time_delta, 1)
|
|
|
|
# # Plotting
|
|
# ggplot(bm_traj_and_time) +
|
|
# aes(x = time_serie, y = bm_traj) +
|
|
# geom_hline(aes(yintercept = 0, color = "red")) +
|
|
# geom_line()
|
|
|
|
# # Generate multiple BM
|
|
# n <- 100
|
|
# multiple_BM <- do.call(rbind, lapply(seq(1, n, 1), function(idx) {
|
|
# data <- generate_brownian_motion_traj(N, time_delta)
|
|
# data$id <- rep(idx, N)
|
|
# data <- data[, c(3, 1:2)]
|
|
# return(data)
|
|
# }))
|
|
|
|
# ## Plotting multiple BMs
|
|
# ggplot(multiple_BM) +
|
|
# aes(x = time_serie, y = bm_traj, group = as.factor(id), alpha = 0.5) +
|
|
# geom_hline(aes(yintercept = 0, color = "red")) +
|
|
# geom_line()
|
|
|
|
# For phylogenic tree
|
|
|
|
generate_phylo_tree <- function(n_tips, N, time_delta) {
|
|
# Les instants
|
|
time_serie <- cumsum(rep(time_delta, N))
|
|
|
|
# Instants de spéciations
|
|
spec_times <- sort(sample(seq(1:N - 10), n_tips, replace = TRUE))
|
|
|
|
# Choisir la branche dont on se sépare, au premier choix 1 seule, au second 2
|
|
branche_orig_spec <- sapply(
|
|
seq_len(length(spec_times)),
|
|
function(nb_choix) sample(seq(1, nb_choix - 1), size = 1)
|
|
)
|
|
|
|
# On ajoute alors la première espèce
|
|
spec_times <- c(0, spec_times)
|
|
|
|
# Les trajectoires
|
|
liste_spec_traj <- lapply(seq_len(length(spec_times)), function(idx) {
|
|
generate_brownian_motion_traj(
|
|
N = N - spec_times[idx],
|
|
time_delta = time_delta
|
|
)[["bm_traj"]]
|
|
})
|
|
|
|
phylo_tree_data <- data.frame(
|
|
id_branche = factor(),
|
|
time = numeric(), traj = numeric(), is_spec_time = logical()
|
|
)
|
|
|
|
# Pour la construction récursive de l'arbre
|
|
for (idx in seq_len(length(liste_spec_traj)-1)) {
|
|
# Les k pas manquants
|
|
k <- spec_times[idx]
|
|
|
|
if (k == 0) {
|
|
current_data <- data.frame(
|
|
id_branche = rep(
|
|
idx,
|
|
length(liste_spec_traj[[idx]])
|
|
),
|
|
time = time_serie, traj = liste_spec_traj[[idx]], is_spec_time = rep(FALSE, N)
|
|
)
|
|
} else {
|
|
base <- phylo_tree_data[phylo_tree_data[["id_branche"]] == (branche_orig_spec[[idx]]),"traj"][1:k]
|
|
if(anyNA(base)){
|
|
print(spec_times[[idx]])
|
|
print(phylo_tree_data$id_branche)
|
|
print(branche_orig_spec[[idx]])
|
|
}
|
|
traj <-
|
|
# On prend la dernière valeur avant div qu'on ajoute à la
|
|
# trajectoire
|
|
c(base, tail(base, n = 1) + liste_spec_traj[[idx]])
|
|
current_data <- data.frame(
|
|
id_branche = rep(idx, N),
|
|
time = time_serie, traj = traj, is_spec_time = (time_serie == time_serie[k])
|
|
)
|
|
}
|
|
|
|
phylo_tree_data <- rbind(phylo_tree_data, current_data)
|
|
}
|
|
|
|
return(phylo_tree_data)
|
|
}
|
|
|
|
# debug(generate_phylo_tree)
|