anova-phylogenetique-projet.../Rnw/simulations-methodes.Rnw

299 lines
No EOL
13 KiB
Text
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<< '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.