Mod Elisation Et M Ethodes Num Eriques Pour Les Sciences Du Vivant. TP1 - Initiation
Mod Elisation Et M Ethodes Num Eriques Pour Les Sciences Du Vivant. TP1 - Initiation
Mod Elisation Et M Ethodes Num Eriques Pour Les Sciences Du Vivant. TP1 - Initiation
TP1 - initiation
Liens utiles pour démarrer :
Site de R : http://www.r-project.org/
R pour les débutants, E. Paradis :
http://cran.r-project.org/doc/contrib/Paradis-rdebuts_fr.pdf
Short-liste instructions :
http://cran.r-project.org/doc/contrib/Short-refcard.pdf
Un éditeur pratique pour les scripts est https://www.rstudio.com/.
Les notes de bas de page fournissent des indications. Si vous êtes déjà familier de R, inutile de faire
l’ensemble du TP : lisez simplement l’énoncé et choisissez les points que vous connaissez moins.
1 Pour commencer
Installer R puis Rstudio. Lancer R : apparait une fenêtre d’exécution avec un prompt, qui permet d’entrer
des commandes. La figure 1 présente les principales caractéristiques de l’interface Rstudio.
1
rm(list=ls())
Les # indiquent des commentaires qui ne sont pas exécutés. L’instruction rm(list=ls()) efface
tous les objets restés éventuellement en mémoire lors d’une session précédente ce qui évite des bugs
possibles.
3. Pour ce premier exemple, inscrivez simplement print ("hello world")
4. Sauvez le fichier dans le répertoire de travail. Généralement on choisit l’extension .r. Si besoin,
pour se placer dans le répertoire dans lequel vous voulez travailler, Divers> Changer de Répertoire
de travail, ou setwd("C:/Documents/...") (=SET Working Directory).
5. L’exécuter : sélectionnez la partie de code à exécuter et cliquez Ctrl + R (ou cmd + entrée sur
mac) ; ou en ligne de commande source(’NomFichier’).
1.3 A l’aide
Pour accéder à l’aide :
— Si le nom de la commande est connu : ?seq ou help(seq), args(seq)
— Sinon : ??sequence, help.search("sequence") ou help.start() =⇒ ouvre aide en ligne : par
exemple, utiliser ‘Search Engine and Keywords’.
Par défaut, la fonction help ne cherche que dans les packages chargés en mémoire. Conseil : il est souvent
utile de lire les exemples et le paragraphe Arguments.
2 Variables
Le type d’une variable est accessible par la commande typeof(). Taper par exemple typeof("toto") ou
typeof(2).
2.1 Vecteurs
Objet atomique, c’est-à-dire d’un type unique. L’attribut de longueur (obtenu avec length(x)) donne son
nombre de composantes. Un peu d’exercice :
1. Créer une variable x qui soit un vecteur de longueur 1 1 et l’afficher 2
2. Créer un vecteur de 4 réels 3 et l’afficher.
3. Peut-on exécuter l’instruction x+1 ?
4. Que renvoie x[-1] ? Comment enlever à x sa dernière composante ?
5. Créer un vecteur composé des nombres entiers 4 de 1 à 20 et l’afficher
6. Que renvoie x*x ?
7. Comment calculer le produit scalaire de x par lui-même ? 5
1. x<-2
2. x ou print(x)
3. x<-c(5.1, 2.4, -3.7, 23.2)
4. x<-1:20
5. Fonction %*%
2
8. Prenons x=1:6. Vérifier que x[c(T, F, F, T, F, T)] renvoie seulement les composantes de x qui
correspondent à des T (True) dans le vecteur donné. Que renvoie x[c(T, F)] ? Et x[c(T, T, F)] 6 ?
9. Créer un vecteur composé de valeurs allant de 6 à 1 avec un pas de -0.5 7 et afficher son plus petit
élément ainsi que son numéro de composante 8 .
10. Créer le vecteur 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 9 et afficher les composantes numéros
6 à 8 10 , puis afficher les composantes dont la valeur est inférieure strictement à 2 ou supérieure
strictement à 2 11 .
11. Taper paste("Figure", 1:5, sep="-") et observer le résultat. (Rappel : R considère les opérations
sur les vecteurs composante par composante)
12. Quelques fonctions statistiques élémentaires sur des vecteurs : testez, que donnent-elles ?
n <- c(15,8,14,12,14,10,18,15,9,5,12,13,12,16)
sort(n) ; sort(unique(n)) ; mean(n) ; var(n) ; sd(n)
range(n) ; quantile(n) ; summary(n) ; hist(n)
manquant <-is.na(notes)
which(manquant)
On souhaite finalement mettre 20 aux élèves manquants. Créer un vecteur new_notes dans lequel les NA
sont remplacés 12 par 20.
2.3 Matrices
Une matrice est aussi un objet atomique, c’est-à-dire dont toutes les valeurs sont de même type (qui peut
être obtenu par la fonction mode(M)). La fonction length(M) renvoie le nombre total d’éléments de la
matrice. Ses dimensions peuvent être obtenues par dim(M).
6. Note : l’index logique est recyclé autant de fois que nécessaire.
7. Fonction seq
8. fonction which.min
9. Fonction rep
10. x[6:8]
11. On peut sélectionner des composantes en mettant un test dans x[test], attention à mettre des parenthèses pour les
priorités
12. Utiliser fonctions replace et which
3
1 2 3 4 13
1. Créér une matrice M =
5 6 7 8
2. Que renvoie M^2 ? M*M ? c(2,3)*M ?
3. Comment calculer P =t M M ? 14
4. Que renvoie apply (P, MARGIN=1, function(x) sum(x)+2) ?
5. Calculer la somme de chacune des colonnes de la matrice P. 15
23x + 31y = 1
6. Résoudre le système 16 :
34x + 46y = 2
2.4 Listes
Une liste est un objet hétérogène : c’est un ensemble ordonné de composantes qui n’ont pas tous le même
type ou la même longueur et qui peuvent avoir un nom. Toutes les fonctions R qui retournent plusieurs
valeurs le font sous la forme d’une liste. Construisez la liste suivante, à partir de la matrice P créée
précédemment :
Maliste<-list(P, 0.5, c("Pluie", "Soleil"))
et affichez-là (observez la façon de dénommer les différents éléments : vous pouvez y accéder par Maliste[[3]]).
Puis rentrez des noms pour chacune des composantes :
names(Maliste)<-c("MatriceP", "Proba", "Météo")
et affichez la composante Météo (en y accédant par son nom 17 ).
4
3 Petits programmes et fonctions
1. Ecrire la fonction 21 triangleEtoile(n) qui génère des étoiles en forme de triangle sur n lignes et
calcule l’‘aire’ (nombre d’étoiles !) du triangle, soit ceci : 22
> triangleEtoile (4)
*
* *
* * *
* * * *
Aire = 10
4 Graphes
1. Admirez les graphes R ! : demo(graphics). Notez que le code correspondant s’affiche en même
temps dans la fenêtre de commande (utile pour prendre exemple).
2. Tracer un graphe de la fonction x3 . 25 26
3. Représenter y en fonction de x avec :
x<-c(-1, -0.25, 0 , 0.25 , 1, 0.25, 0, -0.25, -1)
y<-c(0 , -0.25, -1, -0.25, 0, 0.25, 1, 0.25, 0)
4. Chercher comment obtenir les options suivantes : tracer des symboles en triangle reliés par des
lignes 27 , de couleur rouge, et changer les labels des axes. Ajouter un titre. Ajouter un point 28 en
(0,0) de symbole * et de taille 5. Ajouter une légende 29 .
5. Représenter 4 graphes sur une seule sortie : l’objet par. Consultez l’aide sur cet objet pour en
connaitre les attributs :
par(mfrow=c(2,2))
for(i in 1:4){
# Graphe n°i (par exemple changer le type de symbole,
#et le titre avec paste("Titre", i, sep=""))
}
21. triangleEtoile <- function( nombre )
22. Vous pouvez utiliser cat ("\n",rep("*",i)) avec une boucle for (i in 1: n) sur i
23. Ceci afin de vous familiariser avec le traitement des valeurs par défaut, ce qui permet aussi d’identifier rapidement dans
les fichiers d’aide sur une fonction, quels sont les arguments ayant des valeurs par défaut.
24. Toute variable définie dans une fonction est locale
25. plot(xˆ3 ∼ x)
26. Si nécessaire, pour créer une nouvelle fenêtre graphique : commande windows() (sous windows), quartz sous Mac, x11
Linux.
27. Voir type, pch
28. Fonction points
29. legend. Remarque : legend("topleft", ...) permet de placer la légende en haut à gauche (et de même aux autres
coins)
5
Enfin, utilisez la commande text(locator(1), "Stars") pour placer le mot ”‘Stars”’ quelque
part sur le dernier graphe (plot en cours) 30 . L’onglet Export de Rstudio permet d’enregistrer le
plot (ou bien par la commande png, par exemple ; ne pas oublier en ce cas dev.off() pour clore
l’export).
Exemple de résultat :
De nombreuses fonctions permettent de simuler des tirages de variables aléatoires selon différentes lois de
probabilité : rnorm et runif, mais aussi beta, binom, cauchy, chisq, exp, f, gamma, geom, hyper, lnorm,
logis, nbinom, pois, t, weibull et wilcox... Les fonctions de densité associées sont avec un d au début,
par exemple dnorm, dbeta, ... A vous :
— Tracer le tirage de 100 points selon une loi uniforme sur [−2, 1]
— Tracer la densité d’une loi normale centrée réduite sur [−5, 5]
dS
= −µ · S + ν · (S + I + R) − βc · I · S
dt
dI
= −µ · I + βc · I · S − γ · I
dt
dR
= −µ · R + γ · I
dt
où :
la variable S(t) représente le nombre d’individus sains ou susceptibles, de valeur initiale S0 = 199
la variable I(t) représente le nombre d’individus infectés, de valeur initiale I0 = 1
la variable R(t) représente le nombre d’individus guéris et immunisés, de valeur initiale R0 = 0
30. Note : cette commande locator peut aussi être très utile pour placer une légende sur un graphe
6
X le paramètre µ = 0.178 représente le taux de natalité
X le paramètre ν = 0.178 représente le taux de mortalité
X le paramètre γ = 0.1 représente le taux de guérison
X le paramètre βc = 0.003 représente le taux de contamination par individu infecté
On veut obtenir une simulation de ce système sur 5 ans avec un pas de temps d’1 mois.
1. Charger le package deSolve.
2. La syntaxe de la fonction ode est la suivante :
sol <- ode(init, timeline, deriv, par, method="lsoda")
Pour l’utiliser, compléter les définitions des différents arguments appelés ici :
Valeurs initiales du vecteur de variables, dont les noms sont réutilisés dans la solution : init
<- c("S"=..., ).
X Vecteur des paramètres : par <- c("betac"=0.003, ...)
Vecteur des temps auxquels on souhaite obtenir les valeurs numériques simulées : years = 5 ;
timeline <- seq(...)
La fonction qui, à un temps t donné, renvoie les valeurs numériques des dérivées de chaque
variable, dans le même ordre que celui choisi dans le vecteur d’initialisation init :
deriv <- function(t,var,par)
{
with(as.list(c(var, par)), {
# le "with" permet d’éviter la lourdeur d’écriture qu’on aurait sans lui : - par
deriS <- - mu * S + nu * (S+I+R) - betac*I * S
deriI <- ...
...
list(c(deriS, deriI, deriR))
})
}
Résoudre l’ODE, visualiser le tableau de résultats 31 et afficher les courbes des variables S, I, R
au cours du temps 32 avec une légende.
3. Tester votre simulation en la comparant à une solution analytique obtenue pour un cas particulier
de valeurs de paramètres. Une bonne habitude à garder ! Par exemple, on peut prendre ici : βc =
0, γ = 0, µ = 0.48, ν = 0.378.
4. Avec les valeurs de paramètres de la question précédente, comparer les simulations obtenues en
mettant en argument de ode soit method="euler" soit method="rk4". Laquelle est ”la bonne” ?
On reverra ça dans le TP ’ODE et Bioréacteur”.
7
Figure 2 – Paragraphe introductif de l’article de Vendrely & Vendrely de 1948 qui est à l’origine du terme
de valeur C pour désigner la taille d’un génome.
8
N= ... # Nombre de tirages pour chaque variable
# remplir une matrice contenant tous les tirages, une colonne pour chaque variable Xi :
X = matrix(runif(N*NbX, 0, 1), ncol=...)
6.3 Modèles à base de systèmes de fonctions itérées pour des formes végétales
Les fractales, ici générées par des systèmes de fonctions itérées (IFS), sont connues pour générer des formes évoquant
des végétaux. Nous allons voir ici que cette représentation atteint ses limites dès lors qu’il s’agit de représenter la
dynamique de la croissance d’une plante.
1. Créer un IFS permettant de générer une forme de fougère, ainsi que décrit par le modèle ci-dessous (Utiliser
le fichier IFS params.r sur edunao pour la matrice de paramètres).
x(n + 1) = a · x(n) + b · y(n) + e
y(n + 1) = c · x(n) + d · y(n) + f
où a, b, c, d, e, f ∈ R prennent leur valeurs aléatoirement parmi les 4 vecteurs suivants :
# vecteur 1 vecteur 2 vecteur 3 vecteur 4
a=c( 0.0 , 0.2 , -0.15 , 0.85)
b=c( 0.0, -0.26 , 0.28 , 0.04)
c=c( 0.0 , 0.23 , 0.26 , -0.04)
d=c( 0.16, 0.22 , 0.24 , 0.85)
e=c( 0.0 , 0.0 , 0.0 , 0.0)
f=c( 0.0 , 1.6 , 0.44 , 1.6)
2. Afficher la fougère.
3. Visualiser la construction de la fougère en choisissant les vecteurs dans l’ordre suivant :
(a) 100 itérations avec le vecteur 4
(b) 1 itération avec le vecteur 1
(c) 1 itération avec le vecteur 2
(d) 100 itérations avec le vecteur 4
Qu’observez-vous ? Quel est le rôle de chacun des vecteurs de paramètres ? Ce type de modèle est-il compatible
avec la représentation de la croissance d’une fougère ?
4. En fait, on peut calculer des probabilités permettant de minimiser le nombre d’itérations : ces probabilités
valent 0.01, 0.07, 0.07, 0.85 pour chacun des vecteurs de paramètres repectivement. Construire l’IFS corres-
pondant.
5. Construire l’IFS défini par le même système que précédemment et prenant cette fois ses valeurs dans :
# set 1 set 2 set 3 set 4
a=c(0.0100, -0.0100, 0.4200, 0.4200)
b=c(0.0000, 0.0000, -0.4200, 0.4200)
c=c(0.0000, 0.0000, 0.4200, -0.4200)
d=c(0.45000, -0.4500, 0.4200, 0.4200)
e=c(0.0000, 0.0000, 0.0000, 0.0000)
f=c(0.0000, 0.4000, 0.4000, 0.4000)
Afficher le résultat. Utiliser l’option col=rainbow(length(x)) pour visualiser par des couleurs l’ordre dans
lequel les points sont tracés.
Ainsi, si l’objectif est de représenter la croissance de la structure d’une plante, il vaudra mieux se tourner
vers d’autres formalismes comme les automates, les grammaires formelles ou les L-systèmes.
9
6.4 Analyse de données
On s’intéresse aux poids de poulpes femelles aux stades adultes (si si !). Nous disposons pour cela d’un échantillon
de données de 240 poulpes femelles pêchées au large des côtés mauritaniennes. Nous souhaitons connaitre, pour la
population mère, une estimation du poids moyen et un intervalle de confiance pour cette moyenne au seuil de 95%.
6.5 Pour aller plus loin : Packages ggplot2, Rmarkdown, tcl/tk, Shiny
Dans ggplot2, un graphe comporte 3 composantes :
— data, les données elles-mêmes
— Aesthetics : tout ce qui concerne les couleurs, les tailles, les formes, les labels mais aussi quelles données
doivent être considérées en x et en y par exemple
— Geometry : les options concernant les types de graphique (plot, histogramme, heatmap, boxplot, etc)
Ces différents éléments vont être combinés dans un objet à partir duquel on va pouvoir faire les représentations
dans une fenêtre graphique ou dans un fichier. Et lorsque l’on voudra changer la couleur ou la forme ou le type de
graphique il suffira de modifier ce paramètre dans l’objet sans avoir besoin de toucher aux autres puis de faire à
nouveau la représentation graphique.
En reprenant les données du fichier genome.txt, utiliser les fonctions ggplot et geom_boxplot pour tracer log(ValeurC)
pour chaque espèce.
Créer une mini-interface graphique en utilisant le package tcltk2 ou shiny permettant de poser la question à l’uti-
lisateur de tracer ou pas le graphe.
10
Figure 3 – Tableau des types de points (pch) pour les graphes
11