lundi 21 février 2011

Arrondir un nombre : quelques fonctions

Pour arrondir un nombre, j'utilise le plus souvent la fonction round(). Cette fonction prend 2 arguments : un vecteur numérique et un nombre indiquant le nombre de décimales à garder. Voici un exemple:
a <- 1.12345 # création d'un objet a contenant le nombre 1.12345
round(a, 2) # on arrondit le nombre en gardant 2 décimales donc 1.12

Il existe d'autres fonctions pour arrondir un nombre.
ceiling(a) # arrondit à l'entier supérieur donc 2
floor(a) # arrondit à l'entier inférieur donc 1
signif(a, 2) # arrondit le nombre en gardant 2 chiffres donc 1.1

lundi 14 février 2011

La fonction tapply()

La fonction tapply() permet d'appliquer une fonction à un vecteur selon les modalités d'un facteur.
Cette fonction prend 3 arguments. Le premier argument spécifie un vecteur numérique sur lequel on veut appliquer la fonction, le deuxième argument spécifie la façon dont ce vecteur sera divisé en groupes (la division se fait sur la base des niveaux du second argument), le troisième argument spécifie la fonction qui sera appliquée à ces groupes.

Voici un exemple:
# on a 2 variables concernant 4 personnes : l'âge et le genre 
Age <- c(12,15,23,29) # création de la variable Age
Genre <- c("homme", "homme", "femme", "femme") # création de la variable Genre
data <- data.frame(Age, Genre) # on met les 2 variables dans un tableau
# On souhaite connaître l'âge moyen selon le genre
tapply(data$Age, data$Genre, mean)

vendredi 11 février 2011

La fonction apply()

La fonction apply() permet d'appliquer une fonction (par exemple une moyenne, une somme) à chaque ligne ou chaque colonne d'un tableau de données. Cette fonction prend 3 arguments dans l'ordre suivant:

  • nom du tableau de données
  • un nombre pour dire si la fonction doit s'appliquer aux lignes (1), aux colonnes (2) ou aux deux (c(1,2))
  • le nom de la fonction à appliquer

Voici un exemple. L'objectif est de calculer la somme de chaque ligne ou de chaque colonne d'un tableau :
# On crée d'abord une matrice avec 2 lignes et 3 colonnes
data<-matrix(c(1,2,3,4,5,6), nrow=2)
# On donne un nom aux lignes et aux colonnes
colnames(data)=c("C1","C2","C3")
rownames(data)=c("L1","L2")
# On utilise la fonction apply() pour faire la somme de chaque ligne
apply(data, 1, sum)
# Pour faire la somme de chaque colonne, on remplace 1 par 2
apply(data, 2, sum)

mardi 8 février 2011

Représenter visuellement une matrice de corrélation

Quand on a plusieurs variables numériques, on peut faire une matrice de corrélation pour voir le coefficient de corrélation entre toutes les variables prises 2 à 2. Mais une telle matrice n'est pas toujours très agréable à lire. Voici une méthode pour représenter visuellement une matrice de corrélation. Cela donnera au final le graphique suivant :



Pour chaque corrélation, on a le nuage de points et le coefficient de corrélation (avec le degré de significativité).

Voici tout d'abord le code pour créer les variables et pour avoir une matrice de corrélation classique :

v1<-c(1,2,4,5,7) # création d'un vecteur v1
v2<-c(7,8,5,9,8) # création d'un vecteur v2
v3<-c(7,5,3,2,1) # création d'un vecteur v3
tab<-matrix(data=c(v1,v2,v3), nrow=5, ncol=3, byrow=F) # création d'une matrice contenant les 3 vecteurs
colnames(tab)=c("variable 1","variable 2","variable 3") # on donne un nom à chaque colonne
cor(tab) # matrice de corrélation classique

Voici maintenant le code pour obtenir le graphique ci-dessus.

# Il faut d'abord créer la fonction suivante (nommée panel.cor)
panel.cor <- function(x, y, digits=2, prefix="", cex.cor)
{
    usr <- par("usr"); on.exit(par(usr))
    par(usr = c(0, 1, 0, 1))
    r <- (cor(x, y))
    txt <- format(c(r, 0.123456789), digits=digits)[1]
    txt <- paste(prefix, txt, sep="")
    if(missing(cex.cor)) cex <- 0.8/strwidth(txt)

    test <- cor.test(x,y)
    # borrowed from printCoefmat
    Signif <- symnum(test$p.value, corr = FALSE, na = FALSE,
                  cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1),
                  symbols = c("***", "**", "*", ".", " "))

    text(0.5, 0.5, txt, cex = cex * abs(r))
    text(.8, .8, Signif, cex=cex, col=2)
}

# Puis on utilise la fonction pairs()
pairs(tab[,c(1,2,3)], lower.panel=panel.smooth, upper.panel=panel.cor)

remarque: la fonction panel.cor et l'idée du graphique proviennent du lien suivant (j'ai légèrement modifié le code pour afficher le signe du coefficient de corrélation) :
http://addictedtor.free.fr/graphiques/RGraphGallery.php?graph=137