Programmering i R

Föreläsning 6: Objektorientering, datum och linjär algebra

Måns Magnusson

Avdelningen för statistik, Linköpings universitet

Dagens föreläsning:

  • Interaktiv återkoppling
  • Programmeringsparadigm
    • Funktionell programmering
    • Objektorientering
  • Datum och tid med lubridate
  • Linjär algebra i R

Programmeringsparadigm och R

Programmeringsparadigm

Funktionell programmering

  • Fokuserar på “higer-order/first class functions”
  • Funktioner utan sidoeffekter (tänk matematiska funktioner)
    • En funktions output beror bara på värdena på inargumenten
  • Exempel:
    • R
    • Scala
    • C

Funktionell programmering

  • R är är i grunden ett funktionellt spårk
  • R har “first class functions”
  • Funktioner kan manipuleras som andra objekt, sparas i listor mm
  • För fördjupning i R och FP se här.

Objektorientering (OO) i R

  • Stor skillnad mellan R och andra statistikprogram

“Allt som existerar är ett objekt, allt som händer är ett funktionsanrop” (John Chambers)

  • OO utgår från klasser
    • Klass är en mall som används för att skapa objekt
    • Kopplar samman data/kod med beteende (metoder)
    • Objekt är en specifik realisering av en klass, ex: person (klass) och josef (objekt)
    • Objekt skapas med en konstruktor

Objektorientering i R

  • Alla objekt i R har en klass
    • matrix, data.frame, lm
  • Variabeltyper är “atomära” klasser
  • Dessa klasser har en konstruktor (en funktion med samma namn)
  • Vi kan undersöka ett objekts klass med class()

Objektorientering i R

  • Viktiga koncept:
    • Inkapsling (Encapsulation): Gömma och ordna relaterad data
    • Polymorfism (Polymorphism): generiska funktioner
    • Arv (Inheritance): Underlättar specialisering av data och metoder, via underklasser

Objektorientering i R

Olika typer av klasser i R:

  • basklasser
  • S3 (informellt): “lista med klassattribut” -> Den här kursen
  • S4 (formellt): element väljs ut med @
  • reference classes

Generiska funktioner (S3)

  • OO i R utgår från generiska funktioner.
  • Generisk = allmänn
  • Gör olika saker beroende på objektets klass
  • Ex. plot(), mean(), summary(), names()
  • Funktionen anropar metoden för objektet, detta kallas “Dynamic dispatch”

Metoder

  • En funktion för en specifik klass
  • Metoderna utgår från generisk funktion
  • Alla metoder för en generisk funktion: methods()
  • Defaultmetod med mean.default()
  • Ex. mean.difftime()
  • Metoder kan anropas direkt som vanliga funktioner

Objektorientering i R: länkar

Objektorientering i R: Demo

Datum och tid

Datum och tid

  • Datum är klurigt att arbeta med - men används extremt mycket
  • Två typer av tid
    • Relativ tid, längden beror på när de inträffar (ex. år, månad)
    • Exakt tid (ex. sekunder, minuter, timmar, dagar, veckor)
  • Enklare funktioner följer med base
  • En introduktion finns i Roger Pengs [video]

Datum och tid i base

my_date <- "2012-01-31"
class(my_date)
[1] "character"
my_date_as_date <- as.Date(my_date)
my_date_as_date
[1] "2012-01-31"

lubridate

Paketet lubridate

Tre huvudsakliga delar:

  1. Läsa in datum (från text) - parsing
  2. Ändra inlästa datum
  3. Göra beräkningar med datum

Exempel

library(lubridate)
test<-ymd("1999-06-17")
print(test)
[1] "1999-06-17"
week(test)
[1] 24
ymd("1999-06-17") + weeks(2)
[1] "1999-07-01"

Paketet lubridate: Parsing

Elementordning Funktion
år, månad, dag ymd()
år, dag, månad ydm()
månad, dag, år mdy()
timme, minut hm()
timme, minut, sekund hms()
år, mån, dag, timme, min, sek ymd_hms

Källa: Grolemund and Wickham (2011, Table 4)

Paketet lubridate

För att “plocka ut” eller ändra delar av ett datum används följande funktioner

Datum Funktion Tidsdel Funktion
år year() timme hour()
månad month() minut minute()
vecka week() sekund second()
årsdag yday() tidszon tz()
månadsdag mday()
veckodag wday()

Källa: Grolemund and Wickham (2011, Table 5)

Exempel

my_date <- ymd("1999-06-17")
week(my_date)
[1] 24
wday(my_date, label = TRUE)
[1] Thurs
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
year(my_date) <- 2015
my_date
[1] "2015-06-17"

Paketet lubridate

  • För att räkna med datum finns det fyra olika objekt i lubridate
    • instant (sv. tidpunkt)
    • interval ( sv. intervall)
    • duration (sv. duration)
    • period (sv. period)
  • interval, duration och period används för att beskriva tidsspann

instant och interval

  • instant
    • En specifikt tillfälle i tiden
    • Ex. “2004-02-21 kl 12.33”
    • Viktiga funktioner: now(), today(), here()
  • interval
    • Tidsspannet mellan två instant.
    • new_interval(start,end)

instant och interval: exempel

library(lubridate)
instant_1 <- ymd("2001-06-17")
instant_2 <- ymd("2009-01-11")
my_interval <- new_interval(start = instant_1, end = instant_2)
my_interval
[1] 2001-06-17 UTC--2009-01-11 UTC

Duration

  • Ett fixt tidsspann som mäts i sekunder
  • Tänk kontinuerlig tid
  • Absolut tid i sekunder
  • Börjar med d
  • Konvertera interval med as.duration()
  • Ex: new_duration(),dseconds(), dhours(), ddays() o.s.v.

Duration: exempel

my_interval / ddays(30)
[1] 92.16667
as.duration(my_interval)
[1] "238896000s (~7.57 years)"

Period

  • Utgår från den aktuella enheten (dagar, månader, år)
  • Tänk diskret tid
  • Relativ tid
  • Vad vi i dagligt tal menar med ex. fem månader
    • ex. period(num=,units=), minutes(), hours(), days(), weeks() o.s.v.

Period: exempel

my_interval / months(1)
[1] 90.80645
my_interval %/% years(1)
[1] 7
as.period(my_interval)
[1] "7y 6m 25d 0H 0M 0S"

Att räkna med tid

Vi lägger till /drar bort en duration eller period till/från ett datum.

course_start <- ymd("2015-01-19")
course_start + weeks(8)
[1] "2015-03-16"
course_start + months(1)
[1] "2015-02-19"
course_start + ddays(30)
[1] "2015-02-18"

Avrunda datum

  • round_date(x,unit=)
  • floor_date(x=,unit=)
  • ceiling_date(x=,unit=)

Linjär algebra

Linjär algebra: Matriser

  • Matris är två-dimensionella tabeller.
  • Skapas en 2x3 matris från en vektor my_vector: matrix(my_vector,2,3)
  • matrix() fyller matrisen kolumnvis
  • matrix(myVector,2,3, byrow=TRUE) fyller radvis.

Linjär algebra

  • Transponat \( \mathbf{X}' \) eller \( \mathbf{X}^{T} \) : t(X)
  • Invertera matris \( X^{-1} \) : solve(X)
  • Matrismultiplikation \( \mathbf{A}\cdot\mathbf{B} \) eller \( \mathbf{AB} \) : A%*%B
    • Kan bara göras med klassen matrix, ej vektorer
    • Undvika att en matris blir en vektor med X[,1,drop=FASLE]
  • Diagonalmatris: diag(c(1,3,5))
  • Enhetsmatrisen \( \mathbf{I} \) : diag(3)

Linjär algebra

  • [Egenvärden och egenvektorer]: eigen(X)
    • Returnerar en lista med egenvärden och egenvektorer
  • Summera rader eller kolumner: rowSums(X) och colSums(X)
  • Kombinera matriser: rbind(X,Y) eller cbind(X,Y)

Linjär algebra: Matrix

  • Matrix är ett paket i som implemeterar effektivare/snabbare funktioner för linjär algebra, jämfört med grundfunktionerna i R.
  • Grunden är funktionen Matrix(), vilket är en konstruktor, som skapar matriser med en annan klass jämfört med matrix().
  • Matriserna i Matrix baseras på S4 klasser.
  • I Matrix är det skillnad på glesa och täta matriser.
  • Kolla på vingetterna här för mer info.

Referenser

Grolemund, G., Wickham, H., 2011. Dates and times made easy with lubridate. Journal of Statistical Software 40 (3), 1–25. kan hittas [här]