D´eveloppement logiciel Master 1 Biostat / MIND
Dur´ee : 2h00
Les notes de cours et l’aide de Rsont autoris´ees.
Une tr`es grande importance sera port´ee sur la r´edaction de vos codes. Ainsi usez (abusez ?) de
commentaires dans votre code, choisissez de bons noms pour vos variables, veillez `a l’indenta-
tion. . . (ceci pour avoir une meilleure note)
Retenez que chaque figure devra ˆetre consciencieusement r´ealis´ee. Vous voil`a pr´evenu ! ! !
Vous me remettrez votre code sur une cl´e USB et le nom de votre fichier sera de la forme
Nom-Pr´enom.R (au format Rou RMarkdown selon vos pr´ef´erences).
Exercice 1 (R´einventons la roue nomm´ee ”hist”).
Le but (extrˆemement motivant) de cet exercice est de faire un histogramme par nos propres moyens
et de comparer notre impl´ementation `a celle fournie de base par R via la fonction hist.
a) Faites une fonction R qui pour un ´echantillon x1, . . . , xndonn´e et des classes c1= (a0, a1), c2=
(a1, a2), . . . , ck= (ak1, ak), calcule les effectifs pr´esents dans chaque classe.
b) Importez les donn´ees disponibles via le lien suivant
http://lib.stat.cmu.edu/DASL/Datafiles/ceodat.html
et testez votre fonction d´evelopp´ee en a) pour voir si elle semble correcte.
c) Faites une fonction qui trace un histogramme de statisticien et testez votre fonction sur les
donn´ees de salaire import´ees en b).
d) Comparez votre r´esultat `a celui obtenu par la fonction hist de R. Eventuellement conclure sur
votre niveau en R.
Conseil et contraintes : la fonction rect pourra vous ˆetre utile. Cependant il est interdit d’uti-
liser la fonction table de Rpour cet exercice.
> effectifs <- function(data,classes){
+ n.classes <- length(classes) -1
+ ans <- rep(NA, n.classes)
+for (i in 1:n.classes)
+ ans[i] <- sum((data >classes[i]) &(data <= classes[i+1]), na.rm =TRUE)
+return(ans)
+}
>
> data <- read.table("CEOSalaries.txt",header =TRUE,skip =12,
+na.string ="*")
>
>effectifs(data$SAL, seq(0,1200,by =100))
[1] 2 5 18 13 4 6 3 4 3 0 0 1
1
> myhist <- function(data,classes,xlab ="X"){
+ eff <- effectifs(data, classes)
+## Calculs pour un histogramme d'aire 1 car on est des stateux !!!!
+ hauteurs <- eff /(length(data) *diff(classes))
+plot(0,xlim =range(classes), ylim =c(0,max(hauteurs)), type ="n",
+xlab = xlab, ylab ="Densite")
+rect(classes[-length(classes)], rep(0,length(classes)-1),
+ classes[-1], hauteurs)
+}
>
> classes <- seq(0,1200,by =100)
>par(mfrow =c(1,2))
>myhist(data$SAL, classes, xlab ="Salaire")
>hist(data$SAL, classes, freq =FALSE,main ="",xlab ="Salaire")
0 200 400 600 800 1000 1200
0.0000 0.0010 0.0020 0.0030
Salaire
Densite
Salaire
Density
0 200 400 600 800 1000 1200
0.0000 0.0010 0.0020 0.0030
>## On obtient pareil et nous sommes trop fort en R !!!
Exercice 2 (Un algorithme bien connu en stats !).
L’algorithme de Metropolis–Hastings est largement utilis´e en statistique. Cet algorithme permet
de g´en´erer une chaˆıne de Markov {Xt:t0}dont la loi stationnaire est impos´ee `a l’avance.
Nous allons ici utiliser cet algorithme afin de g´en´erer des variables al´eatoires selon une loi
Normale centr´ee r´eduite. Voici une version de cet algorithme.
1. Prendre un ´etat initial X0pour la chaine de Markov et fixez la longueur Nde la chaˆıne `a
g´en´erer ;
2. Pour t= 0, . . . , N 2 faire :
a) Simuler un ´etat candidat XXt+U(0.5,0.5) ;
2
b) Calculer la probabilit´e d’acceptation de ce candidat
α(XtX) = min 1,ϕ(X)
ϕ(Xt),
o`u ϕ(·) repr´esente la densit´e de probabilit´e d’une N(0,1).
c) Poser
Xt+1 =(X,avec probabilit´e α(XtX)
Xt,avec probabilit´e 1 α(XtX).
3. Renvoyez la chaˆıne {Xt:t= 0, . . . , N 1}.
a) Cr´eez une fonction Rimpl´ementant l’algorithme d´ecrit plus haut.
b) Ex´ecutez votre algorithme avec N= 20000 et tracez un histogramme sur les 10000 derniers
´etats de la chaˆıne. Superposez la densit´e de probabilit´e d’une N(0,1) sur cet histogramme.
Concluez ?
Astuce : Pour g´en´erer une variable al´eatoire donn´ee par
Y=(a, avec probabilit´e p
b, avec probabilit´e 1p,
il suffit simplement de g´en´erer UU(0,1) et poser Y=asi U < p et Y=bsinon.
> mh <- function(N,init =0){
+ chain <- rep(NA, N)
+ chain[1]<- init
+for (i in 1:(N-1)){
+ prop <- chain[i] +runif(1,-0.5,0.5)
+ alpha <- min(1,dnorm(prop) /dnorm(chain[i]))
+if (runif(1)<alpha)
+ chain[i+1]<- prop
+else
+ chain[i+1]<- chain[i]
+}
+return(chain)
+}
>
> chain <- mh(20000)
>hist(chain[-(1:9999)], freq =FALSE,main ="",xlab ="x",
+ylim =c(0,1/sqrt(2*pi)))
>plot(dnorm, from =-4,to =4,col ="orange",add =TRUE)
3
x
Density
−3 −2 −1 0 1 2 3
0.0 0.1 0.2 0.3 0.4
Exercice 3 (Urnes d’Ehrenfest).
Les urnes d’Ehrenfest est un mod`ele probabiliste fortement li´e au mouvement des particules. Nous
allons l’´etudier sous sa forme puces et chiens ...
Deux chiens M´edor et Rosco se partagent Npuces dans le sens o`u chaque matin au r´eveil une
des Npuces est tir´ee au hasard et change alors de chien.
Math´ematiquement cela pourrait s’´ecrire ainsi. Soit {Xt:t0}le nombre de puces de Rosco
au matin du t-`eme jour.
a) Cr´eez une fonction dont le but est de simuler la dynamique des puces sur M´edor et Rosco .
Votre fonction prendra comme arguments : le nombre de puces N, le nombre de puces ini-
tialement sur Rosco NRosco ainsi que le nombre de jours Tpour notre recensement de
puces.
b) Faites tourner votre fonction pour N= 100, T= 2 ×365 et NRosco = 50 afin de repr´esenter
graphiquement l’´evolution du nombre de puces sur Rosco au cours du temps.
> ehrenfest <- function(nb.puces =100,puces.rosco =0.5 *nb.puces,
+duree =2*365){
+ rosco <- 1:puces.rosco
+ ans <- rep(NA, duree +1)
+ ans[1]<- puces.rosco
+for (i in 1:duree){
+ puce.idx <- sample(nb.puces, 1)
+if (puce.idx %in% rosco)
+ rosco <- rosco[rosco != puce.idx]
+else
4
+ rosco <- c(rosco, puce.idx)
+ ans[i+1]<- length(rosco)
+}
+return(ans)
+}
>
> nb.puces <- 100
> nb.puces.rosco <- 0.5 *nb.puces
> duree <- 2*365
>
> ans <- ehrenfest(nb.puces, nb.puces.rosco, duree)
>plot(ans, type ="h",xlab ="Jours",ylab ="Nombre de puces sur Rosco",
+ylim =c(0, nb.puces))
0 200 400 600
0 20 40 60 80 100
Jours
Nombre de puces sur Rosco
5
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !