home   Cursusoverzicht   Wat is belfactorij?   Aanmelden   Administrator

les 0
les 1, het begin
2.1 inlezen
2.2 vectoren
2.3 matrices
2.4 bewaren
2.5 samenvatting
les 3, figuren

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mogelijk antwoord bij oefening 1

> a1=scan()
1: 1
2: 2
3:
Read 2 items
> a2=scan()
1: 3
2: 4
3:
Read 2 items
> b1=scan()
1: 3
2: 5
3:
Read 2 items
> b2=scan()
1: 4
2: 6
3:
Read 2 items
> A=data.frame(a1,a2)
> B=data.frame(b1,b2)
> BT=t(B)
> A<-as.matrix(A)
> B<-as.matrix(B)
> BT<-as.matrix(BT)
> A%*%BT
1 2
1 15 23
2 22 34

 

 

 

mogelijk antwoord bij oefening 2

> X <- matrix(0,nrow=3,ncol=4)
> X[2,2]=2
> X[2,3]=2
> X[2,3]=3
> X[3,1]=4
> X[3,2]=5
> X[3,4]=5
> X[1,]=1
> apply(X,1,mean)
[1] 1.00 1.25 3.50
> apply(X,2,mean)
[1] 1.666667 2.666667 1.333333 2.000000
 

de laatste antwoorden kun je ook krijgen door

> mean(X[,1])

> mean(X[,2])

> mean(X[,3])

> mean(X[,4])

 

 

 

 

 

 

 

 

 

 

 

Les 2. Inlezen, bewerken en bewaren

 

 

2.3 matrices

In les 1 heb ik al een manier laten zien hoe je matrices kan aanmaken. Maar het kan natuurlijk wel eenvoudiger. En wel met het object data.frame. Stel aan 4 verschillende personen is hun lengte, gewicht en geslacht (dus in totaal 3 variabelen) gevraagd. De resultaten kun je in vector zetten en vervolgens samenvoegen in een data.frame (bijvoorbeeld onder de naam “bio”).

 

> lengte = c(167,188, 193,181)

> gewicht=c(65,72, 85,79)

> geslacht = c("v","m","m","v")

> bio=data.frame(lengte,gewicht,geslacht)

> bio

  lengte gewicht geslacht

1    167      65        v

2    188      72        m

3    193      85        m

4    181      79        v

 

In een data.frame kunnen variabelen zitten met een verschillende “mode”, dat kan niet bij vectoren of matrices. De variabelen namen in het voorbeeld zijn boven de matrix gegeven. De subjecten zijn genummerd, maar je de nummers ook vervangen door namen.

 

> row.names(bio)= c("Anna","Bob","Caspar","Dini")

 

Als je alleen geïnteresseerd bent in een element moet je er rekening mee houden dat deze bepaald wordt door het rijnummer en het kolomnummer. Als je van Caspar (derde subject) het gewicht (tweede variabele) wilt weten typ je:

 

> bio[3,2]

[1] 85

 

Als je van Caspar alle gegevens wilt weten, typ je

 

> bio[3,]

       lengte gewicht geslacht

Caspar    193      85        m

 

Of

 

> bio[‘Caspar’]

 

Als je van alle personen de lengte en het gewicht wilt weten, kun je typen:

 

> bio[,1:2]

       lengte gewicht

Anna      167      65

Bob        188      72

Caspar   193      85

Dini        181      79

 

Tenslotte als je alle gegevens van (bijvoorbeeld) alle vrouwen wilt weten kun je het beste gebruik maken van het object “list” (zie les….).Je maakt dan van de variabel “geslacht” uit bio een list door bio$geslacht te gebruiken:

 

> bio[bio$geslacht == 'v',]

     lengte gewicht geslacht

Anna    167      65        v

Dini     181      79        v

 

Matrix genereren

Een matrix kun je op verschillende manieren genereren. Bijvoorbeeld met behulp van het samenvoegen van vectoren tot een data.frame zoals hierboven. Een data.frame kan eachter ook "characters" bevatten. Om matrix berekeningen te kunnen uitvoeren zul je daarom van de data.frame eerst als volgt een echte matrix moeten maken:

 

> X <- as.matrix(X)

 

Een andere manier om een matrix te genereren is:

 

> M <- matrix(0,nrow=2,ncol=2)

     [,1] [,2]
[1,] 0 0
[2,] 0 0

 

Matrix berekeningen

Belangrijke commando's om matrices aan elkaar te koppelen zijn rbind( ) en cbind( ). Dit zijn functies om matrices respectievelijk rij-gewijs en kolom-gewijs aan elkaar te plakken. 

 

> M1 <- matrix(0,nrow=2,ncol=3)

> M2 <- matrix(1,nrow=2,ncol=3)

> rbind(M1,M2)

      [,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 1 1 1
[4,] 1 1 1
> cbind(M1,M2)

       [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 0 0 0 1 1 1
[2,] 0 0 0 1 1 1
 

Andere handige commanod's

 

t() geeft de getransponeerde van een matrix
%*% geeft het product van twee matrices
diag() geeft de diagonaal elementen van een matrix
solve() geeft de inverse een matrix
qr() geeft de choleski decompositie een matrix
eigen() geeft de eigenwaarden en eigenvectoren van een matrix
svd() geeft de singuliere waarde decompositie van een matrix

 

oefening 1

Wat is de inverse van het product van matrix A en de getransponeerde van B?

A=

1 2

3 4

B=

3 5

4 6

 

einde oefening 1

 

Als laatste wil ik nog opmerken dat veel functies die je al eerder gebruikt hebt, zoals mean and sum kun je ook bij matrices gebruiken allen werken ze wel op een speciale manier.

 

Zo geldt bijvoorbeeld voor het gemiddelde: 

 

> X <-matrix(1,nrow=2,ncol=2)
> X[1,1]=4
> X[2,2]=6
> X
[,1] [,2]
[1,] 4 1
[2,] 1 6
> mean(X)
[1] 3

 

Hier wordt het gemiddelde van alle 4 getallen berekent, wil je de 2 gemiddelde van de twee rijen, gebruik dan apply.

 

> apply(X,1,mean)

 

Het zelfde voor de 2 gemiddelde voor de eerste en tweede kolom.

 

> apply(X,2,mean)

 

Voor var(X) en sd(x) geldt ook dat R de variantie en standaarddeviatie van alle getallen van de matrix berekent. Echter cov(X) en cor(X) geven de variantie-covariantie matrix respectievelijk de correlatie matrix van X.

 

Oefening 2

 

Bepaal (met R) van een matrix met vier enen op de eerste rij; 0, 2, 3, 0 op de tweede rij en 4,5,0,5 op laatste (derde) rij de kolom en rij gemiddelden?

 

einde oefening 2.