R pour les nuls

Téléchargez la base de données Belge pour le 5e round d’ESS (European social survey) : http://ess.nsd.uib.no/ess/round5/download.html
> Country Files
>> Belgium
>>> Country file
>>>> [SPSS]
NB : Vous devez préalablement vous enregistrer sur le site et vous connecter pour pouvoir télécharger la base de données. Ceci est entièrement gratuit.

## 1. Prise en Main
# 1.1. Expliquer les panneaux R Studio

# 1.2. Exécuter une commande: CTRL+ENTER (+ bouton)
3+2 # Addition simple
2^(1/2) # Racine carrée de 2
seq(from=1, to=9, by=2) # Afficher la suite des 5 premiers nombres impaires

# 1.3. Ré-effectuer la dernière commande: CTRL+SHIFT+P (+ bouton)

# 1.4. Effectuer toutes les commandes jusqu'au curseur: CTRL + ALT + B
# 1.5. Trouver de l'aide: F1
seq

# 1.6. Auto-complétion (TAB)
seq()
# 1.7. Commenter sa syntaxe: CTRL + SHIFT + C
Mettez-moi en commentaire

# 1.8. Attribution
x=3+2
x # Afficher la valeur de l'objet
x=2^(1/2) # x a changé de valeur
x

# 1.9. Créer un vecteur
y=seq(from=1, to=9, by=2) # y est un type d'objet particulier: un vecteur
z=c(1, 3, 5, 7, 9) # c() combine des éléments en un vecteur
class(y) # Un vecteur à une classe et tous ses éléments sont de la même classe (numeric, character, factor)
z=c("1", "3", "5", "7", "9") # "" est le symbole définissant un caractère
class(z)
y.bis=y # Copier un vecteur
y=y+1 # Opération sur un vecteur
y
y[3] # les symboles [] permettent de sélectionner les éléments d'un vecteur
rm("y.bis") # Supprimer un objet

## 2. Préparation de l'espace de travail
# 2.1. Vider l'espace de travail
ls() # Renvoie la liste des objet dans l'espace de travail
rm(list=ls()) # Supprimer tous les objets de l'espace de travail

# 2.2. Définir un espace de travail
dossier="C:\Users\...\R 2013" # Error !!!
dossier="C:/Users/.../R 2013" # Utilisez "/" pour définir les chemins
setwd(dossier)
getwd()

# 2.3. Installer un package
# install.packages("foreign")
# install.packages("lattice")

# 2.4. Activer un package
library(foreign)
library(lattice)
library(R2HTML)

## 3. Importer une base de données
# 3.1. Importer
data=read.spss("ESS5BE.sav",
use.value.labels = F, # Utiliser les noms de variables, pas les labels définis dans Spss
to.data.frame = T, # Une dataframe est un objet dans lequel les colonnes peuvent avoir des classes différentes
use.missings=F) # Les valeurs manquantes gardent leur code, les valeurs vides sont remplacées par NA
# Cliquez sur la dataframe pour l'ouvrir dans R Studio
# Nous ne travaillons donc jamais sur la base de données originale !
head(data, n=5L) # Permet d'afficher les premières lignes de la base de données
# Cliquer sur l'objet permet également de l'ouvrir

# 3.2. Sélectionner les variables
data=data[,c("idno", "region",
"imbgeco", "agea", "brncntr", "facntr", "mocntr", "eisced")]
# les symboles [,] permettent de selectionner les éléments d'une data.frame (Attention à la virgule)
# imbgeco = Immigration bad or good for country's economy

# 3.3. Renommer les variables
names(data)
names(data)=c("idno", "Region",
"ImEco", "Age", "Born", "FaBorn", "MoBorn", "Educ") # Tous les noms en un coup
names(data)[1]="ID" # Une partie des noms
# Attention ! R est case sensitive

## 4. Mise en forme de la base de données
summary(data) # fonction pour obtenir une description sommaire d'un objet

# 4.1. Recoder les valeurs manquantes
summary(data[,"ImEco"]) # Sélection d'une colonne dans une dataframe
data[(data[,"ImEco"]==88),] # Filtre (sélection de lignes, donc syntaxe avant la virgule)
data[(data[,"ImEco"] %in% c(77,88,99)), "ImEco"]=NA # NA est le code pour les valeurs manquantes
data[(data[,"Educ"] %in% c(55,77,88,99)), "Educ"]=NA
for (i in c("Born", "FaBorn", "MoBorn")) {
data[data[,i] %in% c(7,8,9),i]=NA
} # Une boucle permet d'appliquer une même instruction à une liste d'objets (i prend successivement les valeurs de la liste)

# 4.2. Recoder variables
data[,"Region"]=as.character(data[,"Region"]) # Permet de changer de classe
data[,"Region"]=gsub(" ", "", data[,"Region"]) # gsub: Chercher et remplacer. Possibilité d'expression régulière.
data[,"Region"]=gsub("([A-Z])", "\\L\\1", data[,"Region"], perl=TRUE) # gsub permet aussi de changer la casse
data[,"Region"]=gsub("be", "prov", data[,"Region"], fixed=TRUE) # Ou de remplacer une chaine de caractère
data[,"Region"]=ifelse((data[,"Region"]=="prov10"), "Bxl",
ifelse((data[,"Region"] %in% c("prov31", "prov32", "prov33", "prov34", "prov35")), "Wal",
"Vld")) # = est le symbole de l'attribution, == de la comparaison
data[,"Region"]=as.factor(data[,"Region"])

# 4.3. Créer une variable
data[,"Allocht"]=ifelse(((data[,"Born"]==1)&(data[,"MoBorn"]==1)&(data[,"FaBorn"]==1)), 1,
ifelse(((data[,"Born"]==1)&((data[,"MoBorn"]==2)|(data[,"FaBorn"]==2))), 2,
3)) # Operateurs logiques ( et &, ou |)
data[,"Allocht"]=factor(data[,"Allocht"], levels=c(1,2,3), labels=c("Nat","SGen","FGen"))
data=data[,!(names(data) %in% c("Born", "FaBorn", "MoBorn"))]
summary(data)

# 4.4. Créer des dummies
tmp=as.data.frame(model.matrix(~Allocht-1, data)) # Crée une matrice de dummies (une colonne par occurrence)
tmp=tmp[,-1] # Supprime la colonne de référence car nous avons besoin de n-1 dummies
tmp[,"rownames"]=rownames(tmp)
data[,"rownames"]=rownames(data)
data=merge(data, tmp, by="rownames", all=T)
# Comme il y a des valeurs manquantes, les deux dataframes sont de tailles différentes

# 4.5. Sélectionner sous-population (==, !=, <=, >=, %in%)
data=data[(data[,"Region"]=="Wal"),]
data=data[(data[,"Age"]<=65),]
summary(data)

## 5. Sauver l'espace de travail
file.name="20131002_FormationR"
rm(list = ls(pattern = "tmp"))
write.dta(data, paste(file.name,".dta", sep="")) # Paste: Concaténer deux chaines de caractères
save.image(file = paste(file.name,".Rdata", sep=""))
# Fermer R

## 6. Analyses statistiques
# 6.1 Charger un espace de travail
dossier="C:/Users/ULB/Documents/Professionnel/ULB/Workshop/R 2013"
setwd(dossier)
load("20131002_FormationR.RData")

# 6.2. Statistiques descriptives
tmpVar=c("ImEco", "Age", "Educ", "AllochtSGen", "AllochtFGen")
tmpStat=c("N", "Miss", "Mean", "Mode", "Min", "Max", "SD", "Skew", "Kurt")

# 6.2.1. Boucle "For"
descr.for=as.data.frame(matrix(ncol=length(tmpVar), nrow=length(tmpStat)))
descr.for=cbind(tmpStat, descr.for) # cbind permet de coller des colonnes
names(descr.for)=c("Stat", tmpVar)
for (i in tmpVar) {
tmp=data[!is.na(data[,i]),i]
descr.for[(descr.for[,"Stat"]=="N"),i]=length(tmp)
descr.for[(descr.for[,"Stat"]=="Miss"),i]=100*(nrow(data)-length(tmp))/nrow(data)
descr.for[(descr.for[,"Stat"]=="Mean"),i]=mean(tmp)
descr.for[(descr.for[,"Stat"]=="Mode"),i]=quantile(tmp, probs=c(.5), names = FALSE)
descr.for[(descr.for[,"Stat"]=="Min"),i]=min(tmp)
descr.for[(descr.for[,"Stat"]=="Max"),i]=max(tmp)
descr.for[(descr.for[,"Stat"]=="SD"),i]=sd(tmp)
descr.for[(descr.for[,"Stat"]=="Skew"),i]=sum((tmp-mean(tmp))^3)/((length(tmp)-1)*var(tmp)^(3/2))
descr.for[(descr.for[,"Stat"]=="Kurt"),i]=(sum((tmp-mean(tmp))^4)/((length(tmp)-1)*var(tmp)^(4/2)))-3
descr.for[,i]=round(descr.for[,i], 2) # Permet d'arrondir les résultats à 2 chiffres après la virgule
}

# 6.2.2. "apply" avec une fonction
descr.fun=function(x) {
x=x[!is.na(x)]
N=length(x)
Miss=100*(nrow(data)-length(x))/nrow(data)
Mean=mean(x)
Mode=quantile(x, probs=c(.5), names = FALSE)
Min=min(x)
Max=max(x)
SD=sd(x)
Skew=sum((x-mean(x))^3)/((length(x)-1)*var(x)^(3/2))
Kurt=(sum((x-mean(x))^4)/((length(x)-1)*var(x)^(4/2)))-3
output=c(N, Miss, Mean, Mode, Min, Max, SD, Skew, Kurt)
output=round(output, 2)
return(output) # Ce que la fonction renvoie comme résultats
}
descr.apply=apply(data[,tmpVar], 2, descr.fun)
descr.apply=cbind(tmpStat, as.data.frame(descr.apply))
names(descr.apply)[1]="Stat"

# 6.3. Régression
data.full=data
data=na.omit(data)
fit = lm(ImEco ~ Age+Educ+AllochtFGen+AllochtSGen, # Ceci est une formule
data=data)
summary(fit)
# voir http://www.statmethods.net/stats/regression.html

# 6.4. Graphique
imEco.hist=hist(data[,"ImEco"])
plot(imEco.hist)
imEco.dens=densityplot(~ImEco, data=data, # Avec lattice. Attention à l'usage d'une formule
aspect=1,
xlab = list(label="Densité"),
ylab = list(label="ImEco"),
)
plot(imEco.dens)
# Les graphiques sont entièrement personnalisables

# 7. Exporter les résultats
# 7.1. CSV
reg.name="20131002_Regression"
reg.out=data.frame(Coef=round(coef(fit), 3),
SE=round(diag(vcov(fit))^(1/2), 3),
IC=paste("[", round(confint(fit, level=0.95)[,1], 3),",",
round(confint(fit, level=0.95)[,2], 3), "]", sep="")
)
write.csv(reg.out, paste(reg.name,".csv", sep=""))

# 7.2. PNG
png(filename=paste(reg.name,".png", sep=""),
width = 480, height = 480)
plot(imEco.dens)
dev.off()
# Même principe pour les autres device (PNG, PDF, ...)

# 7.3. R2HTML
target = HTMLInitFile(outdir=getwd(), filename=reg.name, extension="html")
HTML(as.title("Résultats"), file=target)
HTML(reg.out, file=target,
row.names=F, Border=1)
HTMLInsertGraph(paste(reg.name,".png", sep=""),
GraphBorder=0, WidthHTML=400, file=target)
HTMLEndFile(file = get(".HTML.file"))
browseURL(target)
# Facile à améliorer avec un fichier CSS simple