In de R-programmeertaal zijn de pijpoperatoren essentieel voor de efficiëntie van code. De basis R-pijp, aangeduid met de operator |>, heeft als voordeel dat deze geen extra pakketten vereist om te functioneren, wat het toegankelijk maakt voor elke R-gebruiker met een geschikte versie van de software. Dit staat in contrast met de %>% pijp, die de installatie van het "magrittr"-pakket vereist. Het installeren van pakketten in R is eenvoudig en kan worden gedaan via de Comprehensive R Archive Network (CRAN) met behulp van de functie install.packages(). Het enige wat je hoeft te doen, is het pakket eenmaal installeren en het vervolgens laden in elke nieuwe R-sessie met de functie library().

Na de installatie van het "magrittr"-pakket kun je de pijpoperator gebruiken om de leesbaarheid en het gemak van je code te verbeteren. Een voorbeeld is het herschrijven van een functie die de vierkantswortel van een getal berekent en afrondt. Dit zou er als volgt uitzien:

r
square_root_and_round <- function(x) {
sqrt(x) %>% round() }

Bij het aanroepen van deze functie met bijvoorbeeld square_root_and_round(15) krijg je als resultaat 4. Dit is slechts een voorbeeld van hoe de pijpoperator kan worden gebruikt om de stroom van je code te verduidelijken.

Matrices in R

Matrices zijn tweedimensionale gegevensstructuren die gegevens organiseren in rijen en kolommen. Ze lijken op tabellen of spreadsheets, waarbij elk element of cel een enkele waarde bevat. De toegang tot specifieke gegevenspunten in een matrix is eenvoudig: je gebruikt de rij- en kolomindices om een element te vinden. In R beginnen de indices bij 1 en nemen toe naarmate je verder gaat in de rij of kolom.

Een belangrijk kenmerk van matrices is dat ze alleen elementen van hetzelfde gegevenstype kunnen bevatten. Dit betekent dat alle waarden in een matrix van hetzelfde type moeten zijn, zoals gehele getallen, tekens of logische waarden. Het creëren van een matrix in R kan eenvoudig worden gedaan met de functie matrix(), waarbij je de gegevens als invoer doorgeeft en het aantal rijen en kolommen opgeeft:

r
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3)

Standaard vult R de matrix kolomgewijs in. Dit betekent dat de eerste kolom eerst wordt gevuld, gevolgd door de tweede, enzovoorts. Als je in plaats daarvan de matrix rijgewijs wilt vullen, voeg je de argument byrow = TRUE toe aan de functie:

r
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, ncol = 3, byrow = TRUE)

Toegang tot elementen in een matrix

Om toegang te krijgen tot specifieke elementen van een matrix, gebruik je vierkante haakjes [] en geef je de rij- en kolomindex op, gescheiden door een komma. Wil je een hele rij of kolom opvragen, laat je de corresponderende index leeg. Dit is een concept dat bekend is voor gebruikers die ervaring hebben met spreadsheets.

Bijvoorbeeld:

r
my_matrix[1, 2] # Toegang tot het element in de eerste rij en tweede kolom
my_matrix[1, ] # Toegang tot de hele eerste rij
my_matrix
[, 2] # Toegang tot de hele tweede kolom

Elementgewijze wiskundige bewerkingen op matrices

Net als bij vectoren, worden rekenkundige bewerkingen op matrices in R elementgewijs uitgevoerd. Dit betekent dat, bij het optellen van twee matrices, de waarde in rij 1 en kolom 1 van de eerste matrix wordt opgeteld bij de waarde in rij 1 en kolom 1 van de tweede matrix, en zo verder voor alle elementen.

Voorbeelden van elementgewijze bewerkingen zijn:

r
matrix_a + matrix_b # Optellen matrix_a - matrix_b # Aftrekken matrix_a * matrix_b # Vermenigvuldigen matrix_a / matrix_b # Delen

Bijvoorbeeld:

r
matrix_a + matrix_b

Dit zou resulteren in een matrix met de som van de overeenkomstige elementen uit matrix_a en matrix_b.

Matrixvermenigvuldiging

Het is belangrijk om onderscheid te maken tussen elementgewijze vermenigvuldiging en matrixvermenigvuldiging. In R kan matrixvermenigvuldiging worden uitgevoerd met de operator %*%, maar de matrices moeten compatibel zijn in termen van hun dimensies. De kolommen van de eerste matrix moeten overeenkomen met de rijen van de tweede matrix.

Als we proberen de matrixvermenigvuldiging uit te voeren op matrices die niet compatibel zijn, krijg je een foutmelding:

r
matrix_a %*% matrix_b # Dit zou een foutmelding geven vanwege incompatibiliteit van dimensies

Daarom is het belangrijk om de dimensies van je matrices te controleren voordat je matrixvermenigvuldiging uitvoert. Als de dimensies correct zijn, zou je een nieuwe matrix krijgen die het resultaat is van de vermenigvuldiging van de twee matrices.

Gegevensframes in R

Gegevensframes zijn een van de belangrijkste gegevensstructuren in R. Ze zijn vergelijkbaar met matrices, maar hebben als voordeel dat ze kolommen van verschillende gegevens typen kunnen bevatten. Dit maakt het mogelijk om diverse soorten gegevens, zoals numerieke waarden, tekenreeksen, factoren en logische waarden, in één gegevensstructuur op te slaan en te analyseren.

In tegenstelling tot matrices, die geen verschillende gegevens typen binnen dezelfde structuur toestaan, kunnen gegevensframes dit wel. Dit geeft ze meer flexibiliteit bij het werken met heterogene gegevens. Daarnaast behouden gegevensframes belangrijke metadata, zoals variabelenamen en kolomlabels, wat de interpretatie en analyse vergemakkelijkt.

Gegevensframes kunnen eenvoudig worden aangemaakt met de data.frame() functie, waarbij je de variabelen als vectoren doorgeeft. Elke vector vertegenwoordigt een kolom in het gegevensframe. Het volgende voorbeeld laat zien hoe je een gegevensframe kunt maken:

r
Name <- c("Alice", "Bob", "Charlie") Age <- c(25, 32, 28) Salary <- c(50000, 55000, 60000)
df <- data.frame(Name, Age, Salary)

Gegevensframes bieden tal van mogelijkheden voor datamanipulatie, zoals subsetting, het combineren van gegevens en het uitvoeren van aggregaties.

Wat vertelt de R²-waarde ons over een model en hoe kan de validiteit van een regressieanalyse worden gecontroleerd?

De R²-waarde is een van de meest gebruikte statistische maatstaven in regressieanalyse. Het biedt een indicatie van de mate waarin de variabiliteit in de afhankelijke variabele wordt verklaard door de onafhankelijke variabelen in het model. In de ideale situatie zou een R²-waarde van 1 betekenen dat het model perfect alle variatie in de gegevens verklaart. Dit is echter theoretisch en in de praktijk moeilijk te bereiken met echte data. Aan de andere kant zou een R² van 0 aangeven dat het model helemaal geen variatie verklaart, waardoor het zowel voor beschrijvende als voorspellende doeleinden niet bruikbaar zou zijn.

In ons voorbeeld, waar we snelheid als enige voorspeller gebruiken, is de R²-waarde ongeveer 0.1453, oftewel 14.53%. Dit betekent dat de snelheid van Pokémon ongeveer 14.53% van de variatie in hun aanvalspunten verklaart. De resterende 85% van de variatie wordt niet verklaard door dit model, wat suggereert dat er andere factoren zijn die de aanvalspunten beïnvloeden, maar niet door snelheid alleen worden vastgelegd. Dit laat zien hoe beperkt een model kan zijn wanneer slechts één voorspeller wordt gebruikt, en benadrukt de complexiteit van het voorspellen van gedragingen of eigenschappen die door meerdere factoren worden bepaald.

Een veelgebruikte term in regressieanalyse is de ‘Multiple R²’. Hoewel deze term suggereert dat er meerdere voorspellers in het model moeten worden opgenomen, wordt deze ook gebruikt wanneer er slechts één voorspeller aanwezig is, zoals in ons geval. Dit is te wijten aan het feit dat de lm()-functie van R ontworpen is om meerdere voorspellers aan te kunnen, wat ruimte biedt voor de mogelijkheid om later andere variabelen toe te voegen. Bij het toevoegen van extra voorspellers zal de Multiple R²-waarde toenemen, mits deze nieuwe variabelen bijdragen aan het verklaren van de variatie in de afhankelijke variabele.

Wanneer er meerdere voorspellers aan het model worden toegevoegd, verandert de R²-waarde om de verhouding van de verklaarde variatie door de gecombineerde voorspellers weer te geven. Echter, bij het toevoegen van nieuwe variabelen moet men ook de Aangepaste R²-waarde in overweging nemen. Deze waarde corrigeert de Multiple R² voor het aantal gebruikte voorspellers en helpt overfitting te voorkomen. Het is belangrijk te beseffen dat, hoewel het toevoegen van variabelen de R²-waarde altijd zal verhogen, dit niet noodzakelijkerwijs resulteert in een beter model. De Aangepaste R² biedt een meer genuanceerde en betrouwbare maatstaf voor het verklarende vermogen van een model.

In een regressieanalyse komen naast de R²-waarde ook p-waarden voor bij elke coëfficiënt. De p-waarde is een kernconcept in statistische hypothesetests, maar wordt vaak verkeerd begrepen, zelfs binnen de wetenschappelijke gemeenschap. In plaats van de kans dat de nulhypothese onjuist is, geeft de p-waarde aan hoe waarschijnlijk het is om een teststatistiek zo extreem of extremer te observeren dan de verkregen resultaten, ervan uitgaande dat de nulhypothese waar is. In simpelere bewoordingen, de p-waarde vertelt ons hoe verrassend de waargenomen gegevens zouden zijn als er werkelijk geen effect of verband zou zijn tussen de onderzochte variabelen.

De standaarddrempel voor statistische significantie is vaak ingesteld op een p-waarde van 0,05. Als de p-waarde onder deze drempel valt, wordt dit doorgaans geïnterpreteerd als bewijs om de nulhypothese te verwerpen en te suggereren dat er een statistisch significant verband bestaat tussen de variabelen. Een p-waarde boven 0,05 betekent niet dat de nulhypothese bevestigd is, maar wel dat de data niet sterk genoeg bewijs levert om het te verwerpen. Het is belangrijk om te realiseren dat zelfs wanneer een p-waarde significant is, dit niet automatisch betekent dat het model perfect of zonder fouten is. Het benadrukt slechts dat er waarschijnlijk een relatie bestaat, die verder onderzocht moet worden.

Er is echter een belangrijke voorwaarde die vaak over het hoofd wordt gezien: de assumpties van het lineaire model. Regressie is krachtig, maar het is essentieel om ervoor te zorgen dat de onderliggende aannames van het lineaire model correct zijn. Een van de fundamentele aannames is lineariteit, wat betekent dat een verandering in de onafhankelijke variabele moet resulteren in een proportionele verandering in de afhankelijke variabele. Als de relatie tussen de variabelen niet lineair is, zullen de voorspellingen van het model onnauwkeurig zijn, wat leidt tot misleidende inzichten.

Het tweede belangrijke voor de regressieanalyse is de aanname van normale verdeling van de residuen. Residuen zijn de afwijkingen van de waargenomen waarden ten opzichte van de voorspelde waarden. Als de residuen normaal verdeeld zijn, kunnen we erop vertrouwen dat de standaardfouten, betrouwbaarheidsintervallen en p-waarden correct zijn. Als de residuen niet normaal verdeeld zijn, kan dit wijzen op problemen met het model, zoals belangrijke variabelen die niet zijn opgenomen of een niet-lineaire relatie die niet goed is gemodelleerd.

Daarnaast is homoscedasticiteit, het idee dat de spreiding van de residuen constant is voor alle waarnemingen, een andere cruciale aanname. Als de spreiding van de residuen toeneemt of afneemt naargelang de waarde van de voorspeller, kan dit duiden op problemen met het model en kan het de validiteit van de schattingen beïnvloeden.

Ten slotte moeten we de onafhankelijkheid van de residuen controleren. Dit betekent dat de fouttermen niet gecorreleerd mogen zijn, wat essentieel is voor de validiteit van de regressieanalyse. Wanneer de residuen afhankelijk zijn van elkaar, kan dit leiden tot vertekende resultaten en een onbetrouwbaar model.

Wanneer een regressiemodel aan deze basisveronderstellingen voldoet, kan men vertrouwen op de resultaten van de analyse, maar het is belangrijk om altijd kritisch te blijven en deze aannames te controleren, vooral bij complexe datasets zoals die van Pokémon, waar meerdere factoren de uitkomst kunnen beïnvloeden.