Definir des séquences


Il est fréquemment utile de générer des séquences de chiffres dans les applications qui nous intéressent. Ce paragraphe est dédié à diverses manières de générer ces séquences


I. Les séquences de base


Si on a besoin d'une séquence de nombres espacés de 1, comme par exemple 1 2 3 4 5, R fournit l'opérateur ':' à cet effet. Son utilisation est la suivante:

s<-1:5
s
## [1] 1 2 3 4 5

R crée donc un vecteur s contenant les différentes valeurs de la séquence. Voici deux autres exemples de l'utilisation de cet opérateur:

t<-10:2
t
## [1] 10  9  8  7  6  5  4  3  2
q<-1.5:6.3
q
## [1] 1.5 2.5 3.5 4.5 5.5


II. La fonction 'seq'


Cette fonction généralise les possibilités de l'opérateur ':'. On peut avoir des intervalles qui ne valent pas 1 et on peut spécifier le nombre d'éléments de la séquence. La syntaxe de cette fonction est la suivante:

seq(from=valeur_from,to=valeur_to,by=valeur_by,length.out=valeur_length)

Nous allons donner quelques exemples qui illustrent la manière d'utiliser la fonction:

s1<-seq(from=3,to=6)
s1
## [1] 3 4 5 6
s1<-seq(3,6)
s1
## [1] 3 4 5 6

Sous cette forme, la fonction est équivalent à l'opérateur: l'incrément par défaut est 1. Pour la clarté dans ce qui suit, nous utiliserons les arguments nommés.

s2<-seq(from=3,to=6,by=0.5)
s2
## [1] 3.0 3.5 4.0 4.5 5.0 5.5 6.0
s2<-seq(from=3,to=6,length=9)
s2
## [1] 3.000 3.375 3.750 4.125 4.500 4.875 5.250 5.625 6.000
s3<-seq(from=1.5,to=2.4,by=0.2)
s3
## [1] 1.5 1.7 1.9 2.1 2.3
s4<-seq(from=1.5,to=2.4,length=4)
s4
## [1] 1.5 1.8 2.1 2.4


III. La fonction 'rep'


Cette fonction permet de répéter un nombre spécifié de fois une valeur fournie à la fonction. La syntaxe est la suivante:

rep(x,times=valeur_times,length.out=valeur_length,each=valeur_each)

Chaque élément de 'x' est répété 'valeur_each' fois, et le tout est répété 'valeur_times' fois. Si la valeur 'valeur_length' est spécifiée, la longueur de la séquence sera adaptée (quitte à ne plus parfaitement correspondre aux autres paramètres). Voici quelques exemples:

c(rep("Hip",3),"Hourra!")
## [1] "Hip"     "Hip"     "Hip"     "Hourra!"
gender<-c("Male","Female")
rep(gender,2,each=3)
##  [1] "Male"   "Male"   "Male"   "Female" "Female" "Female" "Male"  
##  [8] "Male"   "Male"   "Female" "Female" "Female"

Chaque élément de gender est répété 3 fois (each), et la séquence est répétée 2 fois (times).

rep(gender,2,each=3,length=10)
##  [1] "Male"   "Male"   "Male"   "Female" "Female" "Female" "Male"  
##  [8] "Male"   "Male"   "Female"
Idem, mais seuls les 10 premiers éléments sont reportés.

IV. La fonction 'sequence'


La fonction séquence est utile lorsqu'on souhaite attribuer des numéros à des individus dans des catégories, par exemple. L'exemple qui suit illustre le fonctionnement de cette fonction:

indiv_by_category<-c(2,5,3)
numbers<-sequence(indiv_by_category)
numbers
##  [1] 1 2 1 2 3 4 5 1 2 3


V. Séquences aléatoires


Il existe également dans R une liste riche de procédures permettant de générer des séquences de nombres aléatoires. Le type de nombre, ainsi que les limites des valeurs autorisées dépendent de la fonction choisie. Cette dernière doit être sélectionnée sur base du processus qu'on souhaite représenter. A cet effet, différentes distributions sont disponibles. Nous commencerons par la plus simple, la distribution uniforme. Avec cette fonction, il est possible de générer une séquence de 'n' nombres aléatoires choisis de manière uniforme entre deux limites qu'on peut fixer. Les nombres générés sont des réels:

alea1<-runif(10,min=20,max=50)
alea1
##  [1] 32.98526 27.89616 47.19503 25.92439 36.01341 46.86130 28.66993
##  [8] 22.71084 37.07629 45.90036

Si on souhaite des données ayant une distribution normale, on peut procéder de la manière suivante:

alea2<-rnorm(5,mean=100,sd=10)
alea2
## [1]  93.82362 105.86010 103.75218 100.53247  90.59864

Il faut donc fournir les moyenne et déviation standard de la distribution visée. Les distributions de variables discrètes sont aussi utilisables.

Supposons qu'on désire générer des valeurs aléatoires de la variable (aléatoire) r qui suit une loi binomiale d'effectif total n = 30 et de probabilité de succès p = 0.6. On peut obtenir des valeurs aléatoires de r de la manière suivante:

alea3<-rbinom(5,size=30,prob=0.6)
alea3
## [1] 19 18 13 16 12
mean(rbinom(1000,size=30,prob=0.6))
## [1] 18.038

Le dernier calcul correspond à la moyenne de 1000 valeurs aléatoires de r pour la distribution binomiale d'effectif total n = 30 et de probabilité de succès p = 0.6. On peut remarquer que la moyenne obtenue est proche de la moyenne réelle (μ = n*p = 18).

La distribution de Poisson s'emploie de manière similaire, le paramètre à fournir étant cette fois la moyenne de la distribution:

alea4<-rpois(10,lambda=2.5)
alea4
##  [1] 4 2 2 2 6 4 1 3 1 2
mean(rpois(1000,lambda=2.5))
## [1] 2.478

Pour tirer de manière hypergéométrique (c'est-à-dire, sans remise), il faut préciser le nombre total d'objets qui ne nous intéressent pas ('n'), le nombre total d'objets qui nous intéressent ('m') et le nombre d'objets qu'on échantillonne ('k'). on emploie alors 'rhyper(nn,n,m,k)', comme suit:

alea5<-rhyper(5,n=10,m=20,k=9)
alea5
## [1] 6 7 6 6 7
mean(rhyper(1000,n=10,m=20,k=9))
## [1] 5.994

Comme 20 des 30 objets nous intéressent (soit, 2/3), et qu'on échantillonne 9 objets au hasard, il est logique qu'en moyenne, on ait à peu près 2/3*9 = 6 objets qui nous intéressent dans l'échantillon.
Signalons pour cloturer ce chapitre que de nombreuses autres distributions sont disponibles (chi-carré, t, F, ...).