mirror of
https://github.com/Polarolouis/anova-phylogenetique-projet-msv.git
synced 2026-06-17 18:25:25 +02:00
299 lines
No EOL
13 KiB
Text
299 lines
No EOL
13 KiB
Text
<< 'knitr_options-simu', echo = FALSE>>=
|
||
knitr::opts_knit$set(fig.pos = "HT", fig.width = 6, fig.height = 6,
|
||
fig.align = "center", warnings = FALSE, echo = FALSE, format = "latex")
|
||
|
||
@
|
||
% Simu: Plusieurs design, tailles etc
|
||
% On sait la vérité, on peut connaitre les vrais positifs etc
|
||
% Qu'est ce qu'on prend en entrées qu'est ce qu'on veut en sortie
|
||
|
||
% Bien insister sur l'arbre d'entrée et l'objectif de la simu : quelle approche pour mieux détecter les gènes différentiellement exprimés.
|
||
|
||
% Simulations :
|
||
% \begin{itemize}
|
||
% \item soit selon l'arbre des données
|
||
% \item soit partir sur regarder l'impact de la taille de l'arbre etc.
|
||
% \end{itemize}
|
||
|
||
Dans cette partie nous souhaitons comparer les résultats de l'ANOVA et de
|
||
l'ANOVA phylogénétique classique, avec approximation de Satterthwaite et avec le
|
||
\emph{Likelihood ratio test}.
|
||
Pour cela nous allons simuler des données selon plusieurs modalités et évaluer
|
||
l'\emph{erreur de première espèce} et la \emph{puissance} obtenue.
|
||
|
||
\begin{itemize}
|
||
\item Des données réparties en deux groupes au hasard par rapport à la
|
||
phylogénie.
|
||
\item Des données réparties en deux groupes cohérents avec la phylogénie.
|
||
\end{itemize}
|
||
|
||
|
||
En sélectionnant des espèces de manière aléatoire, nous cassons la structure
|
||
induite par la phylogénie. Nous nous attendons donc à ce que l'ANOVA réalise de
|
||
meilleurs résultats que l'ANOVA Phylogénétique en ne prenant pas en compte
|
||
l'information phylogénétique.
|
||
|
||
Pour les simulations avec des groupes respectant la structure de l'arbre
|
||
phylogénétique, nous nous attendons à ce que l'ANOVA phylogénétique
|
||
parvienne à mieux prendre en compte l'information apportée par la phylogénie et
|
||
à démêler son effet.\\
|
||
|
||
<<'modules-simulations', include = FALSE, eval=TRUE>>=
|
||
necessary_simu <- c("ape", "remotes", "phylolm", "phylolimma", "phytools",
|
||
"latex2exp", "here")
|
||
|
||
if (any(!(necessary_simu %in% installed.packages()))){
|
||
install.packages(necessary_simu)
|
||
remotes::install_github("lamho86/phylolm", quiet = TRUE)
|
||
remotes::install_github("pbastide/phylolimma", quiet = TRUE)
|
||
}
|
||
|
||
library("ape")
|
||
library("phylolm")
|
||
library("phytools")
|
||
library("here")
|
||
library("tidyverse")
|
||
library("ggplot2")
|
||
library("patchwork")
|
||
library("latex2exp")
|
||
source(here("R","utils.R"))
|
||
@
|
||
|
||
<<'Import-arbre'>>=
|
||
K <- 2
|
||
|
||
nb_species <- 43
|
||
|
||
plot_group_on_tree <- function(tree, groups, ...) {
|
||
plot(tree, ...)
|
||
tiplabels(bg = groups, pch = 21, cex = 1.5)
|
||
}
|
||
tree <- read.tree(here("R","chen2019.tree"))
|
||
# Normalising tree edge length
|
||
taille_tree <- diag(vcv(tree))[1]
|
||
tree$edge.length <- tree$edge.length / taille_tree
|
||
@
|
||
|
||
<<'simus-groupes'>>=
|
||
seed <- 1234
|
||
set.seed(seed)
|
||
# Mus et Rat vs le reste
|
||
group_mus_rat_vs_other <- sapply(1:nb_species, function(tip) {
|
||
if (tip %in% getDescendants(tree = tree, 55)) {
|
||
return(1)
|
||
}
|
||
return(2)
|
||
})
|
||
|
||
rng_species <- c("chimp", "bonobo", "human", "orangutan", "marmoset",
|
||
"musMusculus", "rat", "dog", "ferret", "cow", "opossum")
|
||
random_groups <- rowSums(sapply(rng_species,
|
||
function(spec) grepl(spec, tree$tip.label)))
|
||
random_groups[random_groups == 0] <- 2
|
||
|
||
#sample(1:K, nb_species, replace = TRUE, prob = c(16, 27))
|
||
@
|
||
|
||
Pour faire nos simulations dans un contexte proche du cas réel nous allons
|
||
utiliser l'arbre présenté sur la figure~\ref{fig:arbre-chen2019}.
|
||
|
||
Nous choisissons de diviser les espèces en deux groupes.
|
||
Pour le groupe respectant la phylogénie, on a d'un côté les espèces
|
||
du genre \emph{Mus} avec les rats et les autres espèces dans un autre groupe
|
||
(voir la figure~\ref{fig:simu-groupes-mus}).
|
||
|
||
% DONE Choisir les espèces à la main et mettre les réplicats dans le même groupe
|
||
% on attribue aléatoirement les individus à l'un des deux groupes
|
||
Et pour le groupe ne respectant pas la phylogénie, nous avons sélectionnés les
|
||
espèces en respectant les proportions des groupes définis
|
||
avant afin de rendre les résultats comparables (voir la
|
||
figure~\ref{fig:simu-groupes-prop}).
|
||
Enfin pour que notre analyse soit reproductible nous fixons la graine à
|
||
\Sexpr{seed}.
|
||
|
||
\begin{figure}[H]
|
||
\begin{subfigure}[H]{0.49\textwidth}
|
||
\centering
|
||
<<'plot-groupes-mus'>>=
|
||
plot_group_on_tree(tree, group = group_mus_rat_vs_other)
|
||
@
|
||
\caption{Groupes \emph{Mus} et rats contre les autres}
|
||
\label{fig:simu-groupes-mus}
|
||
\end{subfigure}
|
||
\begin{subfigure}[H]{0.49\textwidth}
|
||
\centering
|
||
<<'plot-groupes-random'>>=
|
||
plot_group_on_tree(tree, group = random_groups)
|
||
@
|
||
\caption{Groupes sélectionnés sans respect de la phylogénie.}
|
||
\label{fig:simu-groupes-prop}
|
||
\end{subfigure}
|
||
\caption{Arbre et groupes pour les simulations}
|
||
\label{fig:arbres-groupes}
|
||
\end{figure}
|
||
|
||
<<'param-simulation'>>=
|
||
# Generate data for rat&mus vs the rest
|
||
N <- 500
|
||
risk_threshold <- 0.05
|
||
|
||
## Standardized parameters
|
||
total_variance <- 1.0 # sigma2_phylo + sigma2_error, fixed [as tree_height = 1]
|
||
heri <- c(0.3, 0.5, 0.7, 0.9) # heritability her = sigma2_phylo / total_variance. 0 means only noise. 1 means only phylo.
|
||
snr <- 1 # signal to noise ratio snr = size_effect / total_variance
|
||
@
|
||
|
||
Afin d'avoir un paramètre unique à faire varier, nous re-paramétrisons le
|
||
modèle, la variance totale $v_{tot}$ suit la relation
|
||
$v_{tot} = \sigma^2_{phylo} +
|
||
\sigma^2_{measure} = \Sexpr{total_variance} $.
|
||
Nous allons faire prendre à $h$, défini comme l'héritabilité, les valeurs $h
|
||
\in (\Sexpr{heri})$. L'héritabilité est liée à $\sigma^2_{phylo}$ et $\sigma^2_{phylo} = h\times
|
||
v_{tot}$. Et alors $\sigma^2_{measure} = (1-h) \times
|
||
v_{tot}$. Ainsi, $h = 0$ signifie qu'il y a seulement du bruit, et $h = 1$
|
||
seulement de l'information phylogénétique.
|
||
|
||
Pour les valeurs quantitatives des 2 groupes, nous avons 2 valeurs différentes :
|
||
\begin{align}
|
||
\mu_1 = 0, & & \mu_2 = snr \times v_{tot} = \frac{taille\text{ }d'effet}{\cancel{v_{tot}}} \times \cancel{v_{tot}} = \Sexpr{snr} \label{eq:simus-base-values}
|
||
\end{align}
|
||
|
||
\emph{Note :} \emph{snr} signifie \emph{signal noise ratio} et comme indiqué est
|
||
donc le rapport entre la taille d'effet et la variance totale. Et dans
|
||
l'équation~\ref{eq:simus-base-values}, $\mu_1$ et $\mu_2$
|
||
correspondent aux $\beta_1$ et $\beta_2$ définis dans la
|
||
sous-section~\ref{subsec:anova-phylogenetique}.
|
||
|
||
Pour chaque valeur d'héritabilité, nous allons générer $\Sexpr{N}$ jeux de données
|
||
différents sur lesquels les méthodes sont utilisées avec les valeurs définies
|
||
dans l'équation~\ref{eq:simus-base-values}.
|
||
|
||
<<'simus-results', warning = FALSE, fig.pos = "H", fig.cap = "Erreur de type I et puissance pour les simulations en faisant varier l'héritabilité", fig.subcap = paste0("$h = ", heri, "$"), fig.ncol = 2, out.width='.49\\linewidth'>>=
|
||
|
||
plot_list <- lapply(seq_len(length(heri)), function(idx)
|
||
{
|
||
her <- heri[idx]
|
||
filename <- here("data", "simus",
|
||
paste0("real_her_", her, "_seed_", seed, ".Rds"))
|
||
if (!file.exists(filename)) {
|
||
sim <- N_simulation_typeI_power(N,
|
||
groups_list = list(RatMus = group_mus_rat_vs_other,
|
||
Sélectionnés = random_groups),
|
||
tree = tree,
|
||
base_values = c(0, snr * total_variance),
|
||
sigma2_phylo = her * total_variance,
|
||
sigma2_measure = (1 - her) * total_variance#,
|
||
# REML = TRUE
|
||
)
|
||
saveRDS(sim, filename)
|
||
}
|
||
|
||
sim <- readRDS(filename)
|
||
|
||
df_sim_plot <- compute_power_typeI(df = sim)
|
||
res_sim_plot <- plot_method_comparison(df_sim_plot)
|
||
res_sim_plot
|
||
})
|
||
for(plot in plot_list) {
|
||
print(plot)
|
||
}
|
||
@
|
||
|
||
Sur toutes les sous-figures de la figure~\ref{fig:simus-results}, les étiquettes
|
||
A présentent les erreurs de type I commises par les méthodes et les étiquettes B
|
||
présentent les puissances des mêmes méthodes.
|
||
|
||
\subsubsection*{Analyse pour les groupes respectant la phylogénie}
|
||
% Analyses des erreurs de type I
|
||
|
||
\paragraph*{Analyse des erreurs de type I}
|
||
L'erreur de type I est particulièrement importante à contrôler, en effet elle
|
||
indique le nombre de faux positifs et l'on veut pouvoir en déterminer le seuil
|
||
$\alpha$ avec comme seuil classique $0.05$.
|
||
|
||
% DONE Insister sur pourquoi trop de faux-positifs pour l'ANOVA classique, du fait
|
||
% de la structure Brownienne, deux clades peuvent être éloignés au niveau temporel
|
||
% beaucoup de génération. En oubliant la structure, on peut vouloir mettre un saut
|
||
% alors que l'écart est simplement dû à de la dérive.
|
||
% L'ANOVA suppose des données iid ce qui n'est pas le cas ici.
|
||
Nous constatons que dans le cas des groupes respectant la phylogénie, l'ANOVA
|
||
a une erreur de type I très forte dans toutes les simulations.
|
||
Pour l'expliquer nous avons deux interprétations principales.
|
||
Tout d'abord, l'ANOVA suppose des observations indépendantes et identiquement
|
||
distribuées et les en accord avec la phylogénie ne respectent pas cette
|
||
hypothèse.
|
||
De plus, n'ayant pas l'information de la dérive génétique
|
||
sous-jacente, elle ne peut pas différencier ce qui est dû à la dérive et à de
|
||
vraies différences entre les groupes.
|
||
C'est la raison de son fort de taux de faux-positifs pour les
|
||
groupes qui respectent la structure phylogénétique.
|
||
|
||
Par exemple, deux clades peuvent être éloignés à cause de leur éloignement
|
||
temporel. L'oubli de la structure peut suggérer de mettre un saut alors que cet
|
||
éloignement est seulement dû à la dérive.
|
||
|
||
Pour les autres méthodes, elles ont toutes tendances à avoir de forts taux de
|
||
faux-positifs, exceptée l'ANOVA phylogénétique REML avec approximation de
|
||
Satterthwaite qui respectent le seuil de 5\% dans toutes nos conditions.
|
||
|
||
Nous remarquons qu'en général, plus l'héritabilité augmente et plus les méthodes incluant
|
||
l'information phylogénétique contrôle l'erreur de première espèce.
|
||
|
||
% DONE Important de préciser qu'il faut contrôler l'erreur de type I car les
|
||
% manips coûtent très cher.
|
||
|
||
\paragraph*{Importance de l'erreur de type I} Nous insistons particulièrement
|
||
sur le contrôle de l'erreur de type I, car dans
|
||
le cadre des analyses de données transcriptomiques cette phase d'analyse
|
||
statistique permet d'identifier des gènes différentiellement exprimés et pouvant
|
||
donc potentiellement intervenir dans des réseaux de gènes d'intérêt.
|
||
|
||
Une fois les gènes identifiés il faut faire des expériences qui sont
|
||
particulièrement onéreuses et donc on ne souhaite pas faire des expériences
|
||
"pour rien".
|
||
|
||
\paragraph*{Analyse des puissances} Le revers de la médaille se fait sentir sur
|
||
les puissances. La méthode d'ANOVA phylogénétique REML avec approximation de
|
||
Sattertwhaite, a les puissances les plus faibles de toutes les méthodes, ce qui
|
||
fait sens, étant plus conservatrice elle sélectionne moins.
|
||
Et nous observons donc que les méthodes avec les puissances les plus fortes sont
|
||
le LRT et l'ANOVA.
|
||
|
||
\paragraph*{REML vs Maximum Likelihood (ML)} D'après nos simulations, les
|
||
méthodes utilisant le REML contrôle toujours mieux
|
||
l'erreur de première espèce que les méthodes utilisant le maximum de
|
||
vraisemblance. Les paramètres de variance étant mieux estimés dans ce cas, ce
|
||
résultat est cohérent avec les résultats classiques sur le REML.
|
||
Mais à cause de ce meilleur contrôle, les méthodes REML ont donc des puissances
|
||
plus faible, comme décrit plus haut.
|
||
|
||
\subsubsection*{Analyse pour les groupes choisis}
|
||
|
||
Nous analysons ici les groupes sélectionnés pour ne pas respecter la phylogénie.
|
||
Ils correspondent aux barres de couleurs bleues sur la
|
||
figure~\ref{fig:simus-results}
|
||
|
||
\paragraph*{Analyse des erreurs de type I}
|
||
Toutes les erreurs de types sont proches d'être sous la barre des 5\%. Les
|
||
méthodes qui ne sont pas sous les 5\% sont l'ANOVA et le LRT\footnote{Ainsi que
|
||
pour les valeurs d'héritabilité de $h = 0.7$ et $h=0.9$ l'ANOVA phylogénétique
|
||
et l'ANOVA phylogénétique avec approximation de Satterthwaite, qui sont
|
||
légèrement au-dessus. Un point intéressant à remarquer est que leurs
|
||
contreparties utilisant le REML ne présentent pas ces problèmes.}.
|
||
Cela indique peut-être que malgré notre sélection que nous avons souhaité
|
||
la plus aléatoire possible\footnote{Cela en respectant la contrainte de ne pas
|
||
séparer les individus d'une même espèce.}, nous n'avons peut-être pas
|
||
cassé toute la structure phylogénétique existante. Il faudrait investiguer avec
|
||
d'autres simulations.
|
||
|
||
\paragraph*{Analyse des puissances}
|
||
Comme l'on pouvait s'y attendre cette fois-ci toutes les puissances sont
|
||
relativement élevées. Nous remarquons que la méthode la plus puissante est
|
||
l'ANOVA phylogénétique REML avec approximation de Satterthwaite.
|
||
Aux vues du doute émis au paragraphe précédent cela pourrait être dû à la
|
||
persistance d'une structure phylogénétique.
|
||
|
||
\paragraph*{REML vs Maximum Likelihood (ML)}
|
||
Ici aussi les méthodes REML contrôlent mieux l'erreur de type I mais fait
|
||
intéressant elles obtiennent aussi de meilleures puissances. Cela pourrait être
|
||
dû au fait que leur estimation de la variance est meilleure. |