Blog: "Thema: R" deel 3

Vandaag presenteren we een functie om schaalwaarden lineair te transformeren in gehele getallen door ze in te verdelen in klassen.
Blog: "Thema: R" deel 3

Om  in de exploratieve fase van een statistische analyse snel  globaal overzicht te krijgen, kan het nodig zijn om rij – of kolomvectoren te transformeren. Bekende transformaties zijn standaardiseren (afwijkingen van het gemiddelde delen door de standaarddeviatie) en normaliseren( een vector delen door de norm ervan : de wortel van de kwadratensom). 

We presenteren twee R functies en passen deze toe op 2 kolomvectoren uit de “attitude” dataset in R.

data <- as.matrix(attitude)

st <- function(x) (x – min(x)) / (max(x) – min(x))

Met st mappen we data op een schaal van 0 tot 1. Het nadeel van deze schaal kan zijn dat er lastig mee valt te rekenen en dat het, vanwege de decimalen,  niet altijd eenvoudig is snel overzicht te verkrijgen.

d2disc is een functie die de st- schaalwaarden transformeert tot gehele getallen door ze onder te brengen in een klasse. De continue st – waarden worden aldus discreet gemaakt.

d2discr <- function(x, Th = 0.1){

stand <- st(x)

v <- seq(from = 0, to = 1, by = Th)

discr <- findInterval(stand, v[-length(v)])

}

d_data <- apply(data , 2,  d2discr)

Alle kolomvectoren van d_data hebben een minimum van 1 en maximum van 10 . Het volgende plot illustreert dat de beschreven 1 – 10  discretisatie een lineaire transformatie is.

(plot(d_data[ ,1], data[,1]))

R-blog3-pic1

Het plot verduidelijkt, ten eerste, dat de transformatie naar 1-10 lineair is (de punten liggen op een rechte lijn), en , ten tweede, dat we informatie verliezen (de waarde 6 van de nieuwe schaal heeft bijvoorbeeld oorspronkelijk waarden van 63  tot 67).

We nemen dit geringe informatieverlies voor lief omdat we streven naar een robuust  globaal overzicht  over meerdere datavectoren ten behoeve van een eerste exploratieve analyse.

Binnen de klassen (1 , 2, 3…10) vinden we aantallen( hoeveel a zijn b?)

De Th parameter in d2discr staat default op 0.1. We krijgen dan 10 klassen. We kunnen Th andere waarden geven om meer of minder klassen te krijgen.

Wat gebeurt er als we Th de waarde 1 / n geven (n is het aantal rijen)?

d2discr <- function(x, Th = (1 / length(x))){

stand <- st(x)

v <- seq(from = 0, to = 1, by = Th)

discr <- findInterval(stand, v[-length(v)])

}

(plot(d_data[ ,1], data[,1]))

R-blog3-pic2

De gediscretiseerde kolomvector heeft nu een minimum van 1 en een maximale waarde van n. Dit is equivalent aan het rangscoren van de data .