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

193 lines
6.7 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}
\subsubsection*{ANOVA vs ANOVA Phylogénétique}
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 indépendants de la
phylogénie.
\item Des données réparties en deux groupes cohérents avec la phylogénie.
\end{itemize}
Pour les simulations qui ne se font pas selon la phylogénie, nous nous attendons
à ce que l'ANOVA classique obtienne de bons résultats puisque c'est une
situation correspondant à l'application du modèle.
Pour les simulations qui se font selon l'information 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", "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")
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)
}
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-alea-prop}).
Enfin pour que notre analyse soit reproductible nous fixons la graine à
\Sexpr{seed}.
\begin{figure}[H]
\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{figure}
\begin{figure}[H]
\centering
<<'plot-groupes-random'>>=
plot_group_on_tree(tree, group = random_groups)
@
\caption{Groupes aléatoires respectant les proportions}
\label{fig:simu-groupes-alea-prop}
\end{figure}
<<'param-simulation'>>=
# Generate data for rat&mus vs the rest
N <- 500
base_values <- c(0, 1)
sigma2_phylo <- 1
sigma2_measure <- 0.1
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
@
Nous re-paramétrisons le modèle, $variance\text{ }totale = \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
variance\text{ }totale$. Et alors $\sigma^2_{measure} = (1-h) \times
variance\text{ }totale$.
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.
<<'simus-results', cache = TRUE, warning = FALSE, fig.cap = "Simulations">>=
for (her in heri) {
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_vs_other = group_mus_rat_vs_other,
random = random_groups),
tree = tree,
base_values = c(0, snr * total_variance),
sigma2_phylo = her * total_variance,
sigma2_measure = (1 - her) * total_variance#,
# REML = TRUE
)
df_sim_plot <- compute_power_typeI(df = sim)
# saveRDS(df_sim_plot, filename)
# } else {
# load(filename)
# }
res_sim_plot <- plot_method_comparison(df_sim_plot, title = paste("Rat&Mus héritabilité ", her))
knitr::knit_print(res_sim_plot)
# saveRDS(sim, filename)
}
@
% <<'simus-plot'>>=
% for (her in heri) {
% filename <- here("data", "simus",
% paste0("real_her_", her, "_seed_", seed, ".Rds"))
% load(filename)
% df_sim_plot <- compute_power_typeI(df = sim)
% res_sim_plot <- plot_method_comparison(df_sim_plot, title = paste("Rat&Mus héritabilité ", her))
% print(res_sim_plot)
% }
% @
\subsubsection*{\emph{REML} contre \emph{Maximum Likelihood}}