Calculs et
simulation en R

Retour sur le mini-test
et démonstrations

Aurélien Nicosia · 16 septembre 2026
STT-4230 / STT-6230

Les points à reprendre

Les demandes de la question ouverte :

  • Repérer les valeurs manquantes et distinguer na.rm de na.omit.
  • Choisir une fonction de la famille apply, notamment pour les sous-groupes avec tapply.
  • Reprendre les calculs vectorisés et les probabilités estimées par simulation.

Pour chaque exemple : prévoir le résultat, exécuter le code, puis vérifier ce qui a été calculé.

Synthèse anonymisée des 20 copies soumises au mini-test de préparation, semaine 3, groupes STT-4230 et STT-6230, consultées dans Brio le 16 septembre 2026.

Mini-test : la moyenne avec un NA

x <- c(2, 4, NA, 8)
print(c(mean(x), mean(x, na.rm = TRUE)))

Quel résultat attendez-vous ?

Choix Résultat
A c(NA, 14 / 3)
B c(14 / 3, 14 / 3)
C c(3.5, 3.5)
D Une erreur

Mini-test de préparation, semaine 3, question 1.

Retirer le NA du calcul

#> [1]     NA 4.6667

La réponse est A : (2 + 4 + 8) / 3, soit 4.66667.

n_observees <- sum(!is.na(x))
print(n_observees)
print(sum(x, na.rm = TRUE) / n_observees)
#> [1] 3
#> [1] 4.6667

na.rm = TRUE calcule la moyenne des valeurs observées.
Le NA reste dans x et n’est pas remplacé par zéro.

R Core Team, mean, documentation consultée le 15 septembre 2026.

Repérer les NA et garder les valeurs observées

Où sont les NA ?

x <- c(2, 4, NA, 8)
print(is.na(x))
print(which(is.na(x)))
#> [1] FALSE FALSE  TRUE FALSE
#> [1] 3

is.na indique les valeurs manquantes; which donne leurs positions.

Un nouvel objet avec na.omit

x_observe <- na.omit(x)
print(x_observe)
#> [1] 2 4 8
#> attr(,"na.action")
#> [1] 3
#> attr(,"class")
#> [1] "omit"

x_observe contient les valeurs retenues et garde la trace de la position omise.

x reste inchangé. Sur un data frame, na.omit retire les lignes incomplètes.
Retirer une observation n’est pas estimer sa valeur manquante.

R Core Team, is.na et na.omit, consultés le 16 septembre 2026.

Mini-test : que mesure cette moyenne ?

set.seed(2026)
z <- rnorm(10000)
print(mean(z > 1.96))
  • La moyenne des valeurs supérieures à 1,96 ?
  • La proportion de valeurs supérieures à 1,96 ?
  • Un quantile ou une variance ?
#> [1] 0.0264

Mini-test de préparation, semaine 3, question 2. Tirages simulés dans une loi normale standard.

Une condition logique devient une proportion

petit_z <- c(-0.5, 2.1, 0.3, 2.4, -1)
print(petit_z > 1.96)
print(c(
  proportion = mean(petit_z > 1.96),
  moyenne_selection = mean(petit_z[petit_z > 1.96])
))
#> [1] FALSE  TRUE FALSE  TRUE FALSE
#>        proportion moyenne_selection 
#>              0.40              2.25

Pour la moyenne, TRUE vaut 1 et FALSE vaut 0.
Deux dépassements sur cinq : 2 / 5 = 0,4.

La réponse au mini-test est B : une approximation de la probabilité de dépassement.
mean(z[z > 1.96]) calcule la moyenne des seules valeurs retenues.

Simulation et probabilité théorique

Densité normale standard, avec la queue au-delà de 1,96 colorée; son aire vaut environ 0,025.

probabilite <- pnorm(
  1.96, lower.tail = FALSE
)
print(c(
  simulation = mean(z > 1.96),
  theorie = probabilite))
#> simulation    theorie 
#>   0.026400   0.024998

pnorm(..., lower.tail = FALSE) calcule la probabilité de dépasser le seuil.

La simulation l’estime avec un nombre fini de tirages.

R Core Team, loi normale, documentation consultée le 15 septembre 2026.

Reproduire une simulation

set.seed(2026)
tirage_a <- rnorm(4)
tirage_suivant <- rnorm(4)
set.seed(2026)
tirage_b <- rnorm(4)
print(identical(tirage_a, tirage_b))
print(identical(tirage_a, tirage_suivant))
#> [1] TRUE
#> [1] FALSE

Une même graine et les mêmes appels reproduisent la séquence, avec la même configuration du générateur.

Fixer la graine au début de l’expérience. Les appels suivants font avancer la séquence.
La graine ne garantit pas que l’estimation est précise.

R Core Team, génération aléatoire, documentation consultée le 15 septembre 2026.

Démo : calculer sur tout un vecteur

Températures fictives, en degrés Celsius.

temperature <- c(6, 8, 10, 12) # Degrés Celsius, fictifs.
print(temperature + 2)
print(temperature > 9)
print(mean(temperature > 9))
#> [1]  8 10 12 14
#> [1] FALSE FALSE  TRUE  TRUE
#> [1] 0.5

L’opération porte sur chaque élément.
La moyenne des conditions donne la proportion au-dessus de 9 °C.

Démo : le recyclage

Que se passe-t-il avec une correction de longueur 2 ?

correction <- c(1, -1)
print(temperature + correction)
print(rep(correction, length.out = length(temperature)))
#> [1]  7  7 11 11
#> [1]  1 -1  1 -1

R répète ici c(1, -1) pour atteindre la longueur 4.
Le calcul s’exécute sans avertissement : le résultat doit quand même correspondre à l’intention.

Baillargeon, calculs mathématiques en R, notes STT-4230 / STT-6230.

Démo : une matrice de mesures

# Températures fictives en degrés Celsius.
mesures <- cbind(Quebec = c(6, 8, NA),
                 Levis = c(7, 9, 11))
rownames(mesures) <- c("Jour 1", "Jour 2", "Jour 3")
print(mesures)
print(which(is.na(mesures), arr.ind = TRUE))
#>        Quebec Levis
#> Jour 1      6     7
#> Jour 2      8     9
#> Jour 3     NA    11
#>        row col
#> Jour 3   3   1

which(..., arr.ind = TRUE) donne la ligne et la colonne du NA.
Une moyenne par site ou une moyenne par jour ?

apply : choisir la dimension

Par site : colonnes

print(apply(
  mesures, 2, mean, na.rm = TRUE
))
#> Quebec  Levis 
#>      7      9

2 conserve les colonnes.

Par jour : lignes

print(apply(
  mesures, 1, mean, na.rm = TRUE
))
#> Jour 1 Jour 2 Jour 3 
#>    6.5    8.5   11.0

1 conserve les lignes.

Jour 3 : une seule mesure contribue à la moyenne.
Une moyenne se lit avec son nombre d’observations.

R Core Team, apply, documentation consultée le 15 septembre 2026.

tapply : une moyenne par groupe

Mêmes températures fictives, sous forme de vecteurs.

valeurs <- c(6, 8, NA, 7, 9, 11)
site <- rep(c("Quebec", "Levis"), each = 3)
print(tapply(
  valeurs, site, mean, na.rm = TRUE
))
#>  Levis Quebec 
#>      9      7
Fonction Sur quoi agit-elle ?
apply Lignes ou colonnes d’une matrice
lapply Éléments d’une liste; renvoie une liste
sapply Comme lapply, puis simplifie si possible
tapply Groupes définis par une variable

site indique le groupe de chaque valeur. na.rm = TRUE est transmis à mean.
Québec : 2 valeurs observées; Lévis : 3. Le script permet de vérifier ces effectifs.

R Core Team, tapply et lapply / sapply, consultés le 16 septembre 2026.

À vous : quel est le dénominateur ?

pluie <- c(0, 12, NA, 4, 20) # Millimètres, données fictives.
print(mean(pluie > 10, na.rm = TRUE))

Quel résultat ? Comment le vérifier sans mean() ?

print(c(
  jours_observes = sum(!is.na(pluie)),
  jours_plus_10 = sum(pluie > 10, na.rm = TRUE)
))
#> jours_observes  jours_plus_10 
#>              4              2

2 / 4 = 0,5 : parmi les jours observés, la moitié dépasse 10 mm.

Que peut-on dire du jour manquant ?

Portfolio : premier jalon aujourd’hui

Échéance : 16 septembre, à 16 h 20. Total : 4 points.

Critère Points
Dépôt accessible, README général et structure 1
Productions personnelles des semaines 1 à 3 1
Documentation et vérification du travail 1
Progression Git et messages compréhensibles 1

La trace de semaine 3 peut être réalisée pendant la séance.

Faire un git push, puis vérifier les fichiers sur GitHub.

Complément : deux produits

a <- matrix(c(1, 2, 3, 4), nrow = 2, byrow = TRUE)
print(a * a)
print(a %*% a)
#>      [,1] [,2]
#> [1,]    1    4
#> [2,]    9   16
#>      [,1] [,2]
#> [1,]    7   10
#> [2,]   15   22

* multiplie élément par élément.
%*% calcule un produit matriciel.

Vérification : l’élément en haut à gauche du produit matriciel vaut 1 × 1 + 2 × 3 = 7.

Complément : d, p, q et r

Fonction Ce qu’elle donne
dnorm(x) La densité au point x
pnorm(x) La probabilité d’être inférieur ou égal à x
qnorm(p) Le quantile associé à la probabilité p
rnorm(n) n tirages simulés
print(c(
  densite = dnorm(1.96),
  probabilite_cumulee = pnorm(1.96),
  quantile_975 = qnorm(0.975)
))
#>             densite probabilite_cumulee        quantile_975 
#>            0.058441            0.975002            1.959964

Pour une loi continue, une hauteur de densité n’est pas une probabilité ponctuelle.

Pour retrouver les explications

Les mesures illustratives sont fictives. Les résultats numériques sont produits par R lors du rendu.