Septembre 2020
Master Sciences du médicament


Logiciel et langage de programmation/script

  • Libre (Gratuit , licence GPL)

  • Code source ouvert (Open Source)

  • Multiplateforme (Windows , Mac , Linux)

  • Orienté calcul scientifique et statistique

I. Manipulation de données

Préparer la session de travail

Créer un nouveau dossier dans votre espace de travail: Clic droit => Nouveau => Dossier.
Nommer le dossier, par exemple, ‘TP R’.

- Démarrer le logiciel R

Sous Windows 10, si aucun raccourci n’est disponible : => Program Files => R => bin => x64 => Rgui.exe

- Créer un script R vierge

Ficher => Nouveau script

- Enregistrer le script

Ficher => Sauver sous…
Naviguer jusqu’à votre dossier ‘TP R’ et donner un nom au script, par exemple, “MonScript.R”.

Important: Les noms des scripts R doivent se terminer par .R

Nous écrirons dans le script créé, une à une, toutes les instructions ci-dessous, puis nous les exécuterons afin d’observer leurs actions.

- Définir un dossier de travail

# Exemple :
setwd("C:\\Users\\oallatif\\temp") 
# À la place de "C:\\Users\\oallatif\\temp\\" écrire le chemin de votre dossier 'TP R'. 
# Pour obtenir le chemin du dossier 'TP R', nous pouvons utiliser R déja : écrire dans la R console: choose.dir()
# et faire Entrée. Naviguer ensuite jusqu'au dossier 'TP R' => Faire Ok => le chemin s'affichera alors
# dans la R console.

- Télécharger un package

# install.packages("openxlsx")
# Obligatoire pour les packages dont on a besoin. À faire une fois sur un même ordinateur.

- Charger un package pour rendre son contenu accessible

library("openxlsx")
# Obligatoire pour les packages dont on a besoin pendant la session de travail.

NOTE: lorsque le texte de cette présentation est dans une bande de couleur violette c’est qu’il s’agit d’une instruction R, le texte qui suit un ‘#’ est interprété en tant que commentaire qui peut être inséré dans un programme R sans effet sur le programme, il permet cependant d’annoter et d’expliquer le code.

Importer/Exporter des tables txt/Excel

- Importer la table depuis un entrpôt distant

MaTableEnLigne <- read.table("https://git.io/vbiaS" , header = TRUE)
# J'affecte les données en ligne à un objet que je nomme 'MaTableEnLigne'. 
# Les noms des objets ne doivent pas commencer par un chiffre ni contenir des espaces ou des caractères spéciaux.
# 'header=TRUE' signifie que la 1ère ligne contient les noms des colonnes. Plus généralement, pour avoir la 
# description d'une fonction R et de ses arguments, il faut faire:  help(nom de la fonction). 
# Exemple:  help(read.table)

- Écrire cette table au format texte (.txt) dans le dossier de travail

write.table(MaTableEnLigne , "MaTableEnLocal.txt" , row.names = FALSE)

- Importer la table au format texte depuis le dossier de travail

MaTableEnLocal <- read.table("MaTableEnLocal.txt" , header = TRUE) 

- Vérification utile

identical(summary(MaTableEnLocal) , summary(MaTableEnLigne))
## [1] TRUE

- Exporter une table depuis R au format Excel vers le dossier de travail local

write.xlsx(MaTableEnLigne , "MaTableEnLocal.xlsx")

- Importer dans R une table au format Excel depuis le dossier de travail local

CM1 <- read.xlsx("MaTableEnLocal.xlsx" , sheet = 1)

- Réaffecter à un objet existant une autre table

CM1 <- MaTableEnLigne # Je réaffecte à l'objet CM1 le contenu de la table distante.

Inspection de la table

inspection

head(CM1) #Montrer les 6 premières lignes de toutes les colonnes de la table MaTableEnLocal.
##            x         y
## 1 -0.1688613  8.935373
## 2  0.9477892  6.523501
## 3  4.6239681 18.649757
## 4  5.3075947 22.613518
## 5  6.1003234 15.965711
## 6  6.6252482 16.377628
nrow(CM1) # Nombre d'observations (Le nombre de lignes de la table).
## [1] 20
ncol(CM1) # Nombre de variables (Le nombre de colonnes de la table).
## [1] 2

colnames(CM1) # Noms des variables de la table.
## [1] "x" "y"
CM1$y # l'opérateur '$' entre 'CM1' et 'y' permet d'extraire de la table 'CM1' la colonne 'y'.
##  [1]  8.935373  6.523501 18.649757 22.613518 15.965711 16.377628 22.271611
##  [8] 19.426137 16.603166 25.587190 23.682441 26.848028 23.655190 30.597357
## [15] 32.777300 32.020974 27.205078 33.229944 35.586207 42.126671
sum(CM1$y > 20) # Nombre de valeurs de y supérieures à 20.
## [1] 13
sum(CM1$y > 20)/nrow(CM1) # La proportion des valeurs>20 dans y.
## [1] 0.65

Extraction de données de la table

inspection

1- Extraction par position

CM1[ c(6 , 8) , ] # Extraire les lignes 6 et 8 de toutes les colonnes de la table CM1.
##          x        y
## 6 6.625248 16.37763
## 8 7.087733 19.42614
CM1[ c(6 , 8) , 2 ] # Extraire les lignes 6 et 8 de la colonne 2 de la table CM1.
## [1] 16.37763 19.42614

2- Extraction par nom

CM1[ , "y"] # Extraire les valeurs de la colonne 'y' de la table CM1.
##  [1]  8.935373  6.523501 18.649757 22.613518 15.965711 16.377628 22.271611
##  [8] 19.426137 16.603166 25.587190 23.682441 26.848028 23.655190 30.597357
## [15] 32.777300 32.020974 27.205078 33.229944 35.586207 42.126671

Visualisation des données

inspection

plot(CM1$x , CM1$y) #Affichage graphique de 'x' en fonction de 'y'.

plot(CM1$x , CM1$y , col = ifelse(CM1$x < 10 , 'magenta' , 'gold') , 
 pch = 19 , cex = 2 , main = 'Graphique avec R: couleur magenta pour les valeurs de x inf. à 10.')
# Repérer les individus sur le graphique.
text(CM1$x , CM1$y , rownames(CM1) , col ='white' , cex =0.7) #la fonction 'text()' superpose du texte sur le graph. 

Visualisation interactive (simple) de données

suppressPackageStartupMessages({library(plotly)})
library(plotly)
plot_ly(CM1 , x = ~x , y = ~y , type='scatter' , mode='markers')%>%
layout(title = "Ce paragraphe n'est pas au programme , c'est une démonstration")

II. Test Statistique simple

Test de Student sur un échantillon distribué selon la loi normale

Principe du test

Soit \(A\) un vecteur de valeurs numériques de taille \(n_A\) , de moyenne \(\mu_A\) et de variace \(Var_A\). Nous souhaitons savoir si \(\mu_A\) est différente d’une moyenne (une valeur) théorique \(\mu_{theo}\) donnée. Pour cela nous calculerons 2 statistiques : (1) \(t_{obs}\) à partir des données observées et (2) \(t_{critique}\) à partir , en partie , des données observées et du niveau de confiance dans notre résultat , un niveau que nous choissions.

Notre test est bilateral

Hypothèses :

\(H_0:\mu_A = \mu_{theo}\) vérifiée si \(t_{obs}<t_{critique} \quad ou \quad t_{obs} > -t_{critique}\)

\(H_1:\mu_A \neq \mu_{theo}\) vérifiée si \(t_{obs}>t_{critique} \quad ou \quad t_{obs} < -t_{critique}\)

Mise en pratique

Création de A

A <- iris$Sepal.Width
#l'opérateur '$' entre 'iris' et 'Sepal.Width' permet de sélectionner de la table 'iris' la colonne 'Sepal.Width'.

iris

La statistique du test de Student pour un échantillon \(t_{obs}\) est calculée comme suit:

\[t_{obs} = \frac{\mu_A - \mu_{theo}}{\sqrt{\frac {Var_A} {n_A} }}\]

Calcul manuel de la statistque du test \(t_{obs}\)

1- la taille de A

n_A <- length(A)

2- la moyenne de A \[\mu_A = \frac 1 n_A \sum_{i=1}^{n_A} A_i\]

mu_A <- sum(A)/n_A
mu_A
## [1] 3.057333

3- la variance de A

\[Var_A = \frac1{n_A-1}\sum_{i=1}^{n_A}(A_i-\mu_A)^2 \]

var_A <- (1/(n_A-1))*sum((A-mu_A)^2)
var_A
## [1] 0.1899794

Calcul manuel de la significativité du test

Supposons que \(\mu_{theo}\) vaut 3 ,

mu_theo <- 3 

Alors \(t_{obs}\) vaut :

\[t_{obs} = \frac{\mu_A - \mu_{theo}}{\sqrt{\frac {Var_A} {n_A} }}\]

t_obs <- (mu_A - mu_theo)/sqrt(var_A/n_A)
t_obs
## [1] 1.611015

\(t_{critique}\) est un quantile de la loi de Student qui dépend des ddl et du risque \(\alpha\) que nous choissions. Nous recherchons traditionnellement cette valeur dans la table de la loi de Student.

Table Loi Student

\(t_{critique} : \quad t^{n_{A}-1 \quad ddl}_{1-\alpha/2}\)

Nous pouvons également la calculer avec la fonction \(qt\) dans R.

ddl <- n_A-1
alpha <- 0.05
t_critique <- qt(p = 1-alpha/2 , df = ddl)
t_critique
## [1] 1.976013

Rappel : \(H_1:\mu_A \neq \mu_{theo}\) est vérifiée si \(t_{obs}>t_{critique} \quad ou \quad t_{obs} < -t_{critique}\)


Quelle conclusion ?

Vérification graphique du résultat

X<- rt(1e4 , df = ddl) ; Y <- dt(X , df = ddl)
plot(X , Y , col= adjustcolor('lightseagreen' , alpha.f = 0.2) , pch = 19 , xlim = c(-6 , 6) , cex = 2 , 
 main = "Distribution de la loi de Student à n_A-1 degrés de liberté")
abline(v = c(-t_critique , t_critique ) , col = "blue")
text(x =c(-t_critique - 0.2 , t_critique+0.2 ) , y = c(0.2 , 0.2) , c("-t_critique" , "t_critique" ) , 
 srt = 90 , col = "blue")
abline(v = c(-t_obs , t_obs ) , col = 'gold')
text(x =c( -t_obs+ 0.2 , t_obs- 0.2 ) , y = c(0.33) , c("-t_obs" , "t_obs") , srt = 90 , col = "gold")

Calcul de p valeur avec la fonction \(pt\) dans R

p_valeur <- 2*pt(q = t_obs , df = ddl , lower.tail = F)
p_valeur
## [1] 0.1092929

Test de student par la fonction \(t.test\) du logiciel R