ST1301 - Bioberegninger, introduksjon Om kurset Stokastisk modellering: Biologiske prosesser er stokastiske (genetisk drift, mutasjoner, overlevelse, død, populasjonsdynamikk). Vi trenger stokastiske modeller (sett av antakelser) av disse prosessene Noen ganger kan vi komme fram til forståelse av hvordan modellene oppfører seg gjennom analytiske metoder Andre ganger ikke. Da kan modellens oppførsel studeres ved hjelp av simuleringer (f.eks. i R). Statistisk inferens: Hvordan trekke slutninger fra data? (Tema i brukerkurset i statistikk) Hva er en statistisk modell? Det finnes en rekke standard statistiske modeller og metoder som f.eks.: Lineær regresjon Variansanalyse Generaliserte lineære modeller (f.eks. logistisk regresjon) Levetidsmodeller (cox-regresjon) Beregninger for slike standard metoder kan gjøres med forskjellige standard programpakker som SPSS, Minitab, SAS, S-plus, og R. Hva gjør vi om våre modellantakelser ikke svarer til noen standard modell? Lager estimater ved å maksimalisere likelihoodfunksjonen numerisk... Finner fordelingen til estimatorene ved å simulerere data fra modell... Dette krever en del programmeringsferdigheter. 1
Hvorfor R? Høynivå språk som inneholder over 3000 statistisk relaterte funksjoner i base -pakken. I tillegg finnes en mengde tilleggspakker for håndtering av ulike statistiske metoder (mange i forskningsfronten). Relativt kompakt lesbar syntax. Interpretert språk (språket tolkes ved kjøring) (kompileres ikke før kjøring slik som f.eks. pascal, C). Vi kan jobbe mer interaktivt og se resultater mer umiddelbart. Programmet distribueres og modifiseres fritt under GPL lisens. Kan kjøres under de aller fleste operativsystem som Linux og andre Unix varianter, varianter av Microsoft Windows, Mac etc.. Last gjerne ned til egen hjemmemaskin! Svært likt det kommersielle produktet S-plus. I ferd med å etablerere seg som standardverktøyet til statistiskere innenfor akademia. 2
Grunnleggende bruk av R Starter vi R i ved å klikke på R-ikonet i windows blir vi møtt av følgende: R : Copyright 2003, The R Development Core Team Version 1.8.0 (2003-10-08) R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type license() or licence() for distribution details. R is a collaborative project with many contributors. Type contributors() for more information. Type demo() for some demos, help() for on-line help, or help.start() for a HTML browser interface to help. Type q() to quit R. [Previously saved workspace restored] > Tegnet > (Rs kommandoprompt) vises når R venter på at vi skal gi en ny kommando. R kan brukes som en enkel kalkulator. Skriver vi > 10+10 returner R følgende: [1] 20 3
Elementære regneoperasjoner: > 1+2 [1] 3 > 3-4 [1] -1 > 3*2 [1] 6 > 5/6 [1] 0.8333333 > 2*(3+4) [1] 14 > ln(10) Error: couldn t find function "ln" > log(10) [1] 2.302585 > log10(10) [1] 1 > exp(-1) [1] 0.3678794 > sqrt(5) [1] 2.236068 > 5^3 [1] 125 Merk at R bruker punktum og ikke komma som desimalskilletegn (i likhet med engelsk). 4
Symbolske variabler For å ta vare på resultatet av en beregning er det hensiktsmessig å lagre resultatet av beregningen på et eget navngitt sted i datamaskinens minne. Dette gjør vi ved å tilordne resultatet av uttrykket til en symbolsk variabel. Skriver vi > a <- 5+3 opprettes et variabel (en plass i datamaskinens minne) hvor verdien av uttrykket 5+3 (tallet 8) lagres. Variabelen får symbolet (navnet) a. Operatoren <- kalles en tilordningsoperator. Vi kan så senere bruke resultatet av beregningen ved å inkludere a i nye uttrykk. F.eks. > a [1] 8 > a^2 [1] 64 R sitt workspace Variabler vi oppretter lagres i en del av minne kalt Rs workspace. Avlutter vi R (ved å skrive q() ) blir vi spurt om vi ønsker å ta vare på denne delen av minne ved å overføre dette til en fil på harddisken normal kalt.rdata i gjeldende katalog: > q() Save workspace image? [y/n/c]: Starter vi R på et senere tidspunkt vil innholdet av filen.rdata leses inn i workspace igjen slik at variabelen a igjen blir tilgjengelig. 5
Vektorer, elementvise regneoperasjoner, resirkulering Definering av vektorer med c(...): > weight <- c(60,72,57,90,95,72) > weight [1] 60 72 57 90 95 72 De fleste operatorerer virker elementvis på vektorer: > height <- c(1.75,1.80,1.65,1.90,1.74,1.91) > bmi<-weight/height^2 > bmi [1] 19.59184 22.22222 20.93664 24.93075 31.37799 19.73630 Merk at tallet 2 (en vektor av lengde 2) resirkuleres. Hva skjer her? > weight/height^c(2,3) [1] 19.59184 12.34568 20.93664 13.12145 31.37799 10.33314 6
Statistiske regneoperasjoner > sum(weight) [1] 446 > length(weight) [1] 6 > sum(weight)/length(weight) [1] 74.33333 Hvordan beregne empirisk standardavvik s gitt ved s 2 = 1 n (x i x) 2? (1) n 1 Vi bygger uttrykket gradvis: i=1 > xbar <- sum(weight)/length(weight) > weight-xbar [1] -14.333333-2.333333-17.333333 15.666667 20.666667-2.33 > (weight-xbar)^2 [1] 205.444444 5.444444 300.444444 245.444444 427.111111 5.44 > sum((weight-xbar)^2) [1] 1189.333 > sum((weight-xbar)^2)/(length(weight)-1) [1] 237.8667 > sqrt(sum((weight-xbar)^2)/(length(weight)-1)) [1] 15.42293 Disse funksjonene er selvsagt innebyggd i R: > sd(weight) [1] 15.42293 > mean(weight) [1] 74.33333 7
Grafikk > plot(height,weight,pch=2) > hh <- c(1.65,1.7,1.75,1.80,1.85,1,90) > lines(hh,22.5 * hh^2) weight 60 70 80 90 1.65 1.70 1.75 1.80 1.85 1.90 height Funksjonen lines trekker en linje mellom koordinatene gitt ved vektorene > hh [1] 1.65 1.70 1.75 1.80 1.85 1.90 > 22.5 * hh^2 [1] 61.25625 65.02500 68.90625 72.90000 77.00625 81.22500 8
Mer om språket R Interaksjon med R består i evaluering av uttrykk ( expressions ), eventuellt med tilordning til en ny eller eksisterende variabel. Et uttrykk består av funksjonskall, operatorer og referanser til variabler. Eksempler: > plot(height,weight,pch=2) > sum((weight-xbar)^2) > log(weight) Kall til noen funksjoner har sideeffekter (f.eks. kallet til funksjonen plot). Aktuelle og formelle argumenter ved funksjonskall height og weight er aktuelle (faktiske) argumenter i kallet til funksjonen plot. Funksjonen plot har x og y som sine første formelle argumenter. (Skriv help(plot) for å se.) Ved et kall til plot matches aktuelle med formelle argumenter enten på grunnlag av rekkefølgen til aktuelle argumenter (positional matching), f.eks., > plot(height,weight) eller på grunnlag av navn (named matching), f.eks. > plot(y=weight,x=height) Mange funksjoner har formelle argumenter med gode default verdier som blir valgt dersom argumentet ikke oppgis ved et funksjonskall. Hvis ingen argumenter: > ls() > q() 9
Tekststrengvektorer En vektor kan ha elementer som er tekststrenger > c("per","kari","idun") [1] "Per" "Kari" "Idun" Logiske vektorer Og en vektor kan ha elementer som tar verdiene FALSE eller TRUE. > c(t,t,f,f,t) [1] TRUE TRUE FALSE FALSE TRUE En logisk vektor er typisk hva vi får når vi evaluerer et logisk uttrykk: > bmi [1] 19.59184 12.34568 20.93664 13.12145 31.37799 10.33314 > bmi > 25 [1] FALSE FALSE FALSE FALSE TRUE FALSE Merk at operatoren > virker elementvis og at vektoren 25 (av lengde 1) resirkuleres. Manglende observasjoner Elementer i vektorer kan også ta verdien NA som brukes for å indikere en manglende observasjon (missing value). > sum(c(1,2,3,na)) [1] NA Forsøker vi å beregne noe som er umulig får vi element av typen NaN ( not a number ): > log(-1:3) [1] NaN -Inf 0.0000000 0.6931472 1.0986123 Mere hvordan R også håndterer pluss og minus uendelig som en verdi variabler kan ta (Inf). 10
Funksjoner som returnerer vektorer Funksjonen c (concatenate) kobler endende til sine argumenter sammen til én vektor: > a <- c(1,2,3) > b <- c(4,5,6) > c(a,b) [1] 1 2 3 4 5 6 Funksjonen seq (sequence) lager en vektor bestående av en sekvens tall, eventuell kan steglengden oppgis som tredje aktuelle argument: > seq(4,10) [1] 4 5 6 7 8 9 10 > seq(4,10,2) [1] 4 6 8 10 Hvis vi ønsker steglengde lik 1 kan kortformen > 4:10 [1] 4 5 6 7 8 9 10 brukes. Merk at operatoren : har høyere prioritet enn + : > 1:5+1 [1] 2 3 4 5 6 > 1:(5+1) [1] 1 2 3 4 5 6 Funksjonen rep (repeat) repeterer hele første argument et antall ganger bestemt av andre argument: > rep(c("a","b","c"),4) [1] "a" "b" "c" "a" "b" "c" "a" "b" "c" "a" "b" "c" Hvis begge argument er av samme lengde skjer følgende > rep(c("a","b","c"),c(3,2,1)) [1] "a" "a" "a" "b" "b" "c" 11
Matriser En matrise kan lages ved å ordne en vektor av passende lengde enten radvis eller kolonnevis ved hjelp av funksjonen matrix > matrix(1:12,byrow=true,ncol=4) [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 > matrix(1:12,byrow=f,nrow=3) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 Antall rader eller kolonner spesifiseres med argumentet nrow eller ncol. Matriser kan også lages ved lime sammen vektorer kolonnevis med funksjonen cbind eller radvis med rbind: > cbind(1:4,11:14) [,1] [,2] [1,] 1 11 [2,] 2 12 [3,] 3 13 [4,] 4 14 > rbind(1:4,11:14) [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 11 12 13 14 12
Lister Av og til trenger vi å lage ett objekt ut av en samling mindre komponenter. For funksjoner som beregner flere ting (f.eks. egenverdier og egenvektorer) er det ofte hensiktsmessig å returnere disse i form av en liste. Vi kan lage en liste ved hjelp av funksjonen list > kreft <- c(0,0,0,1,1,0) > roeker <- c(10,15,20,17,40,5) > datasett <- list(respons=kreft,behandling=roeker) > datasett $respons [1] 0 0 0 1 1 0 $behandling [1] 10 15 20 17 40 5 > datasett$respons [1] 0 0 0 1 1 0 > mean(datasett$respons) [1] 0.3333333 Her refererer datasett$responstil komponenten respons i listen datasett, på samme måte som vi referer til andre variabler. 13
Data frames Data frames ligner lister men elementene i hver bestanddel hører parvis sammen slik at datastrukturen også får en matrisestruktur: > datasett <- data.frame(respons=kreft,behandling=roeker) > datasett respons behandling 1 0 10 2 0 15 3 0 20 4 1 17 5 1 40 6 0 5 > datasett$respons [1] 0 0 0 1 1 0 Data frames brukes typisk som datastruktur for innsamlede forsøksdata og kan være argument til funksjoner som utfører f.eks. regresjonsanalyse (f.eks. funksjonen lm): > lm(respons~behandling,data=datasett) Call: lm(formula = respons ~ behandling, data = datasett) Coefficients: (Intercept) behandling -0.18723 0.02919 Regresjon behandles senere i kurset. 14
Indeksering Betrakt vektoren > roeker [1] 10 15 20 17 40 5 Både i vanlige uttrykk og i tilordningsuttrykk kan vi referere til bestemte element i vektoren ved å skrive > roeker[3] [1] 20 Mer fleksibel subsetting kan gjøres ved å la en vektor stå i klammeparantesen. Vektoren kan ha positive element: > roeker[c(1,2,4)] [1] 10 15 17 > roeker[2:6] [1] 15 20 17 40 5 > roeker[6:1] [1] 5 40 17 20 15 10 Negative element: > roeker[-2] [1] 10 20 17 40 5 Eller logiske element (mulig med resirkulering): > roeker[c(t,t,f,f,f,f)] [1] 10 15 > roeker[c(t,f)] [1] 10 20 40 > roeker[roeker>=20] [1] 20 40 > roeker>=20 [1] FALSE FALSE TRUE FALSE TRUE FALSE 15