Imprimer
Catégorie parente: Logiciel R
Catégorie : Commencer avec R

 

Pour notre prochain exemple, nous allons passer en revue une brève analyse de régression statistique. Il n'y a pas beaucoup de programmation réelle dans cet exemple, mais elle illustre comment certains des types de données que nous venons de décrire sont utilisés, y compris les objets S3 de R. En outre, il servira de base à plusieurs de nos exemples de programmation dans les chapitres suivants.
J'ai un fichier, ExamsQuiz.txt, contenant des notes d'une classe que j'ai enseigné. Voici ses premières lignes:

  1. 2 3. 3 4
  2. m .3 2 3 .7
  3. 4 4 3 4
  4. 2 .3 0 3 3
Source code

Les chiffres correspondent aux notes sur une échelle de quatre points; 3.3 est un B +, par exemple. Chaque ligne contient les données pour un étudiant, comprenant la note de l'examen à mi-parcours, la note de l'examen final et la note moyenne du questionnaire. Il pourrait être intéressant de voir à quel point les notes de mi-session et de quiz prédisent la note de l'étudiant à l'examen final.
Commençons par lire dans le fichier de données:

  1. > examsquiz <- read.table("ExamsQuiz.txt",header=FALSE)
Source code

Notre fichier n'inclut pas une ligne d'en-tête nommant les variables dans chaque enregistrement d'étudiant, nous avons donc spécifié header = FALSE dans l'appel de la fonction. Ceci est un exemple d'un argument par défaut, dont nous avons parlé plus tôt. En fait, la valeur par défaut de l'argument d'en-tête est déjà FALSE (que vous pouvez vérifier en consultant l'aide en ligne de R pour read.table ()), donc nous n'avons pas besoin de spécifier ce paramètre, mais c'est plus clair.
Nos données sont maintenant dans examsquiz, qui est un objet R de classe data.frame.
  1. > class(examsquiz)
  2. [1] "data.frame"
Source code

Juste pour vérifier que le fichier a été correctement lu, jetons un coup d'œil aux premières lignes:
  1. > head(examsquiz)
  2. V1 V2 V3
  3. 1 2.0 3.3 4.0
  4. 2 3.3 2.0 3.7
  5. 3 4.0 4.3 4.0
  6. 4 2.3 0.0 3.3
  7. 5 2.3 1.0 3.3
  8. 6 3.3 3.7 4.0
Source code

En l'absence d'un en-tête pour les données, R a nommé les colonnes V1, V2 et V3. Les numéros de ligne apparaissent sur la gauche. Comme vous pourriez le penser, il serait préférable d'avoir un en-tête dans notre fichier de données, avec des noms significatifs comme Exam1. Dans les exemples suivants, nous spécifierons généralement les noms.
Essayons de prédire le score de l'examen 2 (donné dans la deuxième colonne de examsquiz) de l'examen 1 (première colonne):
  1. lma <- lm (examsquiz [, 2] ~ examsquiz [, 1])
Source code

L'appel de la fonction lm () (pour le modèle linéaire) ordonne à R d'ajuster cette équation de prédiction:
Examen prédit 2 = fio + examen 1
Ici, et sont des constantes à estimer à partir de nos données. En d'autres termes, nous alignons une ligne droite sur les paires (examen 1, examen 2) de nos données. Ceci est fait par une méthode classique des moindres carrés. (Ne vous inquiétez pas si vous n'avez pas de contexte dans ce domaine.)
Notez que les notes de l'examen 1, qui sont stockées dans la première colonne de notre cadre de données, sont collectivement appelées examsquiz [, 1]. L'omission du premier indice (le numéro de ligne) signifie que nous faisons référence à une colonne entière de la trame. Les scores de l'examen 2 sont référencés de la même manière. Ainsi, notre appel à lm () ci-dessus prédit la deuxième colonne de examsquiz à partir du premier.
Nous aurions aussi pu écrire

  1. lma <- lm (examsquiz $ V2 ~ examsquiz $ V1)
Source code

rappelant qu'une trame de données est juste une liste dont les éléments sont des vecteurs. Ici, les colonnes sont les composants V1, V2 et V3 de la liste.
Les résultats renvoyés par lm () sont maintenant dans un objet que nous avons stocké dans la variable lma. C'est une instance de la classe LM. Nous pouvons lister ses composants en appelant attributs ():
  1. > attributes(lma)
  2. $names
  3. [1] "coefficients" "residuals" "effects" "rank"
  4. [5] "fitted.values" "assign" "qr" "df.residual"
  5. [9] "xlevels" "call" "terms" "model"
  6. $class
  7. [1] "lm"
Source code

Comme d'habitude, une comptabilité plus détaillée peut être obtenue via l'appel str (lma). Les valeurs estimées de pi sont stockées dans les coefficients lma $. Vous pouvez les afficher en tapant le nom à l'invite.
Vous pouvez également sauvegarder certaines données en abrégeant les noms de composants, tant que vous ne raccourcissez pas le nom d'un composant au point d'être ambigu. Par exemple, si une liste comprend les composants xyz, xywa et xbcde, les deuxième et troisième composants peuvent être abrégés en xyw et xb, respectivement. Donc, ici, nous pourrions taper ce qui suit:
  1. > lma $ coef
  2. (Intercept) examsquiz [, 1] 1.1205209 0.5899803
Source code

Puisque lma $ coefficients est un vecteur, l'imprimer est simple. Mais considérez ce qui se passe lorsque vous imprimez l'objet lui-même:
> lma Appelez:
lm (formule = examsquiz [, 2] ~ examsquiz [, 1])
Coefficients
(Intercept) examsquiz [, 1]
1,121 0,590
Pourquoi R n'a-t-il imprimé que ces éléments et non les autres composants de lma? La réponse est qu'ici, R utilise la fonction print (), qui est un autre exemple de fonctions génériques. En tant que fonction générique, print () transmet le travail à une autre fonction dont le travail consiste à imprimer des objets de la classe lm - la fonction print.lm () - et c'est ce que cette fonction affiche.
Nous pouvons obtenir une impression plus détaillée du contenu de lma en appelant summary (), la fonction générique discutée plus haut. Il déclenche un appel à summary.lm () dans les coulisses, et nous obtenons un résumé spécifique à la régression:

  1. > summary(lma)
  2. Call:
  3. lm(formula = examsquiz[, 2] ~ examsquiz[, 1])
  4. Residuals:
  5. Min 1Q Median 3Q Max
  6. -3.4804 -0.1239 0.3426 0.7261 1.2225
  7. Coefficients:
  8. Estimate Std. Error t value Pr(>|t|)
  9. (Intercept) 1.1205 0.6375 1.758 0.08709 .
  10. examsquiz[, 1] 0.5900 0.2030 2.907 0.00614 **
  11. ...
Source code

Un certain nombre d'autres fonctions génériques sont définies pour cette classe. Consultez l'aide en ligne de lm () pour plus de détails. (L'utilisation de la documentation en ligne de R est abordée à la section 1.7.)
Pour estimer une équation de prédiction pour l'examen 2 à partir de l'examen 1 et des scores du quiz, nous utiliserons la notation +:
  1. > lmb <- lm(examsquiz[,2] ~ examsquiz[,1] + examsquiz[,3])
Source code

Notez que le + ne signifie pas que nous calculons la somme des deux quantités. C'est simplement un délimiteur dans notre liste de variables prédictives.