Programmering i R

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

Josef Wilzén

STIMA, Linköpings universitet

2021-03-01

Dagens föreläsning:

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

Info:

  • Glöm inte att anmäla er till datortentan!
  • Tentan kommer att vara på distans (4 h), inlämning på Lisam.
  • Endast anmälda studenter får skriva
  • Finns gamla tentor på kurshemsidan
  • Mer info närmare tentan

Info:

  • Komplettering labb 1-4: Sker i samband med ordinarie inlämning för labb 6.
  • Miniprojekt
    • Kommundata: fix tidpunkt (= ett år)
    • Tidseriedata: formatera x-axel i plot
      • labb 5: 1.2.2 uppgift 6)
      • labb 6: 3.3 Sekvenser med datum

Programmeringsparadigm och R

Programmeringsparadigm

Funktionell programmering

  • Funktioner utan sidoeffekter (tänk matematiska funktioner)
    • En funktions output beror bara på värdena på inargumenten
  • Exempel:
    • R, Scala, Erlang
  • R har “first class functions”:
    • Funktioner kan manipuleras som andra objekt, sparas i listor mm
    • Ex. apply()-funktionerna
  • Anonyma funktioner: utan namn
  • 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 objekt med funktioner (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
  • Vi kan undersöka ett objekts klass med class()
  • Variabeltyper är “atomära” klasser
  • Klasser har (oftast) en konstruktor (en funktion med samma namn)

Objektorientering i R

  • Viktiga koncept:
    • Inkapsling (Encapsulation): Gömma och ordna relaterad data
    • Polymorfism (Polymorphism): Generiska funktioner som hanterar olika objekt (ex. plot())
    • 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 @,
    • ex paketet Matrix
  • reference classes

Generiska funktioner (S3)

  • OO i R utgår från generiska funktioner (polymorfism).
  • 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] tor
Levels: sön < mån < tis < ons < tor < fre < lör
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()
  • interval
    • Tidsspannet mellan två instant.
    • interval(start,end)

instant och interval: exempel

library(lubridate)
instant_1 <- ymd("2001-06-17")
instant_2 <- ymd("2009-01-11")
my_interval <- 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: 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

months(3) + days(2)
[1] "3m 2d 0H 0M 0S"
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("2019-01-21")
course_start + weeks(8)
[1] "2019-03-18"
course_start + months(1)
[1] "2019-02-21"
course_start + ddays(30)
[1] "2019-02-20"

Datum och tid i R: Demo

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)
  • Diagonalmatris: diag(c(1,3,5))
  • Enhetsmatrisen \( \mathbf{I} \) : diag(3)

Linjär algebra

  • 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=FALSE]
  • Invertera matris \( X^{-1} \) : solve(X)
    • Kom ihåg: \( XX^{-1}=\mathbf{I} \)
  • Lösa ekvationssystem \( Ax=b \): solve(a=A,b=b)
    • \( x=A^{-1}b \)

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.
  • Rekomenderas för mer avancerade tillämpningar

Linjär algebra i R: Demo

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]