Introduction au logiciel R



Documents pareils
Lire ; Compter ; Tester... avec R

Gestion des données avec R

données en connaissance et en actions?

Cours 1. I- Généralités sur R II- Les fonctions de R et autres objets III-Les vecteurs

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Tests statistiques et régressions logistiques sous R, avec prise en compte des plans d échantillonnage complexes

Introduction à R. Florence Yerly. Dept. de mathématiques, Université de Fribourg (CH) SP 2011

R01 Import de données

Exercices M1 SES Ana Fermin ( fermin.perso.math.cnrs.fr/ ) 14 Avril 2015

Premiers pas avec SES-Pegase (version 7.0) SES : Un Système Expert pour l analyse Statistique des données. Premiers pas avec SES-Pegase 1

IMPORTATION, CRÉATION, MANIPULATION, EXPORTATION DE DONNÉES STATISTIQUES

Introduction aux Statistiques et à l utilisation du logiciel R

1 Introduction - Qu est-ce que le logiciel R?

Introduction à MATLAB R

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

Introduction à la statistique non paramétrique

Auguria_PCM Product & Combination Manager

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Les concepts de base, l organisation des données

distribution quelconque Signe 1 échantillon non Wilcoxon gaussienne distribution symétrique Student gaussienne position

Séance 0 : Linux + Octave : le compromis idéal

SAS de base : gestion des données et procédures élémentaires

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

I. Introduction aux fonctions : les fonctions standards

TP 1. Prise en main du langage Python

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

LES TYPES DE DONNÉES DU LANGAGE PASCAL

EXCEL TUTORIEL 2012/2013

URECA Initiation Matlab 2 Laurent Ott. Initiation Matlab 2

Le générateur d'activités

Initiation au logiciel R

Jérôme Mathieu janvier Débuter avec R. Ce document est disponible sur le site web :

Plan du cours Cours théoriques. 29 septembre 2014

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

Logiciel XLSTAT version rue Damrémont PARIS

Débuter avec OOo Base

Une fois votre tableau excel complet, cliquer sur fichier enregistrer sous type de fichier (menu déroulant) csv (séparateur : point virgule).

BADPLUS V5 MANUEL D'UTILISATION. Imports de données joueurs à partir de la base fédérale en ligne Poona. Stéphan KIEFFER - Dominique BOSSERT

Cours Informatique Master STEP

Traitement des données avec Microsoft EXCEL 2010

LES DECIMALES DE π BERNARD EGGER

CAPTURE DES PROFESSIONNELS

Aide-mémoire de statistique appliquée à la biologie

MEDIAplus elearning. version 6.6

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Initiation à la programmation en Python

v7.1 SP2 Guide des Nouveautés

TABLEAU CROISE DYNAMIQUE

Serveur Acronis Backup & Recovery 10 pour Linux. Update 5. Guide d'installation

INTRODUCTION AU LOGICIEL R

Programmation Objet - Cours II

Les tableaux croisés dynamiques

Cours 7 : Utilisation de modules sous python

Importer les fichiers élèves - professeurs du secrétariat

La survie nette actuelle à long terme Qualités de sept méthodes d estimation

Logiciel Le Sphinx Plus 2 version 5. Le Sphinx Développement Chavanod

Recherche dans un tableau

Présentation du langage et premières fonctions

1. Structure d'un programme FORTRAN 95

TeamViewer 7 Manuel Manager

SOMMAIRE. Travailler avec les requêtes... 3

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Manuel d utilisation NETexcom

L'explorateur de fichier de Windows 8.1

SAP Lumira Version du document : Guide de l'utilisateur de SAP Lumira

Microsoft Excel Présentation du tableur Excel

Localisation des fonctions

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Créer une base de données

Le langage SQL Rappels

Ref : Résolution problème d'accès aux supports de cours

LE TABLEUR OPENOFFICE CALC : CONTRÔLES DE FORMULAIRES ACCÈS AUX BASES DE DONNÉES

1. Introduction Création d'une requête...2

Python - introduction à la programmation et calcul scientifique

Microsoft Excel. Tableur

Manuel d'utilisation d'apimail V3

Automatisation d'une Facture 4. Liste Déroulante Remises Case à cocher Calculs

Création de Sous-Formulaires

A.-M. Cubat PMB - Import de notices à partir d un tableur Page 1 Source :

Publipostage avec Calc

SEMIN. Données sous R : stockage et échange. Julio PEDRAZA ACOSTA

Analyse tarifaire en ligne (TAO) de l'omc

REALISER UN SITE INTERNET AVEC IZISPOT SOMMAIRE

TABLE DES MATIERES. C Exercices complémentaires 42

SAUVEGARDER SES DONNEES PERSONNELLES

FileSender par RENATER - Guide utilisateur

Le meilleur de l'open source dans votre cyber cafe

Fonctionnement général de Tiny ERP

Guide d utilisation de fonctionnalités avancées de Beyond 20/20 (application à des données départementales issues de Sit@del2)

YAPBA M. Logiciel libre de suivi de vos comptes

Tutorial Ophcrack. I) Ophcrack en API. (ou comment utiliser Ophcrack pour recouvrir un mot de passe sous Windows XP et Windows Vista)

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Foire aux Questions Note: Les réponses aux questions correspondent à la version Mise en route

Stockage du fichier dans une table mysql:

Aide à l'utilisation de l'application 'base de données communales' intégrée à la plate-forme PEGASE. Interface 'Front-Office'

Cours (7) de statistiques à distance, élaboré par Zarrouk Fayçal, ISSEP Ksar-Said, LES STATISTIQUES INFERENTIELLES

Transcription:

Introduction au logiciel R janvier 2013 Unité Méthodologique et de Qualité de Vie en Cancérologie Amélie ANOTA

Table des matières 1. Présentation générale... 5 1.1. Téléchargement et installation de R... 5 1.2. La console... 5 1.3. Fichier script de R (fichier.r)... 6 1.4. Installation et chargement d'un package... 6 1.5. Changer le répertoire des données... 8 1.6. L'aide de R... 8 1.7. Importer un fichier/exporter une table... 9 2. Présentation des principaux objets de R... 10 2.1. La calculatrice... 10 2.2. Les opérateurs... 11 2.3. Les vecteurs... 11 2.4. Les matrices... 13 2.5. Les listes... 15 2.6. Une structure importante sous R: les data frames... 16 3. Analyse générale d'un fichier de données... 17 3.1. Description générale du fichier de données... 17 3.2. La commande summary()... 18 3.3. Quelques statistiques... 19 3.4. Connaître le type d'une variable: commandes class() et mode()... 19 3.5. Modifier le type d'une variable... 20 3.6. Les données manquantes... 20 4. Sélection ou suppression de données ou de variables... 21 4.1. Sélection d'observations... 21 4.2. Suppression d'observations... 21 4.3. Réordonner un fichier selon les valeurs d'une variable: commande order()... 22 4.4. Modifier le nom d'une variable... 22 4.5. Extraire une chaîne de caractères... 23 4.6. Gestion des dates... 24 5. Création et manipulation du contenu de variables... 24 5.1. Création de variables booléennes... 24 5.2. Création de variables dichotomiques... 25 5.3. Création de variables en classes... 26 2

5.4. Création de n variables quantitatives en fonction d'autres variables... 26 6. Combiner des fichiers de données: commande merge()... 26 6.1. Ajouter des observations... 27 6.2. Ajouter des variables... 27 7. Transposer un fichier/échange des lignes et des colonnes: commande reshape()... 27 7.1. Passer du format "long" au format "wide"... 28 7.2. Passer du format "wide" au format "long"... 29 8. Les tests statistiques... 30 8.1. Tableaux à plat, tableaux croisés... 30 8.2. Test de comparaison de deux proportions... 31 8.3. Test d'une corrélation significative... 31 8.4. Test de comparaison de variances: test de Fisher Snedecor... 32 8.5. Test de comparaison de deux moyennes... 32 8.6. Les variables aléatoires et échantillonnages... 32 8.6.1. Loi uniforme et autres lois de probabilités... 33 9. Les modèles de régression... 33 9.1. Régression logistique: fonction glm()... 34 9.2. Régression linéaire: fonction lm()... 35 9.3. Analyses de variance... 35 10. Analyse de survie... 36 11. L'interface graphique de R... 39 11.1. Overview des paramètres de base pour faire un graphe... 39 11.2. Ajouter des éléments sur un graphe... 40 11.3. Découpage de la fenêtre graphique... 40 11.4. Représentation variable quantitative en fonction d'une variable qualitative: boxplot... 41 11.5. Histogramme... 41 11.6. Par appel de la fonction plot()... 42 12. Les boucles et exécutions conditionnelles sous R... 42 12.1. Les boucles "for"... 42 12.2. Les boucles "while"... 43 12.3. Instructions conditionnelles... 43 13. Créer ses propres fonctions... 44 3

4

1. Présentation générale R est un logiciel libre, donc gratuit, spécialisé dans l'analyse statistique et la représentation graphique des données. C'est un outil très dynamique, il y a constamment de nouvelles versions et donc de nouveaux packages (correspond à des bibliothèques confectionnées par les utilisateurs de R). 1.1. Téléchargement et installation de R Le logiciel R se télécharge depuis le site du CRAN ("The Comprehensive R Archive Network"): http://cran.r-project.org/. Comme nous venons de le dire, il y a régulièrement de nouvelles versions du logiciel. Aujourd'hui, il s'agit de la versions 2.15.2. Même si vous disposez d'une version antérieure de R, cela ne pose pas de problèmes majeurs pour l'utilisation du logiciel. Cependant, lors de l'installation d'un nouveau package (bibliothèque), vous risquez de voir apparaître le message d'alerte suivant : warning: le package nom_package a été compilé avec la version R 2.15.2" si vous disposez d'une version antérieure à celle de la création du package. 1.2. La console La console de R constitue la fenêtre principale. C'est dans cette fenêtre que l'on va soumettre une commande ou un ensemble de commandes à R. On peut rappeler une commande antérieure en utilisant la "flèche vers le haut". On soumet une ligne de commande écrite dans la console par la touche "entrée". 5

curseur indiquant que R est prêt à recevoir une nouvelle ligne de commande 1.3. Fichier script de R (fichier.r) Les lignes de commandes de R peuvent être écrites directement dans la console ou bien dans un script qui est un fichier.r. Pour créer un script, rien de plus simple: Fichier Nouveau script. Lorsque vous êtes dans votre fichier script, vous pouvez soumettre une ligne de commande ou bien une sélection de lignes de commandes avec la touche ou bien le raccourcis clavier CTRL + R (évidemment, on est dans R!!). 1.4. Installation et chargement d'un package La plupart des packages R sont disponibles sur le site du CRAN. Il en existe plus de 4000 à ce jour. Il se télécharge soit en fichier.zip, soit depuis un miroir CRAN, soit directement dans la console par l'instruction install.package pour les fichier.tar.gz. Je vous recommande l'installation depuis un fichier.zip pour les utilisateurs de Windows. Enregistrer le fichier.zip obtenu sur le site du CRAN puis: Packages Installer des packages depuis des fichiers.zip Ensuite, à chaque nouvelle session, il faut charger le package en mémoire avec la commande library(nom_package) ou dans le volet Packages Charger le package... Attention, l'installation d'un package nécessite souvent l'installation d'autres packages. Un exemple de page d'accueil du package vous est donné ci-après. 6

Exemple: pour le package xlsx: nécessite l'installation des package xlsxjars et rjava fichier à télécharger pour une installation depuis fichier.zip aide de l'ensemble des fonctions du package en format pdf article avec présentation et utilisation du package liste des packages qui dépendent du présent package 7

1.5. Changer le répertoire des données Pour charger un ou plusieurs fichiers de données, il est recommandé de changer le répertoire de travail dès le début d'une nouvelle session R. Ceci évitera de devoir toujours repréciser le répertoire dans lequel se trouve vos données. De plus, lors de l'enregistrement de vos fichier.r, vous accéderez directement à votre répertoire courant. Pour se faire, volet Fichier Changer le répertoire courant... Ensuite indiquez le répertoire dans lequel vous avez enregistré vos données ou vous souhaitez travailler. 1.6. L'aide de R Pour accéder à l'aide d'une fonction R, il suffit d'écrire dans la console: > help(nom_fonction) ou bien: >?nom_fonction Pour accéder à l'aide d'une fonction, il est nécessaire de connaître son nom exact, ou du moins le début. L'utilisation de la touche tabulation sur votre clavier vous donnera alors la liste de l'ensemble des fonctions qui commencent par votre expression. Toute documentation sur une fonction est constituée de la même structure. Un exemple vous est donnée ci-après pour la fonction summary (très utile pour décrire vos variables). 8

fait partie du package base description brève de ce que fait la (les) fonction(s) titre de la fonction synopsis de la fonction et des variables. Montre la façon dont il faut écrire la fonction détails des arguments et options possibles de la fonction donne des informations supplémentaires sur la façon dont opère la fonction détails des sorties de la fonctions lien vers d'autres fonctions pouvant compléter votre analyse (très utile) 1.7. Importer un fichier/exporter une table Il est possible d'importer plusieurs type de données sous R à partir de fonctions présentes dans la version de base (donc sans importation de package). Pour cela, il suffit d'utiliser la fonction read.table dont vous pouvez accéder à l'aide par la commande: >?read.table - importation de fichiers excel de type.csv (comma separated values) > nom_tabler=read.table("nom_fichier.csv",sep=";",header=t) > nom_tabler=read.csv("nom_fichier.csv",sep=";",header=t) Par défaut, header=t pour TRUE. Cette option permet de garder les noms des colonnes présent dans le fichier d'origine comme nom de variable dans la table R. On peut aussi spécifier à R que 9

toutes les données présentes dans le fichier d'origine doivent être considérées comme des observations avec header=f ou header=false. L'option sep=";" permet de préciser le séparateur décimal. - importation de fichier texte.txt > nom_tabler=read.table("nom_fichier.txt",sep="\t",header=t) Pour importer/exporter des fichiers Excel sous format.xls ou.xlsx (format Excel 2007 et plus), il faut utiliser les packages xlsreadwrite et xlsx respectivement. Les fonctions permettant d'importer des fichiers.xls et.xlsx sont read.xls et read.xlsx respectivement. Voici un exemple d'écriture pour la lecture d'un fichier excel 2007 ou plus: > read.xlsx("nom.fichier.xlsx",1)7 > ## on précise que l'on veut la première feuille (sheet) du classeur Il est possible d'importer/exporter des données entre R et d'autres logiciels statistiques (SAS, STATS,...) avec l'utilisation du package foreign. Une illustration de l'utilisation de ce package est faite en section 4.5 avec le chargement d'un fichier STATA. L'exportation d'objets de R vers Excel sous format.csv se fait à l'aide de la fonction write.table(): > write.table(nom_objet,"nom fichier de destination.csv","sep=";",row.names=false) De même on peut exporter un fichier.txt: > write.table(nom_objet,"nom fichier de destination.txt","sep="\t",row.names=false) 2. Présentation des principaux objets de R 2.1. La calculatrice R est avant toute chose une calculatrice. Tout calcul peut être fait sous R. > 1.5+3*6/9 [1] 3.5 > sqrt(1.5+3*6/9) # sqrt: racine carrée [1] 1.870829 > (1.5+3*6/9)^5 [1] 525.2188 > sin((1.5+3*6/9)^5) [1] -0.5419678 > sin(pi) [1] 1.224606e-16 > cos(pi) [1] -1 > log(3) [1] 1.098612 > exp(1.5) [1] 4.481689 10

Les commentaires sous R s'obtiennent avec la touche dièse (#). Tout ce qui apparaît après cette touche est considérée comme un commentaire et n'est donc pas pris en compte dans la console. Pour écrire plusieurs lignes de commentaires, il est nécessaire de reproduire le signe # en début de chaque ligne. 2.2. Les opérateurs - opérateurs logiques: & pour "et"; (Alt Gr +6) pour "ou" -opérateurs de comparaison: <, <=, >, >=, == (pour tester l'égalité),!= (différent de) 2.3. Les vecteurs Les vecteurs et les matrices sont les objets de base de R. Intéressons tout d'abord aux vecteurs. Il y a une multitude de façon de créer un vecteur. La façon la plus commune de créer un vecteur est la suivante: > c(1,2,3,6,5) [1] 1 2 3 6 5 Cette commande crée un vecteur de taille 5 ayant pour premier élément la valeur 1, pour deuxième élément la valeur 2,..., et pour dernier élément la valeur 5. Cependant, si l'on veut pouvoir travailler sur ce vecteur ultérieurement, il est recommandé de lui attribuer un nom: > vecteur=c(1,2,3,6,5) > vecteur # pour voir le contenu de vecteur [1] 1 2 3 6 5 La commande vecteur[i] vous permet d'accéder à la i ème composante de votre vecteur vecteur. > vecteur[1]#vous donne la première composante du vecteur [1] 1 > vecteur[3]#vous donne la quatrième composante du vecteur [1] 6 > length(vecteur)#vous donne la longueur de votre vecteur [1] 6 On peut alors modifier le contenu de ce vecteur par diverses opérations: > vecteur=vecteur+1# on incrémente de 1 toutes les composantes du vecteur > vecteur [1] 2 3 4 7 6 > vecteur+3 # vous donne la valeur de vecteur incrémenté de 3 sans pour autant modifier la valeur de vecteur [1] 5 6 7 10 9 > vecteur [1] 2 3 4 7 6 > vecteur=vecteur/6 # division par 6 [1] 0.3333333 0.5000000 0.6666667 1.1666667 1.0000000 > exp(vecteur) [1] 2.718282 7.389056 20.085537 403.428793 148.413159 11

Un vecteur peut aussi bien contenir des données numériques que des données caractères. > vect2=c("age","sexe","adresse") > vect2 [1] "age" "sexe" "adresse" On peut aussi créer un vecteur logique (booléen): > (vect4=c(true,false,true)) [1] TRUE FALSE TRUE A noter la petite astuce: mettre des parenthèses sur l'affectation globale permet de créer le vecteur et de connaître sa valeur directement. La fonction c() permet aussi de concaténer deux vecteurs: > c(vecteur,vect2) [1] "2" "3" "4" "7" "6" "age" "sexe" "adresse" Il existe d'autres façon de créer un vecteur: > 1:5 [1] 1 2 3 4 5 > 5:-6 [1] 5 4 3 2 1 0-1 -2-3 -4-5 -6 > seq(1,10,0.5) #crée une suite de points équidistants entre 1 et 10 de pas 0.5 [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 6.5 7.0 7.5 8.0 8.5 [17] 9.0 9.5 10.0 > rep(1,10)# pour répliquer la valeur 1 dix fois [1] 1 1 1 1 1 1 1 1 1 1 > rep(1:5,4)# pour répliquer la séquence 1:5 quatre fois [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 On peut aussi créer un vecteur de taille donnée mais vide au départ et dont on rempli au fur et à mesure divers éléments. On peut même augmenter la taille de ce vecteur petit à petit. Les données manquantes sous R sont notées NA pour (Not Applicable). > vect=rep(na,5) > vect [1] NA NA NA NA NA > vect[1] [1] NA > vect[1]=3 > vect [1] 3 NA NA NA NA > vect[3]=2 > vect [1] 3 NA 2 NA NA > length(vect) [1] 5 > vect[length(vect)+1]=-1 > vect [1] 3 NA 2 NA NA -1 > length(vect) [1] 6 Une fois notre ou nos vecteurs crées, on peut réaliser des opérations sur ces vecteurs. > vect3=c(6,5,-1,2,3) > vecteur*vect3 # multiplication entre vecteurs [1] 12 15-4 14 18 > sort(vect3) # trie le vecteur [1] -1 2 3 5 6 > sort(vect3,decreasing=t) # trie le vecteur par ordre décroissant [1] 6 5 3 2-1 > order(vect3)# indique l'ordre des éléments [1] 3 4 5 2 1 12

> vect3[order(vect3)] [1] -1 2 3 5 6 De façon générale: - la commande vecteur[n] vous permet d'accéder à la n ième composante du vecteur - la commande vecteur[condition]vous permet d'afficher les éléments de votre vecteur qui respectent la condition. > vect3=c(6,5,-1,2,3) # Création d'un vecteur booléen: > vect3>2 [1] TRUE TRUE FALSE FALSE TRUE > vect3[vect3>2] [1] 6 5 3 On peut ainsi modifier la valeur des éléments d'un vecteur par l'intermédiaire d'un booléen. Ainsi, si la condition est respectée pour l'élément i du vecteur, on applique la modification proposée. Sinon, l'élément i du vecteur reste inchangé: > vect7=c(t,f,t,f,t,t,t) > vect7 [1] TRUE FALSE TRUE FALSE TRUE TRUE TRUE > vect8=rep(na,length(vect7))# création d'un vecteur vide de taille égale à celle de vect7 > vect8 [1] NA NA NA NA NA NA NA > vect8[vect7]=3 > vect8 [1] 3 NA 3 NA 3 3 3 > vect8[!vect7]=-4 > vect8 [1] 3-4 3-4 3 3 3 2.4. Les matrices Les matrices sont crées à partir des vecteurs. Il s'agit de séries de valeurs à deux dimensions. Les numéros des lignes et des colonnes sont représentés par des chiffres entre crochets. Le chiffre avant la virgule indique le numéro de la ligne et celui après la virgule indique le numéro de la colonne. Une matrice est crée à l'aide de la fonction matrix(). exemple: Création d'une matrice à 5 lignes et 10 colonnes contenant la séquence 1:10 et dont le remplissage se fait par ligne > (mat1=matrix(1:10,ncol=10,nrow=5,byrow=t)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 1 2 3 4 5 6 7 8 9 10 [2,] 1 2 3 4 5 6 7 8 9 10 [3,] 1 2 3 4 5 6 7 8 9 10 [4,] 1 2 3 4 5 6 7 8 9 10 [5,] 1 2 3 4 5 6 7 8 9 10 Par défaut, si on ne précise pas le nombre de colonnes à créer, ncol=2 ici: 13

> (mat1=matrix(1:10,nrow=5,byrow=t)) [,1] [,2] [1,] 1 2 [2,] 3 4 [3,] 5 6 [4,] 7 8 [5,] 9 10 > (mat1=matrix(1:10,byrow=t)) [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4 [5,] 5 [6,] 6 [7,] 7 [8,] 8 [9,] 9 [10,] 10 Création d'une matrice diagonale avec l'instruction diag(): > diag(3)# matrice diagonale de taille 3 [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 De la même façon que pour les vecteurs: - matrice[i,]:permet d'afficher la i ème ligne de votre matrice - matrice[,j]: permet d'afficher la j ème colonne de votre matrice - matrice[i,j]: permet d'afficher l'élément placé à la i ème ligne j ème colonne - matrice[condition lignes,]: permet d'afficher uniquement les lignes de la matrice respectant la condition - matrice[,condition colonne]: permet d'afficher uniquement les colonnes de la matrice respectant la condition Pour connaître la dimension d'une matrice, on utilise l'instruction dim(). De même pour connaître le nombre de ligne avec l'instruction nrow() et le nombre de colonne avec ncol(). On peut aussi effectuer des opérations sur les matrices: > (mat=matrix(1:9,nrow=3,byrow=t)) [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 > t(mat)# transposée de la matrice [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > mat*3# multiplication de chaque élément de la matrice par 3 [,1] [,2] [,3] [1,] 3 6 9 [2,] 12 15 18 [3,] 21 24 27 > t(mat)*mat #multiplication terme à terme [,1] [,2] [,3] [1,] 1 8 21 14

[2,] 8 25 48 [3,] 21 48 81 > t(mat)%*%mat # produit matriciel [,1] [,2] [,3] [1,] 66 78 90 [2,] 78 93 108 [3,] 90 108 126 > cbind(mat,t(mat))#concaténation par colonne [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 1 4 7 [2,] 4 5 6 2 5 8 [3,] 7 8 9 3 6 9 > rbind(mat,t(mat))#concaténation par ligne [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 [4,] 1 4 7 [5,] 2 5 8 [6,] 3 6 9 > mat[1,1] [1] 1 > mat[1,1]=6 > mat [,1] [,2] [,3] [1,] 6 2 3 [2,] 4 5 6 [3,] 7 8 9 > solve(mat)# inverse de la matrice [,1] [,2] [,3] [1,] 0.2-0.400000 0.200000 [2,] -0.4-2.200000 1.600000 [3,] 0.2 2.266667-1.466667 > round(mat%*%solve(mat)) [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 > diag(mat)# diagonale de la matrice [1] 6 5 9 2.5. Les listes Les listes sont des collections d'objets (vecteurs, matrices) qui ne sont pas nécessairement du même type. Elles sont utilisées par de nombreuses fonctions pour retourner les résultats et permettent en particulier de stocker et manipuler simplement des objets de longueurs différentes dans une même structure. On crée une liste avec la fonction list(). Chaque élément de la liste peut être appelé soit en utilisant: - son nom précédé de $ - son indice entre double crochet [[.]]. > x=4 > hauteur=c(130,300,170) > matrice=matrix(1:15,ncol=3) > couleur=c("rouge","vert","jaune","blanc") > liste1=list(x,hauteur,matrice,couleur) > liste1 15

> names(liste1)=c("a","b","c","d") > liste1 $a [1] 4 $b [1] 130 300 170 $c [,1] [,2] [,3] [1,] 1 6 11 [2,] 2 7 12 [3,] 3 8 13 [4,] 4 9 14 [5,] 5 10 15 $d [1] "Rouge" "Vert" "Jaune" "Blanc" 2.6. Une structure importante sous R: les data frames Les data frame se présentent sous la forme d'une matrice dont les colonnes sont des variables et peuvent être de différents types (numérique, caractère, logique...). Ce format est bien adapté au stockage de données statistiques ou les individus sont en lignes et les variables sont en colonnes. Chaque variable a un nom. Par défaut, le nom de chaque variable est X ou V suivi du numéro de colonne. Pour créer un data frame, il suffit d'utiliser la fonction data.frame(). On peut créer un data frame à partir d'une matrice et modifier le nom des variables à l'aide de l'instruction colnames(). > data.frame(mat) X1 X2 X3 1 6 2 3 2 4 5 6 3 7 8 9 > data=data.frame(mat) > colnames(data) [1] "X1" "X2" "X3" > colnames(data)=c("var1","var2","var3") > data var1 var2 var3 1 6 2 3 2 4 5 6 3 7 8 9 Les data frame se manipulent à la fois comme des matrices et comme des listes. Les instructions dim(), nrow() et ncol() restent valables. Plusieurs façons pour accéder au contenu d'une variable: data$nom_var data[,position_var]# comme pour les matrices data[,c("nom_var"] Une fois le data frame crée, on peut le modifier, ajouter/supprimer des variables, modifier le contenu des variables... 16

Création de variables supplémentaires: > data$var4=na > data var1 var2 var3 var4 1 6 2 3 NA 2 4 5 6 NA 3 7 8 9 NA > (data$var4=c(1,3,4)) var1 var2 var3 var4 1 6 2 3 1 2 4 5 6 3 3 7 8 9 4 > data$var5=na > data$var5=c("femme","homme","femme") > data var1 var2 var3 var4 var5 1 6 2 3 1 femme 2 4 5 6 3 homme 3 7 8 9 4 femme > colnames(data) [1] "var1" "var2" "var3" "var4" "var5" > colnames(data)=c("var1", "var2", "var3", "var4", "sexe") > data var1 var2 var3 var4 sexe 1 6 2 3 1 femme 2 4 5 6 3 homme 3 7 8 9 4 femme > data=data[,-2] > data var1 var3 var4 sexe 1 6 3 1 femme 2 4 6 3 homme 3 7 9 4 femme Lorsque l'on importe un fichier sous R, celui-ci est automatiquement convertit en data frame. La suite de cette présentation concerne principalement le traitement et l'analyse de ce type de données. 3. Analyse générale d'un fichier de données 3.1. Description générale du fichier de données Nous allons travailler avec plusieurs fichiers de données. Pour commencer, nous allons travailler sur une base de données contenue dans le package MASS. Pour cela il faut d'abord charger la librairie en mémoire. Le package MASS fait partie des packages contenu par défaut dans R lors de son installation. Le fichier est Aids2. Toute base de données d'un package se charge avec la commande data(). Cette base contient des données sur 2843 patients chez lesquels on a diagnostiqué le SIDA en Australie avant le 1er juillet 1991. Descriptif du fichier de données (que vous pouvez aussi obtenir avec?aids2): state: Grouped state of origin: "NSW "includes ACT and "other" is WA, SA, NT and TAS. 17

sex: Sex of patient. diag: (Julian) date of diagnosis. death: (Julian) date of death or end of observation. status: "A" (alive) or "D" (dead) at end of observation. T.categ: Reported transmission category. age: Age (years) at diagnosis. > library(mass) # chargement de la librairie MASS > data(aids2) # chargement de la base Aids2 > colnames(aids2) # noms des variables du data frame Aids2 [1] "state" "sex" "diag" "death" "status" "T.categ" "age" > dim(aids2) [1] 2843 7 > head(aids2) # affichage des 6 premières lignes du fichier, permet de voir la tête de Aids2 state sex diag death status T.categ age 1 NSW M 10905 11081 D hs 35 2 NSW M 11029 11096 D hs 53 3 NSW M 9551 9983 D hs 42 4 NSW M 9577 9654 D haem 44 5 NSW M 10015 10290 D hs 39 6 NSW M 9971 10344 D hs 36 Pour connaître la class d'un objet (son type), on utilise l'instruction class(): > class(aids2) [1] "data.frame" On peut aussi utiliser la fonction str() pour avoir une description rapide des données. Cette fonction donne - le type de l'objet considéré (ici, un data frame) - la dimension du data frame (nombre de variables et d'observations) - le nom de chaque variable du data frame avec son type et ses premières valeurs > str(aids2) 'data.frame': 2843 obs. of 7 variables: $ state : Factor w/ 4 levels "NSW","Other",..: 1 1 1 1 1 1 1 1 1 1... $ sex : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2... $ diag : int 10905 11029 9551 9577 10015 9971 10746 10042 10464 10439... $ death : int 11081 11096 9983 9654 10290 10344 11135 11069 10956 10873... $ status : Factor w/ 2 levels "A","D": 2 2 2 2 2 2 2 2 2 2... $ T.categ: Factor w/ 8 levels "hs","hsid","id",..: 1 1 1 5 1 1 8 1 1 2... $ age : int 35 53 42 44 39 36 36 31 26 27... 3.2. La commande summary() La commande summary() est très utile pour obtenir un résumé de chaque variable du data frame. Les informations fournies par cette commande dépendent du type de variable. Par exemple, pour les variables sex et status de type qualitatives, elle nous fournit les effectifs de chaque modalité. Pour la variable age de type numérique, elle nous fournit la moyenne, médiane, premier et troisième quartile, et l'étendue des valeurs. S'il y avait des données manquantes, leur nombre serait aussi précisé. > summary(aids2) state sex diag death status T.categ age NSW :1780 F: 89 Min. : 8302 Min. : 8469 A:1082 hs :2465 Min. : 0.00 18

Other: 249 M:2754 1st Qu.:10163 1st Qu.:10672 D:1761 blood : 94 1st Qu.:30.00 QLD : 226 Median :10665 Median :11235 hsid : 72 Median :37.00 VIC : 588 Mean :10584 Mean :10990 other : 70 Mean :37.41 3rd Qu.:11103 3rd Qu.:11504 id : 48 3rd Qu.:43.00 Max. :11503 Max. :11504 haem : 46 Max. :82.00 (Other): 48 Ici, les dates diag et death sont exprimées en nombre de jour depuis le 1er janvier 1960. Elles sont considérées comme des variables numériques. Nous verrons comment modifier le format d'affichage de ces dates. La variable T.categ a huit modalités: la fonction summary() ne permet d'afficher que 6 modalités maximum (les plus fréquentes), les autres apparaissent dans (Other). Si l'on veut connaître l'occurrence de chaque modalité, on utilise la commande table(). La commande nlevels() permet de connaître le nombre de niveaux d'une variable qualitative et la commande levels() le nom de chaque niveau. >table(aids2$t.categ) hs hsid id het haem blood mother other 2465 72 48 41 46 94 7 70 >levels(aids2$t.categ) [1] "hs" "hsid" "id" "het" "haem" "blood" "mother" "other" > nlevels(aids$t.categ) # pour connaître le nombre de niveaux [1] 8 3.3. Quelques statistiques Pour les variables quantitatives, on peut vouloir connaître la moyenne, écart-type, quantiles, min et max de manière séparée de la commande summary(). Pour la variable age, par exemple: > mean(aids2$age) [1] 37.40907 > median(aids2$age) [1] 37 > var(aids2$age) [1] 101.2693 > sd(aids2$age) [1] 10.06326 > min(aids2$age) [1] 0 > max(aids2$age) [1] 82 > quantile(aids2$age) 0% 25% 50% 75% 100% 0 30 37 43 82 > range(aids2$age) [1] 0 82 3.4. Connaître le type d'une variable: commandes class() et mode() Les instructions class() et mode() permettent de connaître le type d'un objet. Elles sont complémentaires. > class(aids2) [1] "data.frame" > class(aids2$t.categ) 19

[1] "factor" > class(aids2$sex) [1] "factor" > class(aids2$age) [1] "integer" > mode(aids2$age) [1] "numeric" On peut aussi tester si une variable est de type numérique ou catégorielle par exemple. Ces fonctions renvoient un booléen prenant la valeur TRUE si la condition est vérifiée et FALSE sinon. Les fonctions avec le préfixe "is." teste si une condition est respectée (similaire au langage C). > is.numeric(aids2$sex) [1] FALSE > is.factor(aids2$sex) [1] TRUE > is.factor(aids2$t.categ) [1] TRUE > is.character(aids2$t.categ) [1] FALSE 3.5. Modifier le type d'une variable De façon complémentaire, les fonctions avec le préfixe "as." permettent de modifier le type d'une variable. > class(aids1$age) [1] "integer" > mode(aids1$age) [1] "numeric" > AIDS1$age=as.factor(AIDS1$age)## modification de la variable age en facteur > levels(aids1$age) [1] "0" "1" "3" "5" "6" "9" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" "71" "72" "73" "74" "77" "78" "80" "82" 3.6. Les données manquantes La table Aids2 ne contient pas de données manquantes, sinon la commande summary() nous aurait donné le nombre de données manquantes pour chaque variable. On va introduire quelques données manquantes dans la variable age à l'aide de l'éditeur (commande fix()). Pour pouvoir calculer la moyenne ou obtenir d'autres statistique sur la variable âge, on est obligé de spécifier l'option na.rm=true. > fix(aids) > mean(aids$age) [1] NA >?mean > mean(aids$age,na.rm=true) [1] 37.3993 Pour savoir quels éléments de Aids2$age sont manquants: on crée un booléen avec la commande is.na(). Cette commande renvoi TRUE si l'élément i est manquant et FALSE sinon. Ensuite, on affiche la position des éléments pour lesquels la donnée de l'âge est manquante: 20

> which(is.na(aids2$age)) [1] 3 9 18 4. Sélection ou suppression de données ou de variables 4.1. Sélection d'observations Comme pour les vecteurs et les matrices, on peut ne vouloir afficher que certaines observations du data frame: - Pour n'afficher que certaines observations d'une variable, plusieurs façons: 1. nom_dataframe$nom_variable[condition]. 2. nom_dataframe[condition,"nom_variable"] 3.. nom_dataframe[condition,position variable]. Pour n'afficher que certaines observations du data frame: nom_data[condition,]. Par exemple, - sélection des données de la table Aids2 relatives aux femmes: > AIDS_select=Aids2[Aids2$sex=="F",] > dim(aids_select) [1] 89 7 - sélection des données relatives aux femmes de moins de 35 ans: > AIDS_select=Aids2[(Aids2$sex=="F")&(Aids2$age<35),] > dim(aids_select) [1] 47 7 - sélection des données relatives aux hommes de moins de 35 ans et encore en vie à la fin de l'étude: > AIDS_select=Aids2[(Aids2$sex=="M")&(Aids2$age<35)&(Aids2$status=="A"),] > dim(aids_select) [1] 552 7 Pour afficher la variable status du data frame pour les femmes uniquement: > Aids2[(Aids2$sex=="F"),"status"] ou bien, de façon équivalente: > Aids2$status[(Aids2$sex=="F")] 4.2. Suppression d'observations Ici, on souhaite supprimer les observations respectant une condition. Pour n'afficher que certaines observations d'une variable: nom_dataframe$nom_var[!condition]. Pour n'afficher que certaines observations du data frame: nom_data[!condition,]. Par exemple, - suppression des données relatives aux femmes: > AIDS_select=Aids2[Aids2$sex!="F",] > dim(aids_select) [1] 2754 7 21

- suppression des données relatives aux femmes de moins de 35 ans: > AIDS_select=Aids2[!((Aids2$sex=="F")&(Aids2$age<35)),] > dim(aids_select) [1] 2796 7 # vérification: AIDS_select$age[AIDS_select$sex=="F"]<35 # [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE - suppression des données relatives aux hommes et des personnes (hommes ou femmes) de moins de 40 ans: AIDS_select=Aids2[!(Aids2$sex=="M")&!(Aids2$age<40),] dim(aids_select) #[1] 39 7 - suppression des données relatives aux hommes de moins de 35 ans et des personnes encore en vie à la fin de l'étude: > AIDS_select=Aids2[!((Aids2$sex=="M")&(Aids2$age<35))&!(Aids2$status=="A"),] > dim(aids_select) [1] 1065 7 # vérification: > AIDS_select$status[AIDS_select$age[AIDS_select$sex=="M"]<35] > which(aids_select$age[aids_select$sex=="m"]<35) > which(aids_select$status=="a") La commande which() nous permet de connaître quels patients (quelles observations) vérifient la condition i.e. pour lesquels la condition = TRUE. Cette fonction peut être très utile pour connaitre l'identifiant ligne des patients pour lesquels une condition est respectée. 4.3. Réordonner un fichier selon les valeurs d'une variable: commande order() Pour réordonner un fichier selon les valeurs prises par une variable, il suffit d'utiliser la fonction order() sur cette variable. Cette fonction renvoie les numéro des observations triées par ordre croissant. Pour les avoir par ordre décroissant, il suffit de spécifier l'option decreasing=true. > AIDS=Aids2 > AIDS=AIDS[order(AIDS$age),] > AIDS$age 4.4. Modifier le nom d'une variable Les noms des variables sont accessibles par l'instruction colnames(). Cette fonction renvoyant un vecteur avec le nom de chaque variable du data frame, il est possible de modifier le nom de l'ensemble des variables ou d'un sous-ensemble. > colnames(aids) [1] "state" "sex" "diag" "death" "status" "T.categ" "age" Modifier le nom de la variable diagnostic: 22

1. par l'appel de sa position: > colnames(aids)[3]="diagnostic" > colnames(aids) [1] "state" "sex" "diagnostic" "death" "status" "T.categ" "age" 2. par recherche de sa position colnames(aids)[names(aids)=="diag"]="diagnostic" 4.5. Extraire une chaîne de caractères Pour cela, on utilise la fonction substr(var,start,stop) où start est la position de départ et stop la position finale que l'on extrait. Pour illustrer cette fonction, on va utiliser la base villes.dta de la formation STATA contenant des codes postaux. S'agissant d'un fichier STATA, nous devons utiliser le package foreign pour pouvoir charger le fichier dans R. Ce package ne faisant pas partie des librairies contenues par défaut dans R, il faut soit télécharger le fichier.zip sur le site dans CRAN et l'installer depuis les fichiers.zip, soit le télécharger depuis un miroir CRAN. Une fois le package installé, il faut charger la librairie en mémoire avec l'instruction library(). La lecture de la table se fait avec l'instruction read.dta(). Si vous n'avez pas modifié le répertoire courant en choisissant le dossier où le fichier villes.dta est enregistré, vous devez préciser le chemin d'accès du fichier dans l'instruction read.dta(). # Chargement du package foreign > library(foreign) # Lecture du fichier villes.dta et création du data frame villes > villes=read.dta("villes.dta") # Le fichier villes contient 63 observations et 4 variables > dim(villes) [1] 63 4 # Nom des variables: > colnames(villes) [1] "num_patient" "adresse1" "cp1" "ville1" # Les premières lignes du fichier: > head(villes) num_patient adresse1 cp1 ville1 1 4312 1 RUE DES CARRONS 25400 ST EDOUART 2 24828 1 RUE DES GRANGES 25110 ST MARCELIN 3 2899 1 RUE DES CERISIERS 25310 ST AGNAN 4 841 1 RUE DE ROSSEY 25150 DAMBELIN 5 13012 1 RUE DES CHAMPS 25600 DAMBENOIS 6 1829 1 RUE DES AIGUILLOTTES 25230 DASLE Une fois le fichier chargé, nous souhaiterions créer une variable dep qui correspondra au numéro de département du patient. Pour cela, on souhaite extraire les deux premiers chiffres du code postal de la variable cp1: > villes$dep=substr(villes$cp1,1,2) > class(villes$dep) [1] "character" 23

La variable ainsi crée est de type caractère, si on veut qu'elle soit de type facteur il faut réaliser l'instruction suivante: > villes$dep=as.factor(villes$dep) > table(villes$dep) 16 17 25 38 69 79 86 90 # niveau 1 1 50 4 2 1 1 3 # nombre de patients par niveau 4.6. Gestion des dates Variables caractère en format date reconnu par R: > mini=read.dta("base_registre.dta") > dim(mini) [1] 18086 14 > colnames(mini) [1] "id" "i_sexe" "t_diag_topo "t_diag_morpho" "morphostr" "loc" "anais" "mnais" "jnais" "adiag" "mdiag" "jdiag" "datediag" "datediagstr" > head(mini) > class(mini$datediagstr) [1] "character" > mini$date_diag=as.date(mini$datediagstr,"%d/%m/%y") Variable numérique (nombre de jours depuis le 1er janvier 1960) en format date: > AIDS=Aids2 > head(aids2) state sex diag death status T.categ age 1 NSW M 10905 11081 D hs 35 2 NSW M 11029 11096 D hs 53 3 NSW M 9551 9983 D hs 42 4 NSW M 9577 9654 D haem 44 5 NSW M 10015 10290 D hs 39 6 NSW M 9971 10344 D hs 36 > mode(aids$diag) [1] "numeric" > AIDS$diag=as.Date(AIDS$diag,origin="1960-01-01") > AIDS$death=as.Date(AIDS$death,origin="1960-01-01") 5. Création et manipulation du contenu de variables 5.1. Création de variables booléennes On travaille ici avec le fichier Aids2 de la librairie MASS. Nous allons créer une variable sexe_female qui sera une variable booléenne, i.e. si le patient est une femme, alors sexe_female=true, sinon, sexe_female=false. Cette variable sera un vecteur qui n'appartiendra pas au data frame. > sex_female=(aids2$sex=="f") On vérifie que l'on n'a pas fait d'erreur: > sex_female[1:10] [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE > Aids2$sex[1:10] [1] M M M M M M M M M M 24

Levels: F M On a bien les dix premiers éléments de sex_female qui sont FALSE et les 10 premiers patients de Aids2 sont bien des hommes. Si l'on veut connaître la position des valeurs TRUE de sex_female, on utilise la commande which(): > which(sex_female==true) [1] 31 66 86 93 105 170 191 230 278 279 332 345 348 355 362 [16] 410 437 474 480 510 531 577 580 583 632 646 746 764 810 813 [31] 862 987 1077 1223 1237 1287 1314 1315 1413 1442 1444 1449 1466 1475 1547 [46] 1548 1571 1637 1657 1712 1729 1746 1758 1772 1795 1802 1819 1838 1891 1918 [61] 1941 1981 2002 2022 2063 2087 2112 2115 2184 2237 2238 2321 2322 2346 2445 [76] 2470 2483 2525 2590 2615 2696 2721 2727 2764 2773 2793 2798 2809 2840 > length(which(sex_female==true)) [1] 89 On peut ensuite vérifier que les patients pour lesquels sex_female == TRUE sont bien des femmes: > Aids2$sex[sex_female==T] [1] F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F [39] F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F [77] F F F F F F F F F F F F F Levels: F M 5.2. Création de variables dichotomiques Nous allons ensuite créer une variable female qui sera une variable dichotomique. Cette variable prendra la modalité 1 si le patient est une femme et 0 si c'est un homme. Cette variable sera un vecteur qui n'appartiendra pas au data frame. Pour cela, le plus simple est de créer un vecteur de la taille voulue et prenant la valeur 0. Ensuite, on attribue la valeur 1 aux patients respectant la condition donnée entre crochets. Enfin, on impose que cette variable soit catégorielle. > female=rep(0,length(sex_female)) > female[sex_female]=1 > mode(female) [1] "numeric" > female=as.factor(female) > levels(female) [1] "0" "1" Pour intégrer cette variable au data frame, il suffit d'exécuter l'instruction suivante: > AIDS$ind_sexF=female Cette instruction crée automatiquement la variable ind_sexf et lui attribue la valeur de female pour chaque individu. 25

5.3. Création de variables en classes Maintenant, nous allons créer une variable age_c qui aura 4 modalités selon la classe d'âge de l'individus en prenant les valeurs des quartiles. Cette variable sera une variable supplémentaire dans le data frame et sera de type facteur. Tout d'abord on crée une variable age_c qui est manquante initialement. > AIDS=Aids2 # copie de la table Aids2 > AIDS$age_c=NA # création d'une variable age_c qui est manquante initialement > summary(aids$age) Min. 1st Qu. Median Mean 3rd Qu. Max. 0.00 30.00 37.00 37.41 43.00 82.00 Ensuite, il y a plusieurs possibilités: 1. en précisant la création de chaque niveau un par 1 (un peu lourd et fastidieux): > AIDS$age_c[AIDS$age<=30]=1 > AIDS$age_c[AIDS$age>43]=4 > AIDS$age_c[(AIDS$age<=37)&(AIDS$age>30)]=2 > AIDS$age_c[(AIDS$age<=43)&(AIDS$age>37)]=3 > summary(aids$age_c) Min. 1st Qu. Median Mean 3rd Qu. Max. 1.00 1.00 2.00 2.44 3.00 4.00 > AIDS$age_c=as.factor(AIDS$age_c) > levels(aids$age_c) [1] "1" "2" "3" "4" 2. Autre possibilité beaucoup plus simple: utilisation de l'instruction cut() > AIDS$agec [cut(aids$age,4)] On précise ainsi que l'on veut 4 classes ici et la variable en classe d'âge est directement crée. 5.4. Création de n variables quantitatives en fonction d'autres variables On peut par exemple vouloir créer une variable qui soit constante et égale à la moyenne d'une variable quantitative du fichier. Pour cela, on peut réaliser les opérations suivantes: > AIDS$moy_age=mean(AIDS$age) > AIDS$moy_age=round(AIDS$moy_age,2)# pour prendre la valeur arrondie à la 2ème décimale Ensuite, on peut vouloir créer une variable qui soit égale à la différence de deux variables quantitatives du fichier. > AIDS$age_diff=AIDS$age-AIDS$moy_age 6. Combiner des fichiers de données: commande merge() 26

Lorsque l'on veut fusionner deux fichiers, on utilise la commande merge(). Cette commande permet à la fois de rajouter des observations, donc des lignes dans un data frame, et de rajouter des variables, donc des colonnes. Pour illustrer cette commande, nous allons utiliser le fichier Aids2. 6.1. Ajouter des observations Pour illustrer l'utilisation de cette commande, on va séparer le fichier Aids2 en deux fichiers: le premier contenant les données relatives aux hommes et le second celles relatives aux femmes. Ensuite, on utilise la commande merge() pour fusionner les deux fichiers ainsi crées: > AIDS_Hommes=AIDS[AIDS$sex=="M",] > AIDS_Femmes=AIDS[AIDS$sex=="F",] > AIDS_merge=merge(AIDS_Hommes,AIDS_Femmes,all=TRUE) > dim(aids_hommes) [1] 2754 7 > dim(aids_femmes) [1] 89 7 > dim(aids_merge) [1] 2843 7 > dim(aids) [1] 2843 7 Le fichier fusionné contient bien 2843 observations, comme le fichier d'origine. 6.2. Ajouter des variables Pour illustrer l'ajout de variables avec la commande merge(), on sélectionne dans un premier fichier l'identifiant patient, le sexe et l'âge et dans un second l'identifiant patient, la date de diagnostic et la date de dernières nouvelles. Ensuite, on réalise la fusion en précisant la variable identifiant. > AIDS_1=AIDS[,c("id_pat","sex","age")] > AIDS_2=AIDS[,c("id_pat","diag","death")] > AIDS_3=merge(AIDS_1,AIDS_2,by.x="id_pat") 7. Transposer un fichier/échange des lignes et des colonnes: commande reshape() Que ce soit pour passer du format long au format wide ou inversement, on utilise la commande reshape(). Cette commande est très utile lorsque l'on veut pouvoir modifier l'apparence d'un fichier de données. Pour illustrer cette commande, on va utiliser une partie d'un fichier de données qdv.dta qui est un fichier STATA. S'agissant d'un fichier STATA, il est nécessaire de charger librairie foreign si ce n'est pas encore fait. Chargement de la librairie foreign et du fichier de données et sélection des variables d'intérêt: 27

> library(foreign) > qdv=read.dta("qdv.dta") On Sélectionne les variables tumeur (identifiant du patient), suivi (indicateur du temps de mesure), rt, ct, stade qui nous indique si le patient est sous radiothérapie, chimiothérapie et le stade de la maladie ainsi que quelques scores de qualité de vie du QLQ-C30 mesuré à plusieurs temps (suivi). Les variables rt, ct, stade et tumeur restent identique au cours du temps pour un même patient, en revanche, les scores varient au cours du temps. > ## sélection des variables que l'on souhaite garder > qdv_s=qdv[,c(1,2,7,8,10,29:38)] > colnames(qdv_s) [1] "tumeur" "suivi" "rt" "ct" "stade" "gh" "pf" "rf" "ef" "cf" "sf" "fa" "na" "pa" "a" 7.1. Passer du format "long" au format "wide" reshape(data,timevar="identifiant_temps",idvar=c("var_constante1","v ar_constante2"), direction="wide") Pour commencer, on va faire une transposition en gardant uniquement les variables: - tumeur: identique au cours du temps pour un même patient -suivi: indicateur du temps de mesure -gh: score de qualité de vie/santé globale, varie au cours du temps pour un même patient > qdv_long1=qdv_s[,c(1,2,6)] > qdv_wide=reshape(qdv_long1,timevar="suivi",idvar="tumeur",direction="wide") > colnames(qdv_wide) > head(qdv_wide) Ensuite, on va faire une transposition en gardant les variables: - tumeur, rt, ct, stade: identiques au cours du temps pour un même patient -suivi: indicateur du temps de mesure -gh: score de qualité de vie/santé globale, varie au cours du temps pour un même patient > qdv_long2=qdv_s[,c(1:6)] > colnames(qdv_long2) >qdv_wide2=reshape(qdv_long2,v.names="gh",timevar="suivi",idvar=c("tumeur","rt","ct","stade"), direction="wide") > colnames(qdv_wide2) > head(qdv_wide2) Maintenant, on va faire une transposition en gardant les variables: - tumeur, rt, ct, stade (identiques au cours du temps pour un même patient) -suivi (indicateur du temps de mesure) -gh, pf, rf (scores de qualité de vie, varient au cours du temps pour un même patient) > qdv_long3=qdv_s[,c(1:8)] > colnames(qdv_long3) >qdv_wide3=reshape(qdv_long3,v.names=c("gh","pf","rf"),timevar="suivi",idvar=c("tumeur","rt"," ct","stade"),direction="wide") > colnames(qdv_wide3) > head(qdv_wide3) 28

Pour finir, on va faire une transposition sur l'ensemble des variables du fichier: > colnames(qdv_s) [1] "tumeur" "suivi" "rt" "ct" "stade" "gh" "pf" "rf" [9] "ef" "cf" "sf" "fa" "na" "pa" "a" > qdv_wide4=reshape(qdv_s,,timevar="suivi",idvar=c("tumeur","rt","ct","stade"),direction="wide") > colnames(qdv_wide4) [1] "tumeur" "rt" "ct" "stade" "gh.0" "pf.0" "rf.0" "ef.0" [9] "cf.0" "sf.0" "fa.0" "na.0" "pa.0" "a.0" "gh.1" "pf.1" [17] "rf.1" "ef.1" "cf.1" "sf.1" "fa.1" "na.1" "pa.1" "a.1" [25] "gh.2" "pf.2" "rf.2" "ef.2" "cf.2" "sf.2" "fa.2" "na.2" [33] "pa.2" "a.2" "gh.3" "pf.3" "rf.3" "ef.3" "cf.3" "sf.3" [41] "fa.3" "na.3" "pa.3" "a.3" > ############################### > # on vérifie pour le premier patient "T030000001" qu'il n'y pas eu d'erreur: > ############################### > qdv_s[(qdv_s$tumeur=="t030000001"),] tumeur suivi rt ct stade gh pf rf ef cf 1 T030000001 0 non non I 25.00000 40.00000 0.00000 0.00000 66.66666 2 T030000001 1 non non I 50.00000 60.00000 33.33333 91.66666 33.33333 3 T030000001 2 non non I 16.66667 60.00000 33.33333 16.66667 50.00000 4 T030000001 3 non non I 0.00000 53.33333 33.33333 33.33333 66.66666 sf fa na pa a 1 100.00000 100.00000 0 83.33334 66.66666 2 33.33333 66.66666 0 66.66666 66.66666 3 16.66667 66.66666 50 100.00000 33.33333 4 66.66666 55.55556 0 66.66666 33.33333 > qdv_wide4[(qdv_wide4$tumeur=="t030000001"),] tumeur rt ct stade gh.0 pf.0 rf.0 ef.0 cf.0 sf.0 fa.0 na.0 pa.0 1 T030000001 non non I 25 40 0 0 66.66666 100 100 0 83.33334 a.0 gh.1 pf.1 rf.1 ef.1 cf.1 sf.1 fa.1 na.1 pa.1 1 66.66666 50 60 33.33333 91.66666 33.33333 33.33333 66.66666 0 66.66666 a.1 gh.2 pf.2 rf.2 ef.2 cf.2 sf.2 fa.2 na.2 pa.2 1 66.66666 16.66667 60 33.33333 16.66667 50 16.66667 66.66666 50 100 a.2 gh.3 pf.3 rf.3 ef.3 cf.3 sf.3 fa.3 na.3 1 33.33333 0 53.33333 33.33333 33.33333 66.66666 66.66666 55.55556 0 pa.3 a.3 1 66.66666 33.33333 7.2. Passer du format "wide" au format "long" reshape(data,timevar="identifiant_temps",idvar=c("var_constante1","v ar_constante2"), varying="position des variables qui varient au cours du temps",direction="long") Maintenant, on réalise l'étape inverse. Tout d'abord avec la table qdv_wide dans laquelle on avait gardé tumeur, suivi et gh. > colnames(qdv_wide) [1] "tumeur" "gh.0" "gh.1" "gh.2" "gh.3" >qdv_long_after_wide=reshape(qdv_wide,v.names="gh",timevar="suivi",idvar="tumeur",direction="l ong") > colnames(qdv_long_after_wide) [1] "tumeur" "suivi" "gh.0" > head(qdv_long_after_wide) tumeur suivi gh.0 T030000001.0 T030000001 0 25.00000 T030000002.0 T030000002 0 NA T030000005.0 T030000005 0 33.33333 29

T030000008.0 T030000008 0 NA T030000010.0 T030000010 0 NA T030000011.0 T030000011 0 75.00000 Ensuite sur la table qdv_wide3 dans laquelle on avait gardé tumeur, suivi et les scores gh, pf et rf. > colnames(qdv_wide3) [1] "tumeur" "rt" "ct" "stade" "gh.0" "pf.0" "rf.0" "gh.1" [9] "pf.1" "rf.1" "gh.2" "pf.2" "rf.2" "gh.3" "pf.3" "rf.3" > qdv_long_3=reshape(qdv_wide3,varying=5:16,idvar=c("tumeur","rt","ct","stade"),direction="long") > colnames(qdv_long_3) [1] "tumeur" "rt" "ct" "stade" "time" "gh" "pf" "rf" > dim(qdv_long_3) [1] 252 8 > dim(qdv_wide3) [1] 63 16 Etape de vérification: > qdv_s[(qdv_s$tumeur=="t030000001"),c("tumeur","gh","pf","rf")] tumeur gh pf rf 1 T030000001 25.00000 40.00000 0.00000 2 T030000001 50.00000 60.00000 33.33333 3 T030000001 16.66667 60.00000 33.33333 4 T030000001 0.00000 53.33333 33.33333 > qdv_long_3[(qdv_long_3$tumeur=="t030000001"),] tumeur rt ct stade time gh pf rf T030000001.non.non.I.0 T030000001 non non I 0 25.00000 40.00000 0.00000 T030000001.non.non.I.1 T030000001 non non I 1 50.00000 60.00000 33.33333 T030000001.non.non.I.2 T030000001 non non I 2 16.66667 60.00000 33.33333 T030000001.non.non.I.3 T030000001 non non I 3 0.00000 53.33333 33.33333 8. Les tests statistiques 8.1. Tableaux à plat, tableaux croisés Un tableau à plat, de même qu'un tableau croisé s'obtient avec la commande table(). # tableau à plat table(qdv$rt) non oui 224 28 # tableau croisé > table(qdv[,c("ct","rt")]) rt ct non oui non 148 16 oui 76 12 > addmargins(table(qdv[,c("ct","rt")])) rt ct non oui Sum 30

non 148 16 164 oui 76 12 88 Sum 224 28 252 > margin.table(addmargins(table(qdv[,c("ct","rt")]))) [1] 1008 > prop.table(addmargins(table(qdv[,c("ct","rt")]))) rt ct non oui Sum non 0.14682540 0.01587302 0.16269841 oui 0.07539683 0.01190476 0.08730159 Sum 0.22222222 0.02777778 0.25000000 8.2. Test de comparaison de deux proportions chisq.test(data$varcat1,data$varcat2,correct=false) fisher.test(data$varcat1,data$varcat2) > chisq.test(qdv$rt,qdv$ct,correct=false) Pearson's Chi-squared test data: qdv$rt and qdv$ct X-squared = 0.8731, df = 1, p-value = 0.3501 > fisher.test(qdv$rt,qdv$ct) Fisher's Exact Test for Count Data data: qdv$rt and qdv$ct p-value = 0.4018 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.5968641 3.4778164 sample estimates: odds ratio 1.4583 8.3. Test d'une corrélation significative cor.test(table$var1,table$var2) > cor.test(qdv$spitzer,qdv$gh) Pearson's product-moment correlation data: qdv$spitzer and qdv$gh t = 5.5785, df = 100, p-value = 2.075e-07 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.3233341 0.6226575 sample estimates: cor 0.4871752 Conclusion: l'hypothèse H0 peut être rejetée au seuil 5%. Corrélation significative. 31

8.4. Test de comparaison de variances: test de Fisher Snedecor var.test(table$var1,table$var2) 8.5. Test de comparaison de deux moyennes Tests paramètriques: 1. Comparaison d'une moyenne à une moyenne théorique: t.test(data$varcont, mu=moyenne) 2. Comparaison de deux moyennes observées: t.test(data$varcont1~data$varbin1, var.equal=true) t.test(data$varcont1~data$varbin1, var.equal=false) 3. Comparaison de deux moyennes observées sur échantillons appariés: t.test(data$varcont1~data$varbin1, paired=true) Tests non paramétriques: wilcox.test(data$varcont1~data$varbin1) > wilcox.test(aids2$age~aids2$sex) Wilcoxon rank sum test with continuity correction data: Aids2$age by Aids2$sex W = 117987.5, p-value = 0.549 alternative hypothesis: true location shift is not equal to 0 8.6. Les variables aléatoires et échantillonnages Voici quelques éléments pour créer des variables aléatoires et des séquences alétoires. > sample(1:20,5)# crée un échantillon aléatoire de la séquence 1:20 de taille 5 [1] 3 1 5 18 4 > sample(1:20)# permutation aléatoire de la séquence 1:20 [1] 1 13 9 17 2 20 5 15 16 12 18 3 14 4 8 11 6 7 10 19 n réalisations d'une loi de Bernoulli (tirage de pile ou face): > sample(c(0,1), 50, replace = TRUE) [1] 1 1 0 1 0 1 0 1 0 1 1 0 0 0 1 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 [39] 0 1 1 1 0 1 0 1 0 1 0 1 Tirage aléatoire de 0/1 avec ou sans remise (replace=false par défaut). > sample(c(0,1), replace = FALSE) [1] 0 1 > sample(c(0,1), replace = FALSE) [1] 1 0 > sample(c(0,1), replace = FALSE) 32

[1] 0 1 > sample(c(0,1), replace = FALSE) [1] 0 1 > sample(c(0,1), replace = TRUE) [1] 0 0 > sample(c(0,1), replace = TRUE) [1] 1 0 > sample(c(0,1), replace = TRUE) [1] 0 1 8.6.1. Loi uniforme et autres lois de probabilités # 20 réalisations d'une loi uniforme entre 0 et 1: > runif(20) [1] 0.27754934 0.58110145 0.40531029 0.15263125 0.50923553 0.66405700 [7] 0.51947131 0.89769775 0.67363364 0.15216645 0.48252971 0.52871839 [13] 0.71322282 0.63601906 0.76086735 0.19114188 0.06254240 0.58009935 [19] 0.09866782 0.61568320 # 20 réalisations d'une loi uniforme entre 1 et 20: > runif(20,min=1,max=20) [1] 4.505748 19.726462 13.719521 9.737681 9.778363 4.270021 12.256805 [8] 8.558993 19.022297 10.834520 13.919837 5.207513 15.363084 5.806898 [15] 1.088306 15.841420 16.612543 13.368383 5.594059 3.820599 Autres lois de probabilités: Loi binomiale :binom Loi mulitnomiale: multinom Loi normale; norm Loi de poisson: pois Loi de fisher: f() Loi de student: t() Pour chacune de ces lois, on peux vouloir simuler n réalisations de ces lois (utilisation du préfixe r), connaître la densité de probabilité (préfixe d), la fonction de répartition (préfixe p= ou les quantiles (préfixe q). 9. Les modèles de régression Pour illustrer les modèles de régression, on va utiliser la table lwb.csv. S'agissant d'un fichier.csv, on utilise toujours la commande read.csv() ou read.table()pour charger le fichier, en précisant que le séparateur est un point-virgule (sep=";"). Ce fichier provient d'une étude portant sur les facteurs de risques associés à un faible poids à la naissance. Il contient les variables suivantes: id : identification code low : birth weight<2500g age : age of mother lwt : weight at last menstrual period race : race 33