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,1,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
Bepaea 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 gemiddelde?
einde oefening 2.