MATEMATISKA INSTITUTIONEN Tillämpad statistisk analys, GN STOCKHOLMS UNIVERSITET VT 2011 Avd. Matematisk statistik GB 2011-03-24 DATORLABORATION 1: TIDSSERIER. I Tarfala har man under en lång följd av år registrerat bland annat medeltemperaturen för varje månad. Data för åren 1980-1992 finns som tabseparerad text under länken Instruktioner och data i rutan för laborationsdagen på kursens hemsida. För att kunna analysera data i R gör du på samma vis som när du laddade ner data till laborationerna i Statistisk analys. Nämligen: Skapa först ett underbibliotek för den här laborationen, och kalla det förslagsvis för tsa1: $ mkdir tsa1 $ cd tsa1 Sedan går du in på Instruktioner och data och sparar filen TarfalaTab.txt i underbiblioteket tsa1 genom att högerklicka på filen på hemsidan och välja Save Link Target As...". (Filen finns även kommaseparerad, vilket kan fungera bättre på vissa plattformar, men från elevdatasalen är det den tabseparerade versionen du bör välja.) Starta sedan R, och läs in filen genom kommandona > Tarfala <- read.table("tarfalatab.txt",header=true) > Artal <- Tarfala$Artal > Manad <- Tarfala$Manad > Temp <- Tarfala$Temp (Alternativet header=true betyder att den inlästa textfilen har rubriker.) Öppna ett hjälpfönster i HTML-format genom kommandot > help.start() där man kan klicka sig fram till olika hjälpsidor. Man kan, precis som i Matlab, när som helst få information om hur ett visst kommando eller funktion fungerar genom kommandot help enligt mönstret > help(mean) som ger information om hur man beräknar medelvärde i R. När man sedan är klar med laborationen eller vill göra ett uppehåll skriver man bara > q() Då kommer programmet att fråga om man vill spara sin workspace image, det vill säga alla variabler som man har definierat under körningen. Svarar man ja (genom att skriva y) så kommer allting att sparas och laddas in i R - 1 -
när man startar det nästa gång. Uppgifterna 1 5 ska besvaras skriftligen. Bifoga den R-kod du skrivit, samt några grafer som visar vad du har gjort och som illustrerar ditt resonemang. UPPGIFT 1. Plotta temperaturen mot tid (=observationsnummer här). Beskriv grafen i ord! UPPGIFT 2. Skapa en ny variabel innehållande årsvisa medelvärden (se R-tips nedan för hur man gör detta), och gör en graf över dem. Verkar temperaturen ha ökat eller minskat under perioden? Spara grafen! UPPGIFT 3. a) Ange ett viktsystem för centrerade glidande medelvärden. Viktsystemet ska ha egenskapen att jämna ut den årsvisa säsongvariationen. Hur många värden innehåller viktsystemet? b) Hur många värden kommer serien av centrerade glidande medelvärden att ha? c) Beräkna serien av centrerade glidande medelvärden. Gör en graf över denna serie, och jämför den med grafen över årsvisa medelvärden du gjorde i Uppgift 2. Vilka skillnader och likheter ser du? UPPGIFT 4. Beräkna de justerade säsongkomponenterna. Vilken månad är varmast? Vilken är kallast? UPPGIFT 5. Genomför en säsongrensning av data. Gör en graf över den rensade serien. Lägg in rensad serie, trend och ursprunglig serie i en och samma graf. (Se R-tips I nedan.) - 2 -
R-TIPS. I. Grafisk framställning av tidsserier. I vårt fall har vi ingen variabel i datasetet som specifikt anger löpande tid, så vad vi vill göra är att plotta olika variabler mot radnummer. Om variabeln heter Y, så kan detta göras genom kommandot > plot(y,type="l") som ritar serien som en sammanhängande kurva. Vill man ha färg så kan man skriva exempelvis > plot(y,type="l", col= blue ) Bokstaven l ( ell, inte ett ) står för line. Om man vill lägga in två tidsserier Y och Z i samma graf, och färga grafen för Z röd, så kan man skriva > plot(y,type="l") > lines(z,col="red") Om de båda tidsserierna har olika längd och/eller ligger ur fas, så måste man komplettera den ena serien eller båda med NA (som är R:s beteckning för saknade värden) i början och/eller slutet. Med hjälp av rep (se nedan under IV) kan man åstadkomma så många NA som behövs, och sedan kombinera ihop dem med tidsserien med hjälp av c(,, ). (Se Lab 1, Statistisk analys GN, Enkla numeriska operationer.) II. Att spara figurer. Om man vill spara en figur exempelvis den som skapats av det första plot-kommandot ovan måste man först ange kommandona > jpeg("figur.jpg") > plot(y,type="l") > dev.off() som skapar filen figur.jpg i underbiblioteket tsa1. För att skriva ut filen, öppna först ett nytt terminalfönster, byt katalog till tsa1, och skriv $ lpr figur.jpg På liknande vis görs en bild i ps-format. III. Att sammanfatta data. Kommandot tapply kan användas för att beräkna medelvärden (och även andra statistikor) över undergrupper av datasetets observationer. Om Y är den variabel vi vill beräkna medelvärden av (exempelvis temperatur), och X för varje observation anger vilken undergrupp den tillhör (exempelvis månad eller år), så kan gruppvisa medelvärden beräknas genom > MedelY <- tapply(y,x,mean) - 3 -
Vektorn MedelY av medelvärden kan sedan användas i andra beräkningar. (Det verkar som om R automatiskt antar att så länge vektorerna X och Y har samma längd, så hör värden på motsvarande platser inom respektive vektor till samma observation.) Om man ska beräkna medelvärden med tapply, och det finns saknade värden som betecknas NA i R så ger tapply värdet NA som svar. Om man istället vill att kommandot ska bortse från saknade värden och beräkna medelvärden av de värden som faktiskt finns, så kan man skriva > MedelY <- tapply(y,x,mean,na.rm=true) IV. Upprepning av värden med mera. R har ett ganska smidigt sätt att upprepa värden via kommandot rep. Dess två vanligaste varianterna illustreras av följande exempel: betrakta vektorn u = (2, 7, 4): > u <- c(2,7,4) Då ger > v <- rep(u,times=4) > w <- rep(u,each=4) vektorerna v = (2, 7, 4, 2, 7, 4, 2, 7, 4, 2, 7, 4) respektive w = (2, 2, 2, 2, 7, 7, 7, 7, 4, 4, 4, 4). En vektor bestående av talen 1 till 10 (exempelvis) ges av > x <- 1:10 Om vi istället skriver > x <- 1:10+2 så blir resultatet inte som man kanske skulle kunna tro en vektor bestående av talen 1 till 12, utan istället en bestående av talen 3 till 12; vad R har gjort är att lägga 2 till samtliga komponenter i vektorn 1:10. Om man däremot hade skrivit 1:(10+2), så hade man fått talen 1 till 12. V. Hantering av matriser. R sammanfogar två matriser (åtminstone om dimensionerna passar ihop) genom att lägga dem sida vid sida, respektive lägga den ena under den andra, via kommandona cbind och rbind. Om vi exempelvis vill sammanfoga två kolonnvektorer u och v till en matris w med två kolumner, så gör vi det genom att skriva > w <- cbind(u,v) Matriser har ett attribut i R kallat dimension : om exempelvis M är en 2x3-matris, så ger > dim(m) svaret 2 3. En talsekvens kan även sakna dimension, i vilket fall vi istället får svaret NULL. Om vi nu har en sekvens av 6 tal utan dimension och vill få R att istället betrakta den som en 2x3-matris, så skriver vi > dim(m) <- c(2,3) - 4 -
På samma vis kan vi förvandla M till en 3x2-matris eller göra den dimensionslös igen genom att skriva, respektive, > dim(m) <- c(3,2) > dim(m) <- NULL Observera dock att det förstnämna kommandot inte ger samma resultat som att transponera M. (Prova!) Transponatet ges istället av t(m). Kommandot length ger antalet element i ett objekt, oavsett eventuell dimension. För en 2x3- matris får vi exempelvis 6. Matrisprodukten av två matriser A och B skrivs A%*%B. Om du får felmeddelandet Error in A %*% B : non-conformable arguments så betyder det att matrisernas dimensioner inte passar ihop. Kontrollera med hjälp av dim! VI. Glidande medelvärden. Börja med att definiera en vektor av vikter. Om vi exempelvis vill bilda ett vanligt glidande medelvärde av tre, så är vikterna (1/3, 1/3, 1/3), och vi kan skriva > vikt <- c(1/3,1/3,1/3) och på motsvarande sätt för andra uppsättningar av vikter. Vad vi nu vill är att en serie av på varandra följande värden i en vektor Y ska multipliceras med respektive vikter, och sedan adderas ihop, och dessutom ska serien av vikter förskjutas längs vektorn Y. Man kan betrakta varje glidande medelvärde som en skalärprodukt av viktvektorn och ett utsnitt ur vektorn Y, alternativt en matrisprodukt förutsatt att vi ser till att den första vektorna är en radvektor och den andra en kolonnvektor. Följande loop skapar en ny serie Glid av glidande medelvärden: > Glid <- c() > for (j in 1:n){Glid <- rbind(glid,y[j:(j+v )]%*%vikt)} Det första kommandot gör Glid till en tom vektor; det behövs för att inte R ska protestera att vektorn Glid inte finns. Utsnittet ur Y är Y[j:(j+v )], se nedan under VII: Övrigt. Observera parenteserna kring j+v. Om du glömmer dem så blir j:j+v det enda talet j+v, istället för vektor av v+1 stycken tal. Parametern n ska ersättas med antalet glidande medelvärden, som bekant lite färre än det ursprungliga antalet observationer. Vad v ska vara för att det hela ska ge önskat resultat får du fundera ut själv. VII. Diverse. Om man vill subtrahera (exempelvis) en variabel från en annan så är det väsentligt att motsvarande vektorer matchar varandra observation för observation. För att uppnå detta måste man ibland klippa av en vektor i början och/eller i slutet. Om exempelvis H är en vektor av längd 100 och vi vill klippa bort de 5 första och de 5 sista observationerna, så kan vi skriva: - 5 -
> H <- H[6:95,] vilket kan utläsas som ta med rad nummer 6 t o m 95, och ta med alla kolonner. Om du får ett felmeddelande, pröva istället utan kommatecken: > H <- H[6:95] Ibland händer det att man får ett felmeddelande vid subtraktion (eller addition) även när de båda vektorerna har samma längd. Detta kan bero på att den ena, men inte den andra har dimension, eller på att de har olika dimension. I så fall måste man justera dimensionen. För att ta reda på vilka objekt som finns i din nuvarande R-session, skriv > ls() Då får du en lista på de namn du har givit objekten. - 6 -