Cours distributions et lois de probabilités, tutoriel & guide de travaux pratiques en pdf.
Structures de controle et programmation
Il est possible de recourir aux structures de controle habituelles :
{ for (initialisation) [instruction] { if (instruction) [instruction]
{ while (instruction) do [instruction]
Elles sont utiles lorsqu’il s’agit de repeter une serie d’operations identiques sur des objets differents.
La possibilite de creer ses propres fonctions etend les fonctionnalites de base du langage R. La syntaxe est relativement simple, et s’apparente beaucoup a celle de Matlab. Par exemple, il n’existe pas de fonction standard permettant de calculer un ecart-type non-corrige3. On peut creer alors sa propre fonction :
ety <- function(x) {
ss <- 0
n <- length(x)
for (i in 1:n) {
ss <- ss + (x[i]-mean(x))^2
}
ety <- sqrt(ss/n)
return(ety)
}
En Matlab, la m^eme fonction s’ecrirait ainsi :
function out = ety(x)
ss = 0;
n = length(x);
for i=1:n
= ss + (x(i)-mean(x))^2;
end
out = sqrt(ss/n);
Mais on peut pro ter du mode de representation vectoriel des donnees et ainsi eviter le procede d’iterations :
ety2 <- function(x) sqrt(sum((x-mean(x))^2)/length(x))
ou
ety2 <- function(data) {
stopifnot(length(x)>0)
b <- data-mean(data)
return(as.vector(sqrt(b%*%b/length(b))))
}
3A noter que c’est valable pour d’autres logiciels (e.g. Excel, Statistica, SPSS) qui, par defaut, calculent toujours un ecart-type de population, c’est-a-dire avec un denominateur a n 1.
R ne possede pas non plus de fonction permettant de calculer l’erreur-type p
(s= (n)). On peut en de nir une de la maniere suivante :
se <- function (x) { sd(x)/sqrt(length(x)) }
De m^eme, on peut calculer une moyenne arithmetique apres suppression des valeurs atypiques, i.e. superieures a 2 ecarts-type de la moyenne4 :
clmean <- function (x) {
m <- mean(x)
d <- sqrt(var(x))
threshold <- 2
mean(x[(x-m)/d<threshold])
}
On pourra comparer les resultats des deux moyennes sur l’estimation de la tendance centrale d’un echantillon aleatoire normalement distribue de taille 100 :
- a<-c(rnorm(100),5)
- mean(a)
- clmean(a)
En n, une autre mesure de tendance centrale communement utilisee est la mediane, qui est la valeur qui partage l’e ectif en deux sous-e ectifs egaux. Bien entendu, il existe une fonction median sous R. Pour se familiariser avec les structure de contr^ole (branchement conditionnel de type if…else), on peut essayer de la reprogrammer soi-m^eme, par exemple :
med<-function(x) {
odd.even<-length(x)%%2
if (odd.even == 0) (sort(x)[length(x)/2]+sort(x)[1+ length(x)/2])/2 else sort(x)[ceiling(length(x)/2)]
}
Creation et importation de donnees
On a deja vu comment creer des vecteurs a l’aide de la commande c(). La fonction scan() permet de creer de la m^eme maniere un vecteur, soit en lisant une serie de valeurs contenues dans un chier, soit en saisissant ses elements l’un apres l’autre dans la console (il faut alors utiliser la syntaxe valeurs <- scan(’’)).
Il y a plusieurs methodes pour importer des donnees contenues dans un chier texte. La fonction read.table() est la plus utilisee. Elle permet de
4On notera que cette notion d’atypicalite en termes d’ecarts-type n’est justi ee que dans le cas d’une distribution quasi-normale (i.e. sans asymetrie notable) ; le cas echeant, il vaut mieux considerer comme indicateur d’extr^emalite la distance a la mediane (1:5 (Q3 Q1)), comme le fait par defaut la fonction boxplot().
lire un chier de donnees comportant eventuellement un en-t^ete (il faut alors speci er l’option header=T) et des donnees presentees sous forme tabulaire. Les donnees peuvent ainsi ^etre contenues dans une variable qui est ensuite transformee en data.frame, comme dans l’exemple suivant :
- a <- read.table(’file1.dat’, header=T)
- df <- data.frame(a$Score,as.factor(a$Group))
- names(a.df) <- c(« Score », »Group »)
- summary(a.df)
- attach(a.df)
- summary(Score[Group==1])
- summary(Score[Group==2])
- tapply(Score,Group,sd)
Les options d’importation (type de delimiteur, codage des valeurs man-quantes, etc.) sont nombreuses, comme on peut le voir dans l’aide en ligne en tapant ?read.table. La librarie foreign fournit egalement des fonctions d’importation de donnees au format Statistica, SPSS, SAS, ou bien conte-nues dans des bases de donnees ODBC ou SQL (voir library(help=’foreign’)).
Distributions et lois de probabilites
Lois de probabilites
L’un des inter^ets de R est que l’on peut generer tres facilement des sequences de nombres suivant une distribution de probabilite (discrete ou continue) precise, entre autres : binomiale, 2,exponentielle, F de Fisher-Snedecor, log-normale, logistique, normale, poisson, t de Student, uniforme, Weibull. R peut non seulement generer de tels echantillons, mais il fournit egalement les tables de probabilites associees. On peut ainsi lire les quan-tiles de la loi normale (e.g. qnorm(.95)), ou bien obtenir les probabilites de depasser une certaine valeur pour une loi de Student (e.g. 1-pt(1.81,df=10)). De maniere generale, pour chaque distribution on retrouve quatre fonctions pre xees par les lettres d, p, q et r5, suivie du nom abrege de la loi (e.g. norm pour la loi normale) et donnant respectivement :
{ (d) les valeurs de la fonction de densite de la loi,
{ (p) la probabilite (i.e. la surface sous la courbe) associee a cette fonction de densite,c’est-a-dire les valeurs de la fonction de repartition, pour un intervalle donne (e.g. ] 1; q0]),
{ (q) la valeur correspondant a une probabilite donnee (c’est l’operation inverse au cas precedent6),
{ (r) la generation d’un echantillon aleatoire de taille quelconque issu de cette loi.
Il s’agit ici de distributions univariees, mais on dispose egalement des fonctions dmvnorm, pmvnorm et rmvnorm pour des distributions multivariees.
6On peut le veri er en comparant les valeurs qnorm(0.975) et pnorm(1.96).
Cela permet d’une part de faire des etudes de simulation, d’autre part de generer rapidement des vecteurs de donnees issues d’une certaine loi { comme la loi normale, tres utilisee en sciences humaines et sociales { pour aborder certains concepts cles des statistiques.
C’est ce deuxieme aspect que nous allons privilegier par la suite, en essayant d’introduire les notions de base de la statistique descriptive et inferentielle. En e et, pour cette derniere, il ne faut pas oublier que le concept cle est la notion de distribution d’echantillonnage (cf. [4], chap. 5), et que (( faire )) de l’inference consiste a se prononcer sur la generalisation possible a la population parente d’un e et observe sur un echantillon. E ectuer un test d’hypothese ne consiste en rien d’autre que regarder la position d’une statistique de test (e.g. une di erence de moyenne pour le t de Student, un rapport de variance pour le F de Fisher-Snedecor) par rapport a une position de reference (typiquement celle correspondant a une probabilite de 5%), a partir de laquelle on considere qu’obtenir un tel echantillon releve du hasard (d’echantillonnage).
Loi uniforme
La fonction runif() permet de generer des series de nombres aleatoires, tires d’une loi uniforme ; on a donc un generateur de nombres pseudo-aleatoires (( classique )) :
> runif(5)
[1] 0.5948152 0.2722563 0.7051001 0.3123071 0.3180319
On pourrait ainsi creer un vecteur de nombres au hasard prenant comme valeur 0 ou 1, en ecrivant par exemple :
- x <- runif(100)
- for (i in 1:length(x)) { if (x[i] <= 0.5) x[i]=0
else x[i]=1
}
ou encore, en pro tant de la souplesse de la syntaxe R
- x[x<=0.5] <- 0
- x[x>0.5] <- 1
On peut ensuite veri er la proportion de 1 en tapant length(x[x==1])/length(x). Mais en fait, on peut se passer de cet arti ce puisque l’on peut generer di-rectement des sequences de nombres tires d’une loi binomiale.
Loi binomiale
La loi binomiale est derivee de l’epreuve de Bernoulli qui modelise la pro-babilite p de succes pour un evenement possedant deux resultats possibles, et generalise cette loi de l’alternative a k evenements (P (k) = Cnkpk(1 p)n k).
L’exemple classique d’utilisation de ce type de loi est le jeu du pile ou face. Imaginons que vous disposiez d’une piece et que vous vous demandiez si elle est baisee ou non. Vous prevoyez de la lancer 10 fois. A partir de quelle proportion relative d’essais face/pile considererez-vous que la piece est truquee ? Si la piece n’est pas truquee, le nombre de (( pile )) suit une loi binomiale :
- plot(dbinom(0:10,rep(10,11),prob=1/2),type=’h’)
- hist(rbinom(100,10,.5))
- hist(rbinom(1000,10,.5))
- hist(rbinom(10000,10,.5))
Loi normale
La loi normale est fondamentale en statistique inferentielle. La fonction rnorm genere des nombres aleatoires distribues selon une loi normale. En augmentant le nombre d’echantillons generes (de 10 a 10000), on constate que la distribution des valeurs obtenues se rapproche de plus en plus d’une distribution normale continue, comme on peut le voir dans la gure.