Statistisk Programmering Uppgifter till lektion 1

Uppgifter till lektion 1
Statistisk Programmering
1. Hur många MB RAM behövs för att lagra en 1000 × 1000
matris i dubbel precision?
2. Skriv en R-funktion som omvandlar (positiva hel-)tal från
binärt till decimalt.
Använda R
Göran Broström
3. Skriv en R-funktion som omvandlar (positiva hel-)tal från
decimalt till binärt.
[email protected]
Statistiska institutionen
Umeå universitet
901 87 Umeå
Statistisk Programmering, hösten 2002 – p.1/32
Programmeringsspråk
nivåordnade från låg till hög.
Statistisk Programmering, hösten 2002 – p.2/32
Kompilerande språk
C och F ORTRAN är kompilerande språk:
Maskinkod. Nödvändigt, men vi använder det inte
direkt.
C/C++. Finns tillgängligt, kan länkas till R. Både lågoch högnivå. Många operativsystem och kompilatorer(!)
är skrivna i C.
hela programmet omvandlas till maskinkod innan det
kan köras.
Kompilatorn kan hitta formella fel i programmet.
Väl kompilerat är det snabbt.
F ORTRAN . Inte lika “lågnivåigt” som C. Framför allt ett
naturvetenskapligt, matematiskt beräkningsspråk.
R.
Högsta nivå. Är skrivet i framför allt C, men delvis
också i F ORTRAN.
Statistisk Programmering, hösten 2002 – p.3/32
Statistisk Programmering, hösten 2002 – p.4/32
R som (förvuxen) räknedosa
Tolkande språk
R
> 2 + 2
[1] 4
är ett tolkande (“interpreterande”) språk.
Vanligt för interaktiva miljöer.
Programmet tolkar (översätter till maskinkod) en rad i
taget och utför omedelbart.
> exp(-2)
[1] 0.1353353
Man slipper kompileringssteget.
> rnorm(9)
[1] -0.63944411 0.19445486 0.06718542
[4] 1.35989592 -1.11763370 1.58923022
[7] -1.32153729 0.40863900 -0.57155763
Men långsammare än kompilerad kod.
Statistisk Programmering, hösten 2002 – p.5/32
Tilldelning
Statistisk Programmering, hösten 2002 – p.6/32
Jämförelse
> x <- 2
gör flera saker på en gång:
Reserverar 8 bytes minne för x i dubbel precision.
Uppdaterar “adresskatalogen” med adressen till
minnesplatsen för x.
Kopierar värdet ’2’ till denna minnesplats.
Tilldelningsoperatorversioner:
> x <- sqrt(2)ˆ2
> x
[1] 2
> x == 2
[1] FALSE
Vad händer?? Avrundningsfel!!
> options(digits = 17)
> x
[1] 2.0000000000000004
’<-’ är tilldelningsoperator i R.
Använd all.equal(x, 2). Tillåter avrundningsfel.
’=’ är tilldelningsoperator i C och F ORTRAN.
För integer och character är ’==’ OK!
’:=’ är tilldelningsoperator i Pascal.
Statistisk Programmering, hösten 2002 – p.7/32
Statistisk Programmering, hösten 2002 – p.8/32
Logiska operatorer
Jämförelse
R och C
Exakt likhet
==
Exakt olikhet
!=
Mindre än
<
Mindre än eller lika med
<=
Större än
>
Större än eller lika med
>=
Dataobjekt
Allt i R är objekt!
F ORTRAN
Alla objekt har ett tillstånd (mode) och en längd.
.eq.
.ne.
.lt.
.le.
.gt.
.ge.
Dataobjekt har tillstånd som
numeric
complex
character
logical
Statistisk Programmering, hösten 2002 – p.9/32
Statistisk Programmering, hösten 2002 – p.10/32
Vektorer, matriser
Språkobjekt
Språkobjekt (language objects) har tillstånd som
function
expression
name
Alla enkla dataobjekt är vektorer. Inga skalärer i R.
Attributet dim bestämmer om en vektor är en matris.
> x <- c(1, 2, 3, 4, 5, 6)
> dim(x) <- c(2, 3)
> x
[1,]
[2,]
[,1]
1
2
[,2]
3
4
[,3]
5
6
Enklare (?):
x <- matrix(x, nrow = 2, ncol = 3)
Statistisk Programmering, hösten 2002 – p.11/32
Statistisk Programmering, hösten 2002 – p.12/32
Lista (list)
Databas (data.frame)
I en vektor är alla element av samma typ.
En lista med variabler av samma längd,
En lista är en vektor där elementen får vara av
godtycklig typ, t.o.m. andra listor.
men möjligen av olika typ, t.ex. numeric, factor,
character, logical, ...
Liknar en “structure” i C,
> library(MASS); data(painters)
men är mer flexibel.
lista <- list()
x <- c(1,2,3)
lista[["age"]] <- x
lista$age <- x
lista$age <- NULL
> painters
Comp
Draw
Col
Expr
School
Da Udine
10
8
16
3
A
Da Vinci
15
16
4
14
A
...
> data <- read.table(...
Statistisk Programmering, hösten 2002 – p.13/32
Indexering, vektorer
Statistisk Programmering, hösten 2002 – p.14/32
Matriser och databaser
x[ind], där ind är
Vektor med positiva heltal, 1 <= tal <=
length(x). ind kan vara hur lång som helst.
Logisk vektor. Måste vara av samma längd som x.
Plockar ut de element i x som svarar mot TRUE i
ind.
Vektor med negativa heltal. Anger element som ska
tas bort.
Vektor med textsträngar. För namngivna vektorer.
Statistisk Programmering, hösten 2002 – p.15/32
> x <- matrix(1:6, ncol = 3)
> x
1 3 5
2 4 6
is.matrix(x[, 1])
[1] FALSE
> is.matrix(x[, 1, drop = FALSE])
[1] TRUE
En data.frame kan indexeras som om den vore en
matris. Se upp med drop-ing!
Statistisk Programmering, hösten 2002 – p.16/32
Funktioner, “klassiska” språk
Litteratur
Läs
H UVUDPROGRAM
An Introduction to R.
Dalgaard (2002): Introductory Statistics with R,
Springer.
Venables & Ripley (2002): Modern Applied Statistics
with S, Fourth Edition. Springer.
Venables & Ripley (2000): S Programming. Springer.
(i stigande “svårighetsgrad”).
F UNKTION
program gb
integer k, len
double precision x(100),
1
y(100), z
...
do k = 1, len
x(k) = k
y(k) = len - k + 1
end do
call inner(len, x, y, z)
...
end
subroutine inner(n, x1, x2, y)
integer n
double precision x1(n),
1
x2(n), y
integer k
y = 0.d0
do k = 1, 10
y = y + x1(k) * x2(k)
end do
return
end
Statistisk Programmering, hösten 2002 – p.17/32
Funktioner i matematiken
Definition: En funktion f från en mängd X till en mängd Y
är en regel, som till varje x ∈ X knyter precis ett element
y ∈ Y . Vi skriver:
y = f (x),
x ∈ X, y ∈ Y.
Statistisk Programmering, hösten 2002 – p.19/32
Statistisk Programmering, hösten 2002 – p.18/32
Funktioner i R
En funktion f saknar sidoeffekter om
> y <- f(x)
endast ändrar/skapar y . Önskvärd egenskap, oftast.
y <- sin(x) # men
y <- plot(x) # för sidoeffekten!
Statistisk Programmering, hösten 2002 – p.20/32
Lexical scoping
Funktioner i R
F UNKTION
“H UVUDFUNKTION ”
gb <- function(){
x <- 1:10
y <- 10:1
z <- inner(x, y)
...
}
inner <- function(x1, x2){
# Kolla indata:
if (!is.numeric(x1))
stop("x1 ...",)
...
sum(x1 * x2) ## = svaret
}
Enda sättet att returnera ett värde från funktionen är via
“sista raden”. I “huvudfunktionen” får z värdet
sum(x1 * x2) från funktionen inner.
Obs: I R vet vektorer hur långa de är!
I R vet funktioner var de är definierade, och de har tillgång
till objekt definierade där!
gb <- function(){
inner <- function() sum(x * y)
x <- 1:10
y <- 10:1
inner()
}
Var letas en variabel? Jo,
1. Lokal variabel.
2. I argumentlistan.
3. Den definierande miljön.
Statistisk Programmering, hösten 2002 – p.21/32
Statistisk Programmering, hösten 2002 – p.22/32
Grafik
Vitt brus
Läs dokumentationen om par and plot!
För att importera grafik i ett LATEX-dokument, I R:
\begin{center}
\begin{figure}\label{fig:vitt}
\epsfig{file = wn.eps, width = \textwidth}
\caption{Simulerat vitt brus}
\end{figure}
\end{center}
−2 −1 0
och i LATEX:
1
2
3
par(bg = "white") ## För vit bakgrund.
plot(1:100, rnorm(100), type = "l",
xlab = "time", main = "white noise")
dev.copy2eps(file="wn.eps")
rnorm(100)
>
>
+
>
white noise
0
20
40
60
80
100
time
Figure 1: Simulerat vitt brus
Statistisk Programmering, hösten 2002 – p.23/32
Statistisk Programmering, hösten 2002 – p.24/32
Flödeskontroll, repeat
Flödeskontroll, while
Newtons metod för “rotutdragning”:
square.root <- function(y){
if (y < 0) stop("Negative values no-no")
x <- y / 2
while (abs(x*x-y) > 1e-10) x <- (x+y/x)/2
x
}
Det kan hända att en “while-loop” inte genomlöps någon
gång.
square.root <- function(y){
if (y < 0) stop("Negative values no-no")
x <- y / 2
repeat{
x <- (x+y/x)/2
if (abs(x*x-y) < 1e-10) break
}
x
}
“repeat-loopen” genomlöps minst en gång.
Statistisk Programmering, hösten 2002 – p.25/32
Statistisk Programmering, hösten 2002 – p.26/32
Flödeskontroll, for
>
>
+
>
Sammansatta uttryck
x <- seq(0, 1, .05)
plot(x, x, ylab = "y", type = "l",
main = "Power curves")
for (j in 2:8) lines(x, xˆj)
I repeat-exemplet
repeat{
x <- (x+y/x)/2
if (abs(x*x-y) < 1e-10) break
}
är två uttryck “sammanbuntade” inom { }. Kallas ett
sammansatt uttryck. Värdet är värdet av sista uttrycket.
0.4
Rekommendation: Använd alltid { } i samband med for, while
0.0
y
0.8
Power curves
0.0
0.2
0.4
0.6
0.8
1.0
och repeat!
x
Statistisk Programmering, hösten 2002 – p.27/32
Statistisk Programmering, hösten 2002 – p.28/32
Villkorliga uttryck, if
Villkorliga uttryck, ifelse
appr.eq <- function(x, y){
identical(all.equal(x, y), TRUE)
}
if (appr.eq(x, y)){
do.something
}else if (x < y){
do.something.else
}else{
stop("y can’t be smaller than x")
}
x <- ifelse(x < 0, 0, x)
ersätter alla negativa värden i vektorn x med 0 (noll).
Vektoriserad version av if.
for (i in 1:length(x)){
if (x[i] < 0){
x[i] <- 0
}
}
Också
x <- pmax(x, 0)
ger önskat resultat.
Statistisk Programmering, hösten 2002 – p.29/32
Kategoriska variabler, factor
En faktor har nivåer (level). Exempel:
>
>
>
+
pain <- c(0, 3, 2, 2, 1)
f.pain <- factor(pain, levels = 0:3)
levels(f.pain) <c("none", "mild", "medium", "severe")
En användbar funktion är relevel, som väljer (ny)
referenskategori.
> f.pain <- relevel(f.pain, ref = "medium")
Statistisk Programmering, hösten 2002 – p.31/32
Statistisk Programmering, hösten 2002 – p.30/32
Uppgifter, lektion 2
1. order och sort: I databasen painters (MASS) är
målarna sorterade efter School. Bilda en ny databas
där målarna istället är sorterade i bokstavsordning (dvs
hela databasen ska vara sorterad på samma sätt).
2. För painters, gör en “scatterplot” av Expression mot
Composition, men så att alla punkter med Colour högst
9 får blå färg, medan punkter med Colour över 9 blir
röda. Välj lämplig text på x- och y -axel, etc.
3. Samla alla dina lösningar, gamla och kommande, i ett
LATEX-dokument, som ska lämnas in till mig i god tid före
den sjätte dagen (lektionen)!
Statistisk Programmering, hösten 2002 – p.32/32