Statistikpakken R

ST501 – R NOTER
Søren Møller og Søren Hesel
April 1, 2011
Dette er et kort notesæt, hvor der skulle være alt hvad der skal bruges i kurset ST501. Ønskes
der et mere udførligt notesæt henvises til http://cran.r-project.org/doc/manuals/R-intro.pdf
eller www.sbtc.ltd.uk/notes/Rintro.pdf. Det første er et generelt notesæt, mens det andet er
mere om vektorregning i R.
Vigtigt: R har en ganske god hjælpefunktion; ved man for eksempel ikke hvordan man får
længden af en vektor søger man ganske enkelt på længde (på engelsk selvfølgelig). Det vil sige
man skriver:
help(length)
For at komme ud af hjælp skrives q.
1
Installation af R
R kan downloades gratis fra hjemmesiden http://www.r-project.org til diverse styresystemer
(linket CRAN på venstre side), og installeres let. Det er installeret på maskinerne vi bruger til
computerøvelserne. I linux søges efter r-base i f.eks. Synaptic.
2
Om R
R er et vektor- og matrixbaseret program, hvilket vil sige alle variabler opfattes som en matrix.
Man tilskriver x en værdi med kommandoen <-. Dvs. et eksempel er
x <- 5
Vil man oprette en vektor f.eks. (1, 2, 3) skrives:
x <- c(1,2,3)
dvs. kommandoen c laver en vektor.
Skal man skrive til den i’te række og j’te søjle af en matrix x (f.eks. give den værdien 5)
skrives:
x[i,j] <- 5
og skal kun j’te søjle bruges:
1
x[,j] <- c(5,5,5)
Bemærk at R indekserer fra 1, hvilket vil sige, at når man tæller pladser i sine søjler starter
man fra 1.
Bemærk, dette også medfører, at når man f.eks. skal lave et plot af data eller en matrix skal
det specificeres om det kun skal være af en søjle eller vektor - ellers bruges hele matricen eller
datasættet som data.
2.1
Flere vektorfunktioner i R
• rep(a,b): Gentager a b gange: dvs. laver vektoreren (    ).
• Eksempel: rep(1,5) giver (1, 1, 1, 1, 1)
• seq(a,b,c): Laver en sekvens af tal fra a til b med skridtlængde c.
• Eksempel: seq(1,5,0.5) giver (10 15 20 25 30 35 40 45 50).
2.2
Data i R
R kan arbejde med næsten alle slags data-filer – ikke bare tekstfiler. Dog skal vi ikke bruge
andre slags i dette kursus. Det er vigtigt, at hvis man har overskrift på sin data (se nedenfor),
må der ikke være mellemrum i ordene. Decimaltal skal være med punktum som decimaldeler,
da R bruger angelsaksisk decimaltal ligesom Maple.
3
Opstart af R
I R skrives kommandoer i et R-script; dette er den bedste måde at kunne gengive det man har
lavet, da det ellers er svært at gemme, hvad man har lavet. En script-fil kan gemmes som speciel
R-fil, men en almindelig tekst-fil kan også bruges. I en scriptfil bruges # som udkommentering
– dvs. at R ikke læser noget efter # på en linje.
3.1
Linux
Under linux er R et konsol-program og kaldes med kommandoen R fra den mappe hvor ens
datafiler er. Man kører sine R-scripts med kommandoen source("filnavn"). For at udskrive tal
bruges kommandoen print.
3.2
Windows
R startes under Windows fra startmenuen. Det er vigtigt at man som første handling efter
opstart vælger Change dir i menuen File, og udvælger den mappe, som indeholder ens datafiler.
Man kører et script ved at åbne det med File, Open Script og så markere det, der skal køres og
Ctrl+R. Linux-måden kan også bruges.
2
4
4.1
Betjening af R
Linux
Kommandoer indtastes direkte i konsollen, plots fremkommer i et ekstra vindue.
4.2
Windows
Kommandoer indtastes i det vindue der hedder R Console, plots fremkommer i et ekstra vindue.
5
Regning med vektorer
Meget af R’s vektorregning er lige som med programmet Maple. Man lægger sammen og trækker
fra pladsvis med + og -. Man ganger og dividerer pladsvis med * og /, og skal man lave
vektorprodukt og matrixprodukt bruges %*%.
5.1
Transformation af variable
I statistik er der ofte en ikke-lineær sammenhæng mellem  og  så for eksempel sammenhængen
log  ∼  ja så må man ud fra  lave en vektor med værdierne af log . Dette gøres ved at
tilskrive en ny vektor  værdierne log .
5.2
Eksempel
> x
[1] 1 2 3 3 4 5 6 8 9 11
> xx <- log(x)
> xx
[1] 0.0000000 0.6931472 1.0986123 1.0986123 1.3862944 1.6094379 1.7917595
[8] 2.0794415 2.1972246 2.3978953
Ofte skal man bruge tal for længden af en vektor, summen af tallene og så videre. Dette er
gjort meget intuitivt i R med henholdvis kommandoerne length(x) og sum(x).
6
Indlæsning af data
Data indlæses med kommandoen
data <- read.table(filename,header)
hvor filename er navnet på din datafil (som helst skal ligge i den mappe du valgte som aktiv
mappe, da du startede R) og header er header=FALSE når datafilen ikke indeholder variabelnavne hhv. header=TRUE når filen indeholder variabelnavne. Betegnelsen data er det objektnavn
vi giver til vores data, og som vi kan bruge for at arbejde med dem. I dette notesæt kalder vi
vores data for data, x eller y, men andre navne kan sagtens bruges.
De indlæste data kan udskrives på skærmen ved at indtaste variablenavnet som kommando.
3
data
Hvis datafilen indeholder mere end en søjle (f.eks. x- og y-værdier til en lineær regression),
kan disse separeres ved kommandofølgen
data <- read.table(filename,header)
x <- data$V1
y <- data$V2
Vær opmærksom på hvilken søjle der er hvilken, og udskiv om nødvendigt x og y i kommandofølgen.
6.1
Eksempel
> data <- read.table("data.txt",header=FALSE)
> data
V1
1 18.95
2 19.00
3 17.95
4 15.54
5 14.00
6 12.95
7
8.94
8
7.49
9
6.00
10 3.99
6.2
Eksempel
> data <- read.table("data2.txt",header=FALSE)
> data
V1
V2
1
1 18.95
2
2 19.00
3
3 17.95
4
3 15.54
5
4 14.00
6
5 12.95
7
6 8.94
8
8 7.49
9
9 6.00
10 11 3.99
> x<-data$V1
> y<-data$V2
> x
4
[1] 1 2 3 3 4 5 6 8 9 11
> y
[1] 18.95 19.00 17.95 15.54 14.00 12.95
7
8.94
7.49
6.00
3.99
Fordelinger
For at få værdier af tætheds- og fordelingsfunktioner bruges henholdsvis d og p foran den ønskede
fordelings navn. Vi laver et eksempel med den vigtigste fordeling, normalfordelingen, nedenfor.
Kvantilerne for en fordeling fås med bogstavet q.
Man skriver et af bogstaverne foran betegnelsen for den pågældende fordeling, variablen og til
sidst parametre til at finde den rigtige fordeling - se eksempel med normalfordelingen nedenfor.
7.1
Normalfordelingen
Normalfordelingen bruges tit som antagelse for fordelingen af data. Derfor er det vigtigt, at
kunne få tæthedsfunktion og fordelingsfunktion for denne fordeling. Efter det bogstav, der
repræsenterer hvilken funktion man ønsker skriver man norm. Derefter skal variablen skrives,
og til sidst middelværdi og spredning (sd), da disse to alene karakteriserer normalfordelingen.
Se afsnit 12 for eksempel for brug af kvantil-funktion.
7.1.1
Eksempel
> dnorm(0.5,0,1)
[1] 0.3520653
Fordelingsfunktionen fås ved pnorm.
7.1.2
Eksempel
> pnorm(0.5,0,1)
[1] 0.6914625
7.2
Andre fordelinger
De følgende udbredte fordelinger kan også bruges i R på tilsvarende måde:
Fordeling
Student -t
Fisher -F
2
Binomial
Kode
t
f
chisq
binom
Table 1: Flere fordelinger
Parametre
Antal frihedsgrader
Antal frihedsgrader k og l
Antal frihedsgrader
Populationsstørrelse og ssh. for succes.
5
8
Plots
8.1
Scatterplot
Skal der laves et plot af  mod , bruges kommandoen plot.
8.1.1
Eksempel
> data
V1
V2
1 2.00 5.00
2 2.50 4.50
3 2.30 5.40
4 1.90 4.70
5 2.50 6.70
6 2.80 7.00
7 3.60 4.50
8 2.70 5.20
9 2.10 4.10
10 1.89 4.78
plot(data$V1,data$V2)
Figure 1: Scatterplot
8.2
Histogrammer
Histogrammer genereres med kommandoen
6
hist(data)
Som regel skal man lægge en fordeling oveni, og så kan man bede om et tæthedshistogram;
dette gøres ved
hist(data,probability=T)
Skal der indlægges en normalfordelingskurve oveni histogrammet, bruges i stedet kommandofølgen
m<-mean(data)
v<-var(data)
x<-seq(-5,5,.1)
n<-dnorm(x,m,sqrt(v))
lines(x,n)
hist(data)
Bemærk her, at det antages at vi skal bruge intervallet [−5 5]. Ellers skal der gengives andre
tal i tredje linie.
8.2.1
Eksempel
> data
[1] 1 2 3
> hist(data)
3
4
5
6
8
9 11
Figure 2: Histogram
7
8.3
Histogram med ikke-numeriske data
Det sker, at ens variabel for eksempel er antal gange en farve er observeret. Hvis man vil lave
et histogram for sådanne data bruges:
8.3.1
Eksempel
n <- length(data$farve)
plot(1:n,data$antal,type="h",xlab="",labels=F,tick=F)
axis(1,at=1:n,labels=data$farve,cex.axis=0.75,las=2)
axis(2,seq(1,floor(max(data$antal))+1,5),las=1)
8.4
Boxplots
Boxplots genereres med kommandoen
boxplot(data)
8.4.1
Eksempel
> data
[1] 1 2 3 3
> boxplot(data)
4
5
6
8
9 11
Figure 3: Boxplot
8
8.5
Kvantilplots
Normalfordelings-kvantilplots kan genereres med kommandofølgen
n<-length(data)
q<-qnorm((1:n)/(n+1))
plot(q,sort(data))
8.5.1
Eksempel
> data
[1] 1 2 3 3 4 5 6 8 9 11
> n<-length(data)
> n
[1] 10
> q<-qnorm((1:n)/(n+1))
> q
[1] -1.3351777 -0.9084579 -0.6045853 -0.3487557 -0.1141853
[7] 0.3487557 0.6045853 0.9084579 1.3351777
> plot(q,sort(data))
0.1141853
Kommandoen qqnorm kan bruges, når data er normalfordelt. Så skrives der
qqnorm(data)
Figure 4: Kvantilplot
9
9
Middelværdi og varians
Middelværdie af en datavektor bestemmes med kommandoen
mean(data)
og variansen bestemmes med
var(data)
Da spredningen er kvadratroden af variansen kan denne bestemmes ved
sqrt(var(data))
eller direkte ved kommandoen sd,
sd(data)
ønskes der et vægtet gennemsnit (f.eks. hvis antal målinger af en bestemt værdi er angivet
i en seperat søjle), bruges i stedet kommadoen
weighted.mean(data,weight)
9.1
Eksempler
> data
[1] 1 2 3 3 4
> mean(data)
[1] 5.2
> var(data)
[1] 10.62222
> sqrt(var(data))
[1] 3.259175
10
5
6
8
9 11
Median og kvartiler
Median, øvre og nedre kvartil samt mindste og største værdi i datasættet kan vises med kommandoen
summary(data)
10.1
Eksempel
> data <- read.table("data.txt",header=FALSE)
> data
V1
1 18.95
2 19.00
10
3 17.95
4 15.54
5 14.00
6 12.95
7
8.94
8
7.49
9
6.00
10 3.99
> summary(data)
V1
Min.
: 3.990
1st Qu.: 7.853
Median :13.475
Mean
:12.481
3rd Qu.:17.348
Max.
:19.000
Her angiver Min. mindste og Max. største måling, mens 1st Qu. og 3rd Qu. angiver nedre
og øvre kvartil, Median medianen og Mean middelværdien.
11
Lineær regression
For at lave lineær regression mellem to vektorer x og y bruges kommandoen
fit <- lm(y~x)
Så kan informationer om regressionen vises med kommandoerne
fit
summary(fit)
11.1
Eksempel
> data<-read.table("data2.txt",header=FALSE)
> data
V1
V2
1
1 18.95
2
2 19.00
3
3 17.95
4
3 15.54
5
4 14.00
6
5 12.95
7
6 8.94
8
8 7.49
9
9 6.00
11
10 11 3.99
> x<-data$V1
> y<-data$V2
> x
[1] 1 2 3 3 4 5 6 8 9 11
> y
[1] 18.95 19.00 17.95 15.54 14.00 12.95
> fit<-lm(y~x)
> fit
8.94
7.49
6.00
3.99
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept)
21.151
x
-1.667
Her er tallet under (Intercept) skæring med y-aksen og tallet under x hældningen for
bedste rette linje.
> summary(fit)
Call:
lm(formula = y ~ x)
Residuals:
Min
1Q Median
-2.2072 -0.5206 -0.2340
3Q
0.9183
Max
1.8010
Coefficients:
Estimate Std. Error t value
(Intercept) 21.1509
0.7558
27.98
x
-1.6673
0.1249 -13.35
--Signif. codes: 0 ’***’ 0.001 ’**’ 0.01
Pr(>|t|)
2.87e-09 ***
9.51e-07 ***
’*’ 0.05 ’.’ 0.1 ’ ’ 1
Residual standard error: 1.222 on 8 degrees of freedom
Multiple R-squared: 0.957,
Adjusted R-squared: 0.9516
F-statistic: 178.1 on 1 and 8 DF, p-value: 9.506e-07
Her ses skæring med y-aksen og hældning i søjlen under Estimate mens Multiple R-squared
angiver determinations-koefficienten 2 .
12
11.2
Anovatabeller
Når man har lavet en lineær model i R, gemt i objektet fit laves en Anovatabel med kommandoen anova(fit).
11.2.1
Eksempel
anova(fit)
Analysis of Variance Table
Response: data$V2
Df Sum Sq Mean Sq F value
Pr(>F)
data$V1
1 265.751 265.751 178.09 9.506e-07 ***
Residuals 8 11.938
1.492
--Signif. codes: 0 ´S***Š 0.001 ´S**Š 0.01 ´S*Š 0.05 ´S.Š 0.1 ´S Š 1
>
11.3
Konfidensinterval for lineær regression
For at lave et konfidensinterval for parametrene i en model bruges confint.
11.3.1
Eksempel
> confint(fit)
2.5 %
97.5 %
(Intercept) 19.407867 22.893848
x
-1.955388 -1.379173
12
Konfidensinterval for middelværdi
Hvis data antages at være normalfordelte med kendt varians  kan man lave et niveau 1 − 
konfidensinterval for middelværdien  med formlen:
¡
¢
 − SE()2   + SE()2
hvor  er gennemsnittet af data, SE() =  og 2 er 1 − 2-kvartilen for standard
normalfordelingen N(0 1), som i dette tilfælde fås med qnorm(1-alpha/2,0,1).
13