Professional Documents
Culture Documents
Les 1
Les 1
1.1.1 Waarom R?
Er zijn een heleboel programma’s beschikbaar voor het statistisch analyse-
ren van data zoals SAS, SPSS, S+, Stata, Statistica, . . . In deze cursus zullen
we het softwarepakket R gebruiken dat in de recente geschiedenis de “de
facto” standaard is geworden voor veel statistici (zowel academisch als in
de industrie). Enkele voordelen van R:
De editor is de plek waar je code bundelt in een script (cfr. ook Matlab).
Een script heeft verschillende voordelen:
Je start een nieuw script in R door in de interface het menu File > New
Script te kiezen. In RStudio kies je File > New File > R script. In beide
gevallen opent een nieuw editor venster waar je kan in werken. (zie fig 1.1).
Code uitvoeren kan in de R editor door de lijnen te selecteren die je wil
uitvoeren en dan Ctrl+R of F5 te drukken. Op Mac is dit Cmd+Return.
In RStudio kan je een script op twee manieren gebruiken:
1.3 Basisbewerkingen in R
Het > teken stelt de prompt voor. 3 + 7 is de code die werd uitgevoerd, en
[1] 10 is het resultaat. Je kan ook bvb
10 statistische dataverwerking oefeningen
3 + 9
In het vervolg van de tekst, geven we telkens aan wat er aan de con-
sole getypt wordt door de lijn te laten beginnen met de prompt >. Deze
moet je dus NIET overtypen om de code zelf te proberen! Lijnen die niet
voorafgegaan worden door deze prompt, zijn de output die je krijgt.
De vorige uitgevoerde commands blijven altijd beschikbaar in de con-
sole, dus je kan altijd controleren wat je eerder hebt uitgevoerd. Met de
pijltjes omhoog en omlaag kan je door de vorige commando’s browsen. In
RStudio kan je de geschiedenis ook zien in het tabblad “History”.
Enkele simpele mathematische functies:
5^2 # machtsverheffing
sin(pi/2) # pi is 3.141593 in R
sqrt(16) # vierkantswortel
log(20) # natuurlijk logaritme
log10(100) # logaritme met basis 10
log2(164) # logaritme met basis 2
Merk op dat de tekst achter het symbool # in het grijs wordt weerge-
geven. Alles achter het symbool # wordt door R genegeerd. Je kan dit
gebruiken om extra commentaar toe te voegen aan je scripts.
• Als je een nieuwe waarde toekent aan een bestaand object, wordt de
vorige waarde zonder waarschuwing overschreven.
• een naam van een object moet beginnen met een letter, een punt (.) of
een underscore (_)2 . 2
In tegenstelling tot in andere talen,
heeft een punt geen speciale betekenis
in R
• namen in R zijn altijd hoofdlettergevoelig. anObject en AnObject zijn
twee verschillende objecten.
sin, sqrt, log ... zijn voorbeelden van functies. Een functie wordt gevolgd
door ronde haakjes, en tussen de ronde haakjes specifieer je de argumenten
aan de hand van het = teken. Indien een functie meerdere argumenten
heeft, dienen deze gescheiden te worden met een komma:
log(x = 164, base = 2) # 1
log(164, 2) # 2
log2(164) # 3
Tot nog toe hebben we enkel met heel simpele objecten gewerkt. Objecten
kunnen qua structuur sterk verschillen. De structuur van een object wordt
bepaald door de klasse.
De belangrijkste klassen voor de practica zijn:
Je kan een vector aanmaken met de functie c(). Deze functie heeft op-
nieuw een variabel aantal argumenten, gescheiden door een komma.
numVect <- c(1,2.3, -44.2, 1.45e-3)
charVect <- c("a", "ab", "some words")
logiVect <- c(TRUE, TRUE, FALSE, TRUE)
Je kan het type van een vector achterhalen met de functie mode():
> mode(numVect)
[1] "numeric"
> mode(logiVect)
[1] "logical"
• Als je logische waarden gebruikt, moet je een vector gebruiken die even
lang is als de vector. Enkel waarden op de posities waar TRUE staat in de
index, worden behouden.
Enkele voorbeelden:
> x <- c(5, 9, 2, 4, 8)
> x[c(2,4,1)]
[1] 9 4 5
> x[c(-5,-1)]
[1] 9 2 4
> x[ x > 4]
[1] 5 9 8
Nu krijg je een matrix met twee rijen en 5 kolommen. Merk op dat je vecto-
ren maar met mekaar kan combineren als ze allemaal even lang zijn.
De functie matrix() bespreken we hier verder niet.
Selecteren van waarden in een matrix
Ook bij matrices kan je indices gebruiken. Bij matrices heb je echter
twee dimensies, gescheiden door een komma. Voor de komma plaats je
de indices voor selectie van de rijen, na de komma deze voor selectie van
de kolommen. Zowel voor de rijen als de kolommen kan je numerieke of
logische indices gebruiken. Als je een van beide niet opgeeft, dan selecteer
je gewoon alle rijen/kolommen.
In dit geval moeten de logische indices even lang zijn als de dimensie.
Met andere woorden, als je logische indices gebruikt voor bvb de kolomme,
moet die vector evenveel waarden hebben als er kolommen zijn. Je kan
alle kolommen waarvoor de som groter is dan 10 selecteren uit de matrix
amatrix met de volgende code:
introductie r 15
> ind <- colSums(amatrix) > 10 #colSums berekent de som van de kolommen
> ind
[1] FALSE TRUE FALSE FALSE TRUE
> amatrix[, ind ]
[,1] [,2]
x 9 8
y 9 7
of, sneller:
?log
Dit opent een helppagina voor de functie log (in een extern browser-
scherm). Deze helpfiles zijn vaak erg uitgebreid. Daarom enkele tips om
ze te lezen:
• De voorbeelden staan altijd helemaal onderaan, en werken altijd. Je kan
ze kopiëren naar een script en dan uitvoeren om te zien hoe de functie
werkt.
Indien je een foutboodschap krijgt na het uitvoeren van een bepaald stuk
code en je niet meteen weet wat de foutboodschap betekent, is de snelste
oplossing vaak om de foutboodschap in een zoekmachine te copy-pasten.
Gewoonlijk zijn er een hoop mensen die dezelfde fout al eerder hebben
gemaakt, en kom je terecht op een forum, blog, . . . met vragen, antwoorden,
tips, . . . omtrent je probleem!
Tijd om met wat echte data te werken! Download het bestand kaas.csv via
Minerva. We moeten eerst een zogenaamde “working directory” instellen.
Dit is de map waar R zoekt naar mogelijke databestanden. Mijn bestanden
zijn opgeslagen in de map H:\Teaching\StatData\Les1 voor deze les.
Ik zal deze dus instellen als mijn “working directory” (let op de dubbele
backslash in de Windows omgeving!):
setwd("H:\\Teaching\\StatData\\Les1")
De bovenstaande lijn code leest de dataset in. Omdat het een .csv be-
stand is, gebruiken we de functie read.csv. Een meer algemene functie
is read.table. Het is ook mogelijk andere formaten in te lezen zoals Excel
bestanden of bestanden gegenereerd met een ander statistisch pakket. We
zullen in de oefeningenlessen doorgaans werken met .csv bestanden. De
inhoud van de dataset is nu opgeslagen in het object kaas.
We kunnen de inhoud van de dataset bekijken door gewoon de naam
ervan te typen. De volledige dataset wordt dan weergegeven in de console:
kaas
introductie r 17
Indien je alles correct hebt uitgevoerd zou er in de console een matrix moe-
ten verschijnen met 30 rijen en 5 kolommen (rijnummers en kolomnamen
niet meegerekend). Voor een kleine dataset kan het interessant zijn om de
volledige dataset te bekijken, maar de volledige dataset weergeven wan-
neer deze erg omvangrijk is, is veelal onoverzichtelijk (bv. duizenden rijen
en/of kolommen). Je kunt best eerst de dimensies van de dataset bekijken
vooraleer over te gaan tot het printen van de volledige dataset of een deel
ervan:
nrow(kaas) # aantal rijen
ncol(kaas) # aantal kolommen
In één lijn:
dim(kaas)
Resulteert in:
[1] 1.23 2.09 3.90 4.79 0.56 2.59 3.73 2.19 1.81 2.10 3.49 5.72 0.07
[14] 2.59 5.49 4.09 1.59 0.64 1.80 3.89 1.40 1.52 3.20 5.67 1.68 1.16
[27] 2.65 0.07 1.34 0.55
kaas$Acetic + kaas$Lactic
Dit voegt een extra variabele toe aan de kaas dataset. Als je de eerste
rijen van de dataset weergeeft, zul je zien dat er een kolom is bijgekomen:
head(kaas)
resulteert in
Case taste Acetic H2S Lactic TotaalZuur
1 1 12.3 4.543 3.135 0.86 5.403
2 2 20.9 5.159 5.043 1.53 6.689
3 3 39.0 5.366 5.438 1.57 6.936
4 4 47.9 5.759 7.496 1.81 7.569
5 5 5.6 4.663 3.807 0.99 5.653
6 6 25.9 5.697 7.601 1.09 6.787
introductie r 19
1.7 Oefeningen
1.7.1 Dataverwerking
1. Download de surveyAS2008.csv dataset van Minerva en laad de dataset
in R.
3. Maak een nieuwe variable (vector) met de naam zetmeel die aangeeft
hoe vaak de respondent voedingswaren consumeert die zetmeel be-
vatten. (De voedingswaren rijst, aardappelen, pasta, brood en granen
bevatten zetmeel.)
Indien je meer hulp nodig hebt, kan je hieronder een voorbeeld van het
gebruik van de functie terugvinden.
x <- 2:18 # een vector met alle nummers van 2 tot en met 18
v <- 10 # een nummer resulteert in twee groepen:
# alles < 10 en alles 10:
# [ •,10) en [10,+•)
findInterval(x, v)
Je hebt in dit geval meerdere groepen nodig, en zult dus een vector
moeten meegeven aan de functie. Een voorbeeld:
x <- 2:18 # een vector met alle nummers van 2 tot en met 18
v <- c(5, 10) # twee nummers resulteert in drie groepen
# alles < 5;
# alles 5 en < 10;
20 statistische dataverwerking oefeningen
# alles 10;
# [ •,5), [5, 10) en [10,+•)
findInterval(x, v)
[1] 24
1.8.1 Voorbeelden
Deze sectie bevat extra informatie over het maken van grafieken. Je hoeft
dit niet onmiddellijk te lezen indien de les er bijna opzit, maar het bevat
nuttige informatie voor wanneer je bv. figuren wilt aanmaken om te ge-
bruiken in een werkstuk.
Herbekijk de boxplots in oefening 12. De boxplots zijn een nuttige gra-
fische weergave van de data, maar enkel betekenisvol indien we weten wat
de grafiek weergeeft. We kunnen een titel toevoegen aan de plot:
boxplot(survey$sport[survey$geslacht=="v"], main="Vrouwen")
In dit geval is het wellicht beter om de twee boxplots in één grafiek samen
te tonen:
boxplot(survey$sport ~ survey$geslacht,
main="Activiteit volgens geslacht",
ylab="Tijd (uren per week)")
22 statistische dataverwerking oefeningen
Andere “output devices” zijn ook beschikbaar (bv. jpeg, tiff, pdf).
Nog twee nuttige voorbeelden van het produceren en opslaan van gra-
fieken:
# Plots op twee verschillende pagina’s
pdf(file="Afstand_plots_2p.pdf")
boxplot(survey$afstand ~ survey$geslacht,
main="Afstand volgens geslacht", ylab="Afstand")
plot(survey$afstand ~ survey$reisduur,
main="Afstand volgens reisduur",
xlab="Reisduur", ylab="Afstand")
dev.off()
1.8.2 Oefeningen
1. Reproduceer onderstaande figuren. Gebruik hiervoor de in R beschik-
bare datasets Theoph en iris.
Pharmacokinetics of Theophylline
12
Subject 1
Subject 2
Subject 3
10
8
Concentration
6
4
2
0
0 5 10 15 20 25
Time
setosa
5
versicolor
virginica
4
Sepal width
3
2
1
4 5 6 7 8
Sepal Length