Vejledningens formål

I denne vejledning vil vi gennemgå noget af den mest basale syntaks i programmeringssproget R, og vi vil skrabe i overfladen på pakken mosaic, som vi kommer til at benytte en del igennem kurset.

Vejledningen er lavet, da tidligere studerende har efterspurgt en kort introduktion til R, før selve kurset går i gang. Men da det ikke er en forudsætning for kurset, at man har arbejdet med R eller andre programmeringssprog tidligere, så vil vi stadig gøre vores bedste for at introducere det nødvendige R i løbet af kurset. Intentionen med vejledningen er derfor ikke at give en dybdegående introduktion, men blot at lade den studerende bruge R i nogle forskellige sammenhænge, så det ikke virker som en fuldstændigt ukendt verden, når kurset begynder.

Programmeringssproget R

R er et programmeringssprog og en software, der er specialiseret til brug indenfor statistik og dataanalyse. Man kan se det som en ekstra avanceret lommeregner, der gennem et tilpasset sprog kan instrueres i at udføre specialiserede beregninger. Vi siger tit, at vi skriver R-kode, når vi skriver en række instrukser i sproget R.

RStudio er et såkaldt Interactive Development Environment (IDE), hvori vi nemt kan arbejde med R og køre vores R-kode.

R pakker

R-softwaren kommer med nogle basale indbyggede funktioner, men man har mulighed for at hente udvidelser gennem såkaldte pakker (og man kan evt. selv lave nye pakker).

For at benytte en pakkes funktionalitet må vi først installere den, hvilket enten kan gøres med peg-og-klik i en menu i RStudio eller med en kommando på formen install.packages('pakkenavn'). Installation af pakken skal kun gøres een gang på en given computer.

Når pakken er installeret, kan man tilgå dens indhold. Ønsker man f.eks. at tilgå en funktion eller et datasæt fra pakken, kan man skrive pakkenavn::funktionsnavn eller pakkenavn::datanavn. Hvis man skal bruge en pakkes indhold mange gange, så er det dog ret omstændigt hele tiden at skrive pakkenavn::, og så kan man i stedet frigive hele pakkens indhold for vores R-session med en kommando på formen library(pakkenavn) eller library("pakkenavn"), hvor den første version uden anførselstegn er mest gængs. Herefter vil vi kunne tilgå pakkens funktioner m.m. ved blot ved skrive funktionsnavnet. Hvis vi starter en ny R session (lukker ned og starter igen osv) så skal man igen bruge library-kommandoen for at frigive pakkens indhold.

Installation af pakker

Pakker til brug i session

Pingvindata

Vi vil senere bruge et datasæt, der ligger i pakken palmerpenguins, men da det er det eneste, vi vil bruge fra den pakke, så vil vi undlade at bruge library-funktionen. Hvordan kan vi tilgå datasættet penguins fra pakken palmerpenguins?
# Indtast den nødvendige kode for at hente datasættet penguins fra pakken palmerpenguins:

Tip: Hvis blot vi har installeret en pakke, så kan vi tilgå dens indhold med syntaksen pakkenavn::datanavn.

palmerpenguins::penguins

Gem pingvindata

Med koden palmerpenguins::penguins tilgår vi kun datasættet penguins, men vi vil ofte gerne gemme vores data i et objekt (en såkaldt dataframe), så vi nemmere kan arbejde mere direkte med det (hvis vi f.eks. vil tilføje flere kolonner til datasættet eller udtage en delmængde af det). Vi kan gøre dette med en kodelinje på formen: pingviner <- palmerpenguins::penguins. Det er altid en god idé at tjekke, om man har fået sit data indlæst korrekt. Et hurtigt tjek kan være at bruge funktionen head() på sin dataframe. Denne funktion vil vise de første linjer af datasættet, hvormed man visuelt kan inspicere, om alt ser ud som forventet (og man kan danne sig et fint overblik over, hvilke typer af målinger data indeholder).

Gem nu det tidligere tilgåede datasæt med navnet pingviner og tjek, om alt ser korrekt ud vha. funktionen head().
# Indtast de nødvendige to linjers kode for at gemme datasættet penguins i et objekt og se starten af datasættet:

Tip: Vi kan gemme datasættet ved at tildele det til et objekt ved hjælp af operatoren <-.

pingviner <- palmerpenguins::penguins
head(pingviner)

Plots

Når vi har indlæst data korrekt er det altid godt at lave noget grafik for at få en forståelse af data. De grafik-kommandoer vi bruger i kurset stammer fra pakken ggformula som automatisk indlæses når hovedpakken mosaic indlæses, hvilket vi altid skal huske at gøre (ligesom vi sikrer os at data er gemt med det navn vi bruger resten af tiden):

library(mosaic)
pingviner <- palmerpenguins::penguins

Her er et eksempel på en grafik-kommando (de starter alle med gf_)

gf_point(bill_length_mm ~ body_mass_g, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).

Dette viser en generel skabelon goal(y ~ x, data = DATA, ...) vi kommer til at bruge rigtig meget:

  1. Først fortæller vi R vores “goal” altså hvad vil vi opnå: I dette tilfælde gf_point som giver et punkt-plot.
  2. Den næste del er en såkaldet “formel” i R, y ~ x, og kan læses som: “y forklaret af x”, “y modelleret af x”, “y vs. x”, etc: Her betyder bill_length_mm ~ body_mass_g hvordan næblængden i millimeter afhænger af vægten i gram.
  3. Dernæst fortæller vi R hvilket datasæt, der indeholder de variable vi henviser til: data = pingviner.
  4. Endelig kan man angive flere ting (her markeret med ...) såsom grupper, farver osv. hvilket vi lærer senere.

Vi kan tilføje et yderligere element til formlen ved at bruge |, hvilket læses som “for hver”, så hvis vi vil se sammenhængen mellem næblængde og vægt for hver ø der er indsamlet data fra:

gf_point(bill_length_mm ~ body_mass_g | island, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).

Endelig kan man tilføje farver (bemærk igen symbolet ~ som indikerer at der skal farves ud fra værdien af en variabel i datasættet):

gf_point(bill_length_mm ~ body_mass_g | island, data = pingviner, color = ~species)
## Warning: Removed 2 rows containing missing values (geom_point).

Vi kan naturligvis kun undersøge sammenhængen mellem variable hvis vi ved hvad de hedder. Vi kan finde alle variabelnavne i datasætte med kommandoen names():

names(pingviner)
## [1] "species"           "island"            "bill_length_mm"   
## [4] "bill_depth_mm"     "flipper_length_mm" "body_mass_g"      
## [7] "sex"               "year"
Prøv selv at plotte sammenhængen mellem to variable fra datasættet (du må også gerne splitte op i flere plots og farver):
# Modificer koden herunder for at plotte en anden sammenhæng efter eget valg
gf_point(bill_length_mm ~ body_mass_g, data = pingviner)

Tip: Du skal blot udskifte variablene bill_length_mm og body_mass_g med to andre. F.eks. flipper_length_mm og bill_depth_mm.

Numerisk opsummering af data

I dette plot ser vi på sammenhæng mellem næblængde og ø:

gf_point(bill_length_mm ~ island, data = pingviner)
## Warning: Removed 2 rows containing missing values (geom_point).

Bemærk at island er en tekst-variabel, så i første omgang giver et punkt-plot ikke mening, men R har så bare valgt at placere dem ved værdierne 1, 2 og 3 på 1.-aksen, men med tallene på aksen erstattet af teksten. Når man ser plottet kunne man meget naturligt spørge sig selv, hvad gennemsnitslængden i grunden er for hver ø?

Den udregner vi efter samme princip som før goal(y ~ x, data = DATA, ...):

mean(bill_length_mm ~ island, data = pingviner)
##    Biscoe     Dream Torgersen 
##        NA  44.16774        NA

Bemærk at to gennemsnit er NA hvilket betyder “Not available”, dvs. de mangler. Dette sker fordi der er nogle pingviner som vi ikke har registreret næblængden af (f.eks. pingvin nummer 4):

head(pingviner)

Vi kan fortælle R, at de manglende observationer bare skal slettes fra data når vi udregner gennemsnittet:

mean(bill_length_mm ~ island, data = pingviner, na.rm = TRUE)
##    Biscoe     Dream Torgersen 
##  45.25749  44.16774  38.95098
Der findes mange andre numeriske opsummeringer af data end gennemsnittet, hvor kommandoerne har oplagte navne som min() for minimum osv. Prøv selv at finde den maksimale næblængde for hver pingvin-art:
## Kopier kommandoen ovenfor og modificer den på passende vis.

Tip: Du skal bruge kommandoen max med variablene bill_length_mm og species. Husk na.rm = TRUE.

max(bill_length_mm ~ species, data = pingviner, na.rm = TRUE)

Grafik for enkelte variable

Hvis der kun er en enkelt variabel, der skal indgå i hovedplottet, kan vi ikke bruge syntaksen goal(y ~ x, data = DATA, ...), men må udelade y. Så kan vi oftest tænke på det, som om selve kommandoen fortæller, hvad der er på 2.-aksen i stedet for variablen y. F.eks. et søjle-diagram med antal pingviner af hver art:

gf_counts(~ species, data = pingviner)

Denne type plots kan også arbejdes videre på med opsplitning, farver osv. Lad os f.eks. se på, om de forskellige pingvinarter fordeler sig forskelligt på de tre øer, hvor data er indsamlet:

gf_percents(~ species | island, data = pingviner, fill = ~species, color = "black")

Prøv at kopiere ovenstående kode for at ændre den, så du kan besvare, om hver art udgør den sammen procentdel hvert af årene, som dataindsamlingen har løbet over:
# Er der samme procentvise fordeling mellem arterne i årene 2007, 2008, 2009?

Tip: Du skal blot udskifte variablen island med year.

The ASTA team