Ohjelmointi ja tilastolliset menetelmät



Samankaltaiset tiedostot
Harjoitus 1 -- Ratkaisut

Hannu Mäkiö. kertolasku * jakolasku / potenssiin korotus ^ Syöte Geogebran vastaus

9. Vektorit. 9.1 Skalaarit ja vektorit. 9.2 Vektorit tasossa

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

Matematiikan kotitehtävä 2, MAA 10 Todennäköisyys ja tilastot

PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2

Ohjelmoinnin perusteet Y Python

Tilastolliset toiminnot

Valitse ruudun yläosassa oleva painike Download Scilab.

Excel syventävät harjoitukset

Ohjelmoinnin perusteet Y Python

Harjoitus 1 -- Ratkaisut

Matematiikan kotitehtävä 2, MAA 10 Todennäköisyys ja tilastot

Johdatus Ohjelmointiin

A-osa. Ratkaise kaikki tämän osan tehtävät. Tehtävät arvostellaan pistein 0-6. Taulukkokirjaa saa käyttää apuna, laskinta ei.

Zeon PDF Driver Trial

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Java-kielen perusteet

Jatkuvat satunnaismuuttujat

Ohjelmoinnin peruskurssi Y1

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

KAAVAT. Sisällysluettelo

Python-ohjelmointi Harjoitus 2

Luvuilla laskeminen. Esim. 1 Laske

plot(f(x), x=-5..5, y= )

Ohjelmoinnin perusteet Y Python

PRELIMINÄÄRIKOE PITKÄ MATEMATIIKKA

ITKP102 Ohjelmointi 1 (6 op)

Juuri 10 Tehtävien ratkaisut Kustannusosakeyhtiö Otava päivitetty

Matriiseista. Emmi Koljonen

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

PERUSLASKUJA. Kirjoita muuten sama, mutta ota KAKSI välilyöntiä (SEURAA ALUEMERKINTÄÄ) 4:n jälkeen 3/4 +5^2

Kirjoita ohjelma jossa luetaan kokonaislukuja taulukkoon (saat itse päättää taulun koon, kunhan koko on vähintään 10)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

Tekijä Pitkä matematiikka

Ohjelmoinnin peruskurssi Y1

Kenguru Student (lukion 2. ja 3. vuosi) sivu 1 / 6

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

MATEMATIIKAN KOE, PITKÄ OPPIMÄÄRÄ HYVÄN VASTAUKSEN PIIRTEITÄ

Java-kielen perusteet

MS-A0501 Todennäköisyyslaskennan ja tilastotieteen peruskurssi

Syksyn 2015 Lyhyen matematiikan YO-kokeen TI-Nspire CAS -ratkaisut

Ohjelmoinnin peruskurssi Y1

3. Muuttujat ja operaatiot 3.1

MS-A0003/A0005 Matriisilaskenta Laskuharjoitus 2 / vko 45

Muuttujien määrittely

811120P Diskreetit rakenteet

Matriisilaskenta Laskuharjoitus 1 - Ratkaisut / vko 37

Algoritmit 2. Luento 13 Ti Timo Männikkö

Helsingin, Itä-Suomen, Jyväskylän, Oulun, Tampereen ja Turun yliopisto Matematiikan valintakoe klo Ratkaisut ja pisteytysohjeet

FUNKTION KUVAAJAN PIIRTÄMINEN

PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2 3

Taulukot. Jukka Harju, Jukka Juslin

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Luento 5. Timo Savola. 28. huhtikuuta 2006

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Differentiaali- ja integraalilaskenta 1. Tietokoneharjoitus: ratkaisut

Harjoitus 10: Mathematica

Matematiikan tukikurssi

4 Yleinen potenssifunktio ja polynomifunktio

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Todennäköisyyslaskenta I, kesä 2017 Helsingin yliopisto/avoin Yliopisto Harjoitus 1, ratkaisuehdotukset

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Yhtälön oikealla puolella on säteen neliö, joten r. = 5 eli r = ± 5. Koska säde on positiivinen, niin r = 5.

MATEMATIIKAN KOE PITKÄ OPPIMÄÄRÄ

2 exp( 2u), kun u > 0 f U (u) = v = 3 + u 3v + uv = u. f V (v) dv = f U (u) du du f V (v) = f U (u) dv = f U (h(v)) h (v) = f U 1 v (1 v) 2

Esimerkki 1: auringonkukan kasvun kuvailu

. Kun p = 1, jono suppenee raja-arvoon 1. Jos p = 2, jono hajaantuu. Jono suppenee siis lineaarisesti. Vastaavasti jonolle r k+1 = r k, suhde on r k+1

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

A Lausekkeen 1,1 3 arvo on 1,13 3,3 1,331 B Tilavuus 0,5 m 3 on sama kuin 50 l 500 l l C Luvuista 2 3, 6 7

Harjoitus 2 (viikko 45)

Ohjelmoinnin perusteet Y Python

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Harjoitus 5 (viikko 41)

LUMA Suomi kehittämisohjelma :53 Joustava yhtälönratkaisu Matemaattinen Ohjelmointi ja Yhtälönratkaisu

Ohjelmoinnin perusteet Y Python

Kaikkiin tehtäviin laskuja, kuvia tai muita perusteluja näkyviin.

Kenguru 2019 Student lukio

Ohjelmoinnin perusteet Y Python

Merkitse kertolasku potenssin avulla ja laske sen arvo.

Geogebra -koulutus. Ohjelmistojen pedagoginen hyödyntäminen

Ohjelmoinnin peruskurssi Y1

Tässä harjoituksessa käydään läpi R-ohjelman käyttöä esimerkkidatan avulla. eli matriisissa on 200 riviä (havainnot) ja 7 saraketta (mittaus-arvot)

Ohjelmoinnin perusteet Y Python

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Transkriptio:

Ohjelmointi ja tilastolliset menetelmät Jarmo Hurri Teknologiateollisuuden 100-vuotissäätiö Vaisala Oyj Helsingin Suomalainen Yhteiskoulu

Ohjelmointi ja tilastolliset menetelmät i Teoksen kirjoittamista on rahoittanut Teknologiateollisuuden 100-vuotissäätiö. Sivun 87 tehtävä on kehitetty yhteistyössä Vaisalan kanssa. Visuaalisen ilmeen suunnittelussa on avustanut Jenni Hurri. Työ on tehty avoimen lähdekoodin ohjelmistoilla. Tämän teoksen tekijä on Jarmo Hurri. Teos on tehty vuosina 2010 2013. Teos on lisensoitu Creative Commons Attribution-ShareAlike 3.0 Unported -lisenssillä. Lisenssin tarkka määrittely löytyy sivulta http://creativecommons.org/licenses/by-sa/3.0/ Alla olevat rivit sisältävät dokumentin lähdetiedoston versionhallintatiedon sekä aikaleiman. $Id: otm.tex,v 1.29 2013/01/16 14:32:25 jarmo Exp $ $Modified: Wed Jan 16 14:29:27 UTC 2013 by jarmo $

Lukijalle Kenelle kurssi on tarkoitettu? Kurssi on tarkoitettu sellaisille lukion pitkän matematiikan opiskelijoille, jotka ovat kiinnostuneita tietokoneohjelmista sekä niiden soveltamisesta lukuaineistojen käsittelyyn. Kurssi voidaan opiskella pakollisten kurssien kuudennen kurssin (todennäköisyys ja tilastot) jälkeen. Tämä kirja sopii sekä itseopiskeluun että opiskeluun opettajan johdolla. Ohjelmointi Ohjelmointitaitoja tarvitaan silloin, kun valmiiden tietokoneohjelmien ominaisuudet eivät riitä. Ohjelmointitaidoille on kysyntää, sillä uusia ongelmia ratkotaan jatkuvasti uusin tavoin. Matematiikan soveltaminen todellisiin ongelmiin sisältää tyypillisesti myös ohjelmointia. Tilastolliset menetelmät Yhteiskunta tuottaa valtavasti digitaalista aineistoa ja hyödyntää sitä yhä enenevässä määrin. Tilastollisissa menetelmissä näitä aineistoja käsitellään ja analysoidaan matematiikan, erityisesti todennäköisyyslaskennan avulla. Koska aineistot ovat suuria, tietokoneiden käyttö on välttämätöntä. Koska ongelmat ja aineistot ovat uusia, joudutaan kirjoittamaan uusia tietokoneohjelmia. Tilastolliset menetelmät ovat useiden alojen kulmakivi. Näihin aloihin kuuluvat mm. bioinformatiikka, tiedon louhinta, koneoppiminen, liiketoimintatiedon hallinta ja data-analyysi. Tilastolliset menetelmät ovat myös tärkeitä kokeellisten tieteiden työkaluja. Kurssin tavoitteet ja keskeiset sisällöt Kurssin tavoitteena on, että opiskelija oppii muodostamaan tietokoneohjelmien lausekkeita käsittelemään lukuaineistoja lausekkeiden avulla ii

Ohjelmointi ja tilastolliset menetelmät iii toteuttamaan monimutkaisempia toimintoja algoritmien ja kontrollirakenteiden avulla ymmärtämään ja soveltamaan keskeisiä tilastollisia menetetelmiä. Kurssin keskeisen sisällön muodostavat lauseke, muuttuja, funktio algoritmi ehdollinen suorittaminen, toistorakenteet ja rekursio pienimmän neliösumman menetelmä hypoteestin testaus luottamusväli. Mikä R on? Ohjelmointikielenä kurssilla käytetään R-kieltä, joka on keskeinen tilastollisten menetelmien ohjelmointikieli. R:n erityinen soveltuvuus tilastollisiin menetelmiin ei ole varsinainen syy sen käyttöön tällä kurssilla, vaan valinta johtuu R:n useista hyödyllisistä ominaisuuksista. R on tulkattu eli interaktiivinen ohjelmointiympäristö, mikä helpottaa ohjelmoinnin aloittamista ja kannustaa kokeilemiseen sekä aineiston monipuoliseen tarkasteluun. Kielen korkea abstraktiotaso vapauttaa aloittavan ohjelmoijan teknisistä yksityiskohdista. Vektorisoiduilla laskutoimituksilla ja valmiilla grafiikkafunktioilla on mahdollista saada paljon aikaiseksi lyhyessä ajassa. Mitä kurssin suorittamiseen tarvitaan? Kurssin suorittamiseen tarvitaan tietokone ja verkkoyhteys. Käytetyt ohjelmistot ovat ilmaisia; asennusohjeet yleisimpiin käyttöjärjestelmiin löytyvät liitteestä D sivulta 146. Tämän kirjan uusin versio on aina ladattavissa kurssin kotisivulta osoitteesta http://www.syk.fi/otm Kirjaa voi lukea näytöltä tai sen voi tulostaa. Koska värillinen tulostaminen on suhteellisen kallista, kirja on suunniteltu mustavalkoiseksi lukuunottamatta PDF-tiedostossa olevia linkkejä, jotka mustavalkotulosteessa näkyvät joko mustina tai harmaina. Jotta kopioimalla saataisiin korkealaatuinen lopputulos, harmaasävykuvien määrä on mahdollisimman pieni (poikkeukset sivuilla 71 sekä 188). Kirja on tarkoitettu tulostettavaksi / kopioitavaksi kaksipuolisena; yksipuolisessa tulosteessa jotkut sivut jäävät tyhjiksi.

iv Lukijalle Ajankäyttöehdotus aihe tuntimäärä lauseke, muuttuja ja funktiokutsu 3 vektori 2 matriisi 1 funktio ja algoritmi 4 toistorakenteet 2 rekursio 2 pienimmän neliösumman menetelmä 4 satunnaismuuttujia R:llä 1 hypoteesin testaus 4 keskeinen raja-arvolause 2 luottamusväli 4 yhteensä 29

Sisältö Lukijalle ii 1 Lauseke, muuttuja ja funktiokutsu 2 2 Vektori 12 3 Matriisi 26 4 Funktio ja algoritmi 34 5 Toistorakenteet 48 6 Rekursio 60 7 Pienimmän neliösumman menetelmä 70 8 Satunnaismuuttujia R:llä 90 9 Hypoteesin testaus 96 10 Keskeinen raja-arvolause 110 11 Luottamusväli 118 Liitteet 129 A P-arvo 130 B Bayesiläinen päättely 134 C Todistuksia 142 D Ohjelmistojen asentaminen 146 E Tehtävien ratkaisut 150 F Kirjan muutoshistoria 199 Yleisesti käytettyjä R-lausekkeita 201 Muutamia hyödyllisiä Emacs-komentoja 202 1

1 Lauseke, muuttuja ja funktiokutsu Valmistelevat toimenpiteet 1. Varmista, että tietokoneeseesi on asennettu R, Emacs sekä ESS (Emacs Speaks Statistics). Mikäli näin ei ole, seuraa asennusohjeita liitteestä D sivulta 146. 2. Mikäli luet kirjaa tietokoneen näytöltä, mutta käytössäsi on tulostin, tulosta hyödyllisten R-lausekkeiden sekä Emacs-komentojen taulukot sivuilta 201 202. 3. Käynnistä Emacs. 4. Käynnistä R Emacsissa seuraavasti. Pidä näppäin Alt pohjassa, paina ja vapauta näppäin x ja vapauta sen jälkeen Alt. Tästä näppäinyhdistelmästä käytetään lyhennysmerkintää M-x. Kursori siirtyy ikkunan alareunassa olevalle riville. Kirjoita riville R ja paina rivinvaihtonäppäintä ê. 5. Emacs kysyy, missä hakemistossa R:ää halutaan ajaa; voit valita oletusarvoisen hakemiston. (Halutessasi voit myös luoda erityisen hakemiston tätä kurssia varten ja ajaa R:ää uudessa hakemistossasi.) Lauseke R suorittaa lausekkeita, aivan kuten laskinkin. Lauseke on jokin laskutoimitus tai toimenpide, joka suoritetaan painamalla rivinvaihtonäppäintä ê. Alla on muutamia esimerkkejä lausekkeista sekä R:n tulostamat vastaukset. > -15 + 3.4 [1] -11.6 > 12 * 64 / 6 [1] 128 > (-2)^3 [1] -8 2

Ohjelmointi ja tilastolliset menetelmät 3 R:n ensimmäiseen lausekkeeseen antama vastaus [1] -11.6 tarkoittaa, että tulos on lukujono, jonka ensimmäinen luku, tässä tapauksessa ainoa luku, on 11,6. Seuraavan esimerkin lauseke palauttaa lukujonon, jossa on 41 lukua. Tällöin hakasuluissa oleva luku rivin vasemmassa reunassa kertoo, missä kohdassa lukujonoa R on tulostuksessa menossa. > -20:20 [1] -20-19 -18-17 -16-15 -14-13 -12-11 -10-9 -8-7 -6-5 -4 [18] -3-2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 [35] 14 15 16 17 18 19 20 Ohjelmiin kirjoitetaan usein tekstiä selventämään, mitä ohjelma tekee. Tällaista tekstiä kutsutaan kommentiksi. R-kielessä kommentti kirjoitetaan #-merkin perään: R jättää #- merkin perässä olevan tekstin huomiotta rivin loppuun saakka. > sqrt (196) # luvun 196 neliöjuuri [1] 14 > 2^2-5 < 0 # lausekkeella voi olla totuusarvo TRUE tai FALSE [1] TRUE > "Ja katso, niin koitti uusi aamu." # arvo voi olla merkkijono (teksti) [1] "Ja katso, niin koitti uusi aamu." > ((9^2-3)+46-441)/3*2 # välilyöntejä ei tarvita väleissä... [1] -211.3333333333 > ((9^2-3) + 46-441) / 3 * 2 #... mutta ne voivat auttaa luettavuutta [1] -211.3333333333 R-ikkunassa näppäinkomento M-p (eli Alt ja p) hakee komentohistoriasta edellisen komennon 1 ; tässä p tulee sanasta previous, edellinen. Jos vahingossa päädytään historiassa liian kauas, niin näppäinkomennolla M-n (eli Alt ja n, sanasta next eli seuraava) saadaan komentohistoriasta seuraava komento. Komentojen täydentäminen Jos R:n komentorivillä painetaan tabulaattorinäppäintä, R pyrkii täydentämään kirjoitettavana olevan merkkijonon parhaan tietonsa mukaan etsimällä funktioita, muuttujia tai tiedostonnimiä, jotka alkavat kirjoitetuilla kirjaimilla. R:ssä ainoa kirjaimilla sq alkava funktio on sqrt. Kirjoita R:n komentoriville kirjaimet 1 Mikäli käytät Mac OS X tai Linux-käyttöjärjestelmää ja olet seurannut liitteen D ohjeita, näppäinyhdistelmä M-p hakee historiasta edellisen komennon, joka alkaa samoilla kirjaimilla kuin mitä komentoriville on jo kirjoitettu. Tämä on näppärä tapa toistaa usein käytettyjä komentoja kirjoittamalla niistä vain muutama ensimmäinen kirjain. Näppäinyhdistelmän M-n vaikutus muuttuu vastaavalla tavalla.

4 Luku 1. Lauseke, muuttuja ja funktiokutsu sq ja paina tabulaattoria. Tällöin R täydentää funktion nimen. Kirjaimilla name alkavia funktioita on R:ssä useampia. Jos kirjoitat R-ikkunaan name ja painat tabulaattoria, niin R täydentää komennon muotoon names ja ilmoittaa Partially completed, eli Osittain täydennetty. Kaikki name-alkuiset funktiot alkavat names, ja lisäksi on olemassa funktio nimeltä names. Kun nyt painat tabulaattoria toisen kerran, R jakaa ikkunan kahteen osaan ja näyttää alemmassa osassa kaikki mahdolliset kirjaimilla names alkavat funktiot. Suljetaan seuraavaksi ikkunan alempi osa. Kun kursori on R-osassa, alemman osan voi sulkea valikosta FileÑRemove Other Windows (tai vanhemmissa Emacs-versioissa Remove Splits) tai näppäinkomennolla C-x 1, missä C-x tarkoittaa, että pidetään Ctrl-näppäin pohjassa, painetaan ja vapautetaan näppäin x ja vapautetaan Ctrl. Muuttuja Muuttuja on nimetty muistipaikka, johon voidaan tallentaa tietoa sijoittamalla muuttujaan jonkin arvo ja jota voidaan käyttää myöhemmin ohjelmassa. R ei oletusarvoisesti tulosta sijoituksen tulosta; tilastoja pyöritellessä muuttujiin sijoitetaan usein tuhansien lukujen pituisia lukujonoja, joiden vilinää ei ole mukava katsella tietokoneen näytöllä. Muuttujaan sijoittaminen tehdään R-kielessä operaattorilla <- tai operaattorilla -> seuraavaan tapaan: 2 > x <- 3 # sijoitetaan muuttujaan x luku 3 > x # sijoittamisella ei ole arvoa, mutta arvo voidaan tarkistaa näin [1] 3 > y <- -5; y # puolipisteen avulla saa monta lauseketta riville [1] -5 > (y <- -5) # sama kuin edellinen rivi: sijoitus suluissa tulostaa arvon [1] -5 > -5 -> y; y # sama kuin edellinen sijoitus [1] -5 > (katu <- "Isonnevantie") # muuttujiin voi tallentaa merkkijonoja 2 R:ssä voidaan useissa tapauksissa sijoittaa muuttujaan arvo myös operaattorilla =, mutta tästä voi seurata hankaluuksia, koska operaattorilla = määritetään myös funktioiden parametrien arvoja, kuten myöhemmin nähdään.

Ohjelmointi ja tilastolliset menetelmät 5 [1] "Isonnevantie" > ((x - y) / (x + y) -> z) # lasketaan uuden muuttujan arvo [1] -4 R:ssä käytetään usein pistettä erottamaan muuttujan nimien ja funktion nimien osia. > x <- -3 > (x^2 -> x.nelio) # muuttujan nimessä voi olla piste erottamassa sanoja [1] 9 > (x > 0 -> x.on.positiivinen) # muuttujiin voi tallentaa totuusarvoja [1] FALSE > (x.1 <- 4); x.1^3 # nimessä voi olla numeroita; se alkaa kirjaimella [1] 4 [1] 64 Varoituksen sana on tässä paikallaan: useissa ohjelmointikielissä piste on varattu erityiseen käyttöön, joten niissä muuttujan nimen osat erotetaan toisistaan eri tavoin. Esimerkkejä vaihtoehtoisista tavoista erottaa osat toisistaan ovat isot kirjaimet (xnelio) ja alaviiva (x_nelio). Tiedot muuttujiin Ohjelmoinnissa informaatiota ei kopioida useisiin paikkoihin. Jos samaa arvoa käytetään useammassa kohdassa, niin arvo sijoitetaan aina muuttujaan. Tämä helpottaa ohjelman kirjoittamista, parantaa ohjelman ymmärrettävyyttä sekä helpottaa muutosten tekemistä. Joissain tapauksissa luku sijoitetaan muuttujaan, vaikka lukua käytettäisiin vain kerrankin, koska näin voidaan välttää mystisten lukujen esiintymistä ohjelmassa. Alla on kaksi eri versiota samasta laskutoimituksesta, ja jälkimmäinen saattaa näyttää ymmärrettävämmältä, kun ohjelman kirjoittamisesta on kulunut muutama vuosi. > (hinta <- 126.08 * 1.23 * 1.04) [1] 161.281536 > > veroton.hinta <- 126.08; alv.kerroin <- 1.23; tulli.kerroin <- 1.04 > (hinta <- veroton.hinta * alv.kerroin * tulli.kerroin) [1] 161.281536

6 Luku 1. Lauseke, muuttuja ja funktiokutsu Funktiokutsu R-kielessä on paljon valmiita funktioita usein toistuvia laskutoimituksia ja toimintoja varten. Edellä näimme jo funktion sqrt (x), joka laskee luvun x neliöjuuren. Seuraavassa on muutamia esimerkkejä R:n funktioista. 3 > max (2, 3) # suurempi luvuista 2 ja 3 [1] 3 > min (5, # lauseketta voi jatkaa usealle riville, + -7) # jolloin R kertoo plus-merkillä, että lauseke on kesken [1] -7 > runif (1) # yksi satunnaisluku väliltä [0,1] (Random UNIForm) [1] 0.7853239763062 > runif (1) # toinen samanlainen [1] 0.1371821514331 > choose (5, 2) # valitaan viidestä kaksi, siis 5 yli 2 [1] 10 Seuraava funktiokutsu näyttää kuvaajan tietokoneen ruudulla: > curve (x^(2/3), 0, 1) # funktion f(x) = x^(2/3) kuvaaja välillä [0,1] x^(2/3) 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 x Katsotaanpa, mitä funktiosta curve () sanotaan R:n aputiedostossa aputiedosto saadaan näkyviin komennolla >?curve # aputiedoston saa myös komennolla help (curve) 3 Välilyönnit funktiokutsussa ovat makuasia: max(2,3) ajaa saman asian kuin max (2, 3).

Ohjelmointi ja tilastolliset menetelmät 7 Komento jakaa ikkunan kahteen osaan, ja aputeksti tulee alempaan osaan. Kursoria voi siirtää osien välillä hiirellä. Keskitytään tulkitsemaan funktion kutsun kuvauksen curve(expr, from = NULL, to = NULL, n = 101, add = FALSE, type = "l", xname = "x", xlab = xname, ylab = NULL, log = NULL, xlim = NULL,...) ensimmäistä riviä muun aputekstin avulla: expr: The name of a function, or a call or an expression written as a function of x which will evaluate to an object of the same length as x. from, to: the range over which the function will be plotted. n: integer; the number of x values at which to evaluate. Sulkujen sisällä olevat, pilkuilla erotetut expr, from = NULL jne. ovat funktion curve () parametrien kuvauksia. Parametri on muuttuja, jota käytetään välittämään tietoja funktiolle. Funktion curve () aputiedostossa sanotaan, että ensimmäinen parametri expr on joko funktion nimi tai muuttujan x lauseke (englanniksi expression), jota vastaavan funktion kuvaaja piirretään. Parametrit from ja to määrittävät sen välin, jolla kuvaaja piirretään. Funktiokutsussa curve (x^(2/3), 0, 1) parametreille asetetaan tietyt arvot: esimerkiksi parametrin expr arvoksi asetetaan lauseke x^(2/3). Näitä funktiokutsussa parametreille annettuja arvoja kutsutaan argumenteiksi; yllä funktion curve () argumentit ovat siis lauseke x^(2/3) sekä luvut 0 ja 1. Koska käsitteiden parametri ja argumentti ero on vähäinen, käytännössä sekä puheessa että kirjoitetussa tekstissä molemmat viittaavat sekä funktiokutsun muuttujien nimiin että näiden muuttujien arvoihin. Funktion curve () parametri n määrää sen, kuinka monessa pisteessä lausekkeen arvo lasketaan piirrettäessä. Parametrin kuvaus n = 101 tarkoittaa sitä, että parametrin oletusarvo on 101; jos toisin ei määritetä, piirrettäessä arvo lasketaan 101:ssä välin pisteessä. Parametrikuvauksessa from = NULL oletusarvo NULL tarkoittaa, että parametrin oletusarvo on tyhjä, määrittämätön, ja sen arvo päätellään tilanteen mukaan (kuvattu tarkemmin aputekstissä). Oletusarvoisesti parametrit ja argumentit yhdistetään toisiinsa järjestyksen perusteella: ensimmäinen argumentti on ensimmäisen parametrin arvo jne. R tukee myös nimettyjä argumentteja; edellinen funktiokutsu olisi voitu tehdä myös vaikkapa näin:

8 Luku 1. Lauseke, muuttuja ja funktiokutsu curve (to = 1, from = 0, expr = x^(2/3)) tai näin curve (x^(2/3), to = 1, from = 0) Funktio Ohjelmoinnissa funktiolla tarkoitetaan ohjelman osaa, joka tekee tietyn toiminnon. Matematiikassa, jos vaikkapa fpxq? x ` 4, niin fp2q on funktion f arvo, joka lasketaan muuttujan arvon x 2 perusteella. Ohjelmoinnissa funktio on monimutkaisempi olio kuin matematiikassa, koska ohjelmoinnissa funktiolla voi olla lasketun arvon lisäksi sivuvaikutuksia. Esimerkiksi R:n funktiokutsussa q () funktio q () ei laske eikä palauta mitään arvoa, mutta sivuvaikutuksenaan se lopettaa R:n suorituksen. Kun tällä kurssilla käsitellään funktioita, niihin viitataan välillä ilman parametrien listaamista tapaan sqrt () ja välillä parametrien kanssa tapaan sqrt (x) riippuen siitä, miten olennaisessa roolissa parametrit kulloinkin ovat. Ohjelmakoodin uudelleenkäyttö Samaa ohjelmakoodia ei kirjoiteta useaan kertaan: yksi tietotekniikan käytön päämääristä on manuaalisen työn vähentäminen. Tästä syystä useampaan kertaan tehtävät komentosarjat kirjoitetaan tiedostoon, josta ne voidaan tarvittaessa toistaa. Myös kertaalleen suoritettavat komentosarjat kannattaa usein kirjoittaa tiedostoon, jos komentosarjat ovat monimutkaisia: usein komentosarjoihin jää virheitä, joita karsittaessa joudutaan käytännössä ajamaan samat komennot useaan kertaan. Ohjelmakoodin kirjoittamisesta tiedostoon on myös se etu, että tällöin jää talteen jälki oikeasta ratkaisusta. Kun R:ssä ratkotaan pieniä ongelmia ohjelmilla, joiden pituus on 1 2 riviä, voidaan komentohistoriaa käyttää väliaikaisena tallennuspaikkana tiedoston sijasta oikeaa ratkaisua etsittäessä. Ohjelmakoodin suorittaminen tiedostosta Harjoitellaan ohjelmakoodin suorittamista tiedostosta. Lasketaan lausekkeiden 3x 3 5x ja x 2? 5 3 x arvoja eri x:n arvoilla. 1. Avaa Emacsissa uusi ikkuna valikosta FileÑNew Frame. 4 4 Uusi ikkuna aukeaa myös näppäinkomennolla C-x 5 2.

Ohjelmointi ja tilastolliset menetelmät 9 2. Avaa uuteen ikkunaan uusi tiedosto lausekkeiden.arvot.r valitsemalla valikosta FileÑVisit New File. 5 3. Lasketaan ensin lausekkeiden arvot, kun x 1. Kirjoita tiedostoon seuraavat lausekkeet: 1 -> x 3 * x^3-5 * x x^(-2 / 5) - 3 * sqrt (x) 4. Tiedoston kaikki lausekkeet voidaan suorittaa eli evaluoida toisessa ikkunassa olevassa R:ssä valitsemalla valikosta ESSÑESS EvalÑEval buffer tai lyhyemmin näppäinkomennolla C-c C-b. Tätä toimintoa tarvitaan niin usein, että kannattaa opetella käyttämään näppäinkomentoa. 5. Jos lausekkeiden arvot halutaan laskea toisella muuttujan x arvolla, riittää että muutetaan tiedoston ensimmäistä riviä ja evaluoidaan lausekkeet uudelleen. 6. Tiedosto voidaan tallentaa valikosta FileÑSave; lyhyemmin C-x C-s. 6 7. Mikäli halutaan suorittaa vain osa tiedostossa olevasta ohjelmakoodista, maalataan hiirellä alue ja valitaan sen jälkeen valikosta ESSÑESS EvalÑEval region. (Lyhyemmin C-c C-r.) Myöhemmin opimme laskemaan lausekkeiden arvoja eri muuttujien arvoilla helpommin itse määriteltyjen funktioiden avulla. 5 Vastaava näppäinkomento on C-x C-f. 6 Kun lausekkeet on tallennettu tiedostoon lausekkeiden.arvot.r, ne voidaan suorittaa myös R:n komentoriviltä funktion source () avulla seuraavaan tapaan (alla sekä funktiokutsu että kutsun tulos): > source ("lausekkeiden.arvot.r", echo = TRUE) > x <- 1 > 3 * x^3-5 * x [1] -2 > x^(-2/5) - 3 * sqrt(x) [1] -2 Funktiokutsussa argumentti echo = TRUE (echo: kaikua, kauiuttaa) näyttää suoritettavat lausekkeet sekä niiden tulokset.

10 Luku 1. Lauseke, muuttuja ja funktiokutsu Tehtävät 1. Laske R:llä seuraavien lausekkeiden arvot: a) b `?b 2 4ac, kun a 12, b 52 ja c 35 2a b) 187388721 4? 187388721 2? 187388721 ˆ5 ˆ5 3 ` 4 2 c) ˆ8 5 d) x 2 4x ` 5 ă 6x? x, kun x 3 4. 2. Funktiokutsu plot (x, y) piirtää grafiikkaikkunaan pienen ympyrän kohtaan px, yq. Piirrä grafiikkaikkunaan piste p0,25; 0,5q ja lisää kuvaan funktion fpxq? x kuvaaja. Funktion curve () argumentti add = TRUE aiheuttaa sen, että kuvaaja lisätään koordinaatistoon, eli jo piirretty piste säilytetään. Grafiikkaikkuna voidaan sulkea komennolla graphics.off (). 3. Lauseke ls () (sanasta list) näyttää R:n muistissa olevat muuttujat, ja muuttujia voi poistaa funktion rm () avulla (sanasta remove). Funktiolle rm () annetaan poistettavan muuttujan nimi merkkijonona lainausmerkkien sisällä (tyyliin "x"). Listaa muistissa olevat muuttujat. Tallenna jokin luku uuteen muuttujaan c, ja poista sen jälkeen tämä uusi muuttuja funktion rm () avulla. (R:ssä on hieman riskaabelia käyttää muuttujaa nimeltä c, koska yksi R:n keskeisistä funktioista on c ().) 4. Umpinaisen ympyrälieriön pohjan säde on r ja korkeus h. Laske R:llä lieriön kokonaispinta-ala neliömetreinä, kun a) r 19 m ja h 28 m b) r 2,57 m ja h 116 cm. Käytä laskutoimituksissa apuna R:n vakiota pi sekä funktiota signif (x, digits) joka palauttaa luvun x tarkkuudella, jossa on digits merkitsevää numeroa (significant digit: merkitsevä numero). 5. Laatikossa on 15 mustaa, 8 valkoista ja m punaista palloa. Laatikosta nostetaan satunnaiset 5 palloa. Olkoon satunnaismuuttuja X nostettujen valkoisten pallojen lukumäärä. a) Muodosta lauseke todennäköisyydelle P px xq, kun x on jokin kokonaisluku välillä 0,..., 5.

Ohjelmointi ja tilastolliset menetelmät 11 b) Laske R:n avulla todennäköisyys P px 2q, kun m 10, sekä todennäköisyys P px 4q, kun m 4. 6. Funktiokutsu prosessoriaika (lauseke) palauttaa lausekkeen lauseke evaluoinnin viemän prosessorin laskenta-ajan sekunteina. Kokeile funktiota suorittamalla R:ssä seuraava lauseke: prosessoriaika (hist (rnorm (10^6))) Selvitä kokeilemalla ja aputiedostojen avulla, minkä toiminnon viemää aikaa edellä mitattiin, toisin sanoen, mitä tekee lauseke hist (rnorm (10^6)). Kokeiluja varten on hyvä tietää, että R:n suorittaman komennon voi keskeyttää valikosta SignalsÑBREAK tai näppäinkomennolla C-c C-c. 7. Käyrä y fpxq 7x 2 28k 2 x ` 28kx 26x ` 24k 2 24k ` 18, missä k on vakio, leikkaa suoran y x kahdessa pisteessä, joiden molempien x-koordinaatti on positiivinen. Olkoot nämä pisteet P px P, y P q sekä Q px Q, y Q q. Laske pisteiden P, Q, px Q, 0q sekä px P, 0q muodostaman nelikulmion pinta-alan likiarvo kahden desimaalin tarkkuudella vakion k arvoilla k 1, k 2 sekä k 3. Luvun voi pyöristää haluttuun tarkkuuteen funktion round () avulla.

2 Vektori Vektori lukujonona Suuria aineistomääriä varten tarvitaan muuttujia, joihin voidaan tallentaa useita toisiinsa liittyviä lukuja, merkkijonoja tms. Yksi tällainen muuttujatyyppi on vektori. R:n vektori on sukua matematiikasta tutulle vektorille, koska R:n vektorissa olevat luvut voivat myös edustaa vektorin aı ` bj kertoimia a ja b. Yksinkertaisimmillaan R:n vektori on lukujono. Funktio c () (englannin kielen sanasta combine) yhdistää elementtejä vektoriksi. > (a <- c (4, 2, 7, -1.5)) # vektori, jossa luvut 4; 2; 7; -1,5 [1] 4.0 2.0 7.0-1.5 > a [3] # vektorin a kolmas elementti [1] 7 > length (a) # vektorin pituus eli elementtien lukumäärä [1] 4 > rev (a) # vektorin elementit käänteisessä järjestyksessä (reverse) [1] -1.5 7.0 2.0 4.0 > sum (a) # elementtien summa [1] 11.5 > mean (a) # elementtien keskiarvo [1] 2.875 > a; a > 0 # looginen vektori: TRUE jos a:n elementti positiivinen [1] 4.0 2.0 7.0-1.5 [1] TRUE TRUE TRUE FALSE > b <- a^2; a; b # vektori, jonka elementit a:n elementtien neliöitä [1] 4.0 2.0 7.0-1.5 [1] 16.00 4.00 49.00 2.25 > plot (a, b) # (a, b)-parit pisteinä koordinaatistossa > curve (x^2, from = min (a), to = max (a), add = TRUE) # perusparaabeli Perusparaabelin päätepisteet ovat vektorin a pienin ja suurin arvo. Saatu kuva näyttää seuraavalta. 12

Ohjelmointi ja tilastolliset menetelmät 13 b 10 20 30 40 50 0 2 4 6 a Yleisesti R-kielessä vektori sisältää joukon elementtejä kuten lukuja, totuusarvoja tai merkkijonoja jonossa siten, että elementteihin voidaan viitata niiden järjestysluvulla jonossa. Kaikki vektorin elementit ovat aina samaa tyyppiä, siis esimerkiksi kaikki lukuja tai kaikki merkkijonoja. R yhdistää erityyppiset elementit samaan vektoriin siten, että ne muutetaan kaikki samaan, yleisimpään tyyppiin: totuusarvot tarvittaessa numeroiksi (TRUE ja FALSE arvoiksi 1 ja 0) tai merkkijonoiksi ("TRUE" tai "FALSE") ja luvut tarvittaessa merkkijonoiksi. Seuraavista esimerkeistä huomataan myös, että funktiolla c () voi liittää elementtejä vektoriin tai yhdistää kaksi vektoria toisiinsa. > c ("abc", "xy", "d") -> s; s [1] "abc" "xy" "d" > (x <- c (TRUE, FALSE)) [1] TRUE FALSE > c (x, sqrt (121)) # totuusarvot muutetaan luvuiksi [1] 1 0 11 > c (s, 456, x) # luvut ja totuusarvot muutetaan merkkijonoiksi [1] "abc" "xy" "d" "456" "TRUE" "FALSE" R-kielessä yhtäsuuruus tarkistetaan operaattorilla == ja erisuuruus operaattorilla!=. > (x <- c (-2, -1, 0, 1, 2)) [1] -2-1 0 1 2 > abs (x) # elementtien itseisarvot (absolute value) [1] 2 1 0 1 2 > abs (x) == 2 [1] TRUE FALSE FALSE FALSE TRUE

14 Luku 2. Vektori > abs (x)!= 1 [1] TRUE FALSE TRUE FALSE TRUE Monimutkaisempia ehtoja voidaan rakentaa operaattoreilla (tai) sekä & (ja). Huutomerkillä! merkitään käänteistä ehtoa eli negaatiota; siis!b luetaan ei b. Sulkuja voidaan käyttää selventämään ehtojen eri osien välisiä suhteita. > x <- c (-1.2, 4, 1, 17, -8) > x; x >= 0 & x <= 5 # välillä [0, 5] [1] -1.2 4.0 1.0 17.0-8.0 [1] FALSE TRUE TRUE FALSE FALSE > x; x <= -2 x > 4 # x <= -2 tai x > 4 [1] -1.2 4.0 1.0 17.0-8.0 [1] FALSE FALSE FALSE TRUE TRUE > x;!(x > 4) # x ei ole suurempi kuin neljä, eli x <= 4 [1] -1.2 4.0 1.0 17.0-8.0 [1] TRUE TRUE TRUE FALSE TRUE Vektorien laskutoimitukset R-kielessä vektorien väliset laskutoimitukset tehdään elementeittäin, kuten seuraavat esimerkit osoittavat: > (x <- c (-9, 2, 4)) [1] -9 2 4 > (y <- c (2, 1, 0)) [1] 2 1 0 > x; y; x + y # yhteenlasku [1] -9 2 4 [1] 2 1 0 [1] -7 3 4 > x; y; x - y # vähennyslasku [1] -9 2 4 [1] 2 1 0 [1] -11 1 4 > x; y; x * y # kertolasku [1] -9 2 4 [1] 2 1 0 [1] -18 2 0 > y; x; y / x # jakolasku [1] 2 1 0 [1] -9 2 4

Ohjelmointi ja tilastolliset menetelmät 15 [1] -0.2222222222222 0.5000000000000 0.0000000000000 > x; y; x / y # nollalla jakaminen antaa tässä koneessa "äärettömän" Inf [1] -9 2 4 [1] 2 1 0 [1] -4.5 2.0 Inf > y / y # nollan jakaminen nollalla ei anna lukua; NaN, Not a Number [1] 1 1 NaN Kaksi viimeistä riviä havainnollistavat nollalla jakamista. Matemaattisesti kumpaakaan luvuista 4 0 ja 0 ei ole määritelty, joten tulos ei ole luku, mitä esittää R-kielessä symboli 0 NaN (not a number). Jakolaskun 4 tulos voi kuitenkin tietyistä tietokonestandardeista 0 johtuen olla myös Inf eli ääretön (infinite). Vektorin ja skalaarin eli luvun väliset laskutoimituksetkin tehdään elementeittäin. > s <- 2; v <- c (4, 6, 8) > s + v [1] 6 8 10 > v - s [1] 2 4 6 > s * v [1] 8 12 16 > v / s [1] 2 3 4 > s / v [1] 0.5000000000000 0.3333333333333 0.2500000000000 Viimeinen esimerkki saattaa olla hiukan hämmentävä, mutta selittyy seuraavalla. R- kielessä yksittäinen lukukin on vektori, jossa on yksi elementti. Kahden erimittaisen vektorin välisessä laskutoimituksessa lyhyempää vektoria kopioidaan pidemmän vektorin pituiseksi. Siis > 2 / c (4, 6, 8) # tämä on sama kuin... [1] 0.5000000000000 0.3333333333333 0.2500000000000 > c (2, 2, 2) / c (4, 6, 8) #... tämä [1] 0.5000000000000 0.3333333333333 0.2500000000000 Kopiointiominaisuutta käyttäen seuraavakin on mahdollista. > c (1, 2, 4, 8) * c (1, -1) [1] 1-2 4-8 > c (3, 5, 7) * c (1, -1) # varoitus: pidempi ei lyhyemmän monikerta

16 Luku 2. Vektori [1] 3-5 7 Warning message: In c(3, 5, 7) * c(1, -1) : longer object length is not a multiple of shorter object length Vektorin indeksointi Vektorin indeksoinnilla tarkoitetaan viittaamista vektorin tiettyihin elementteihin. R:ssä vektoreja voidaan indeksoida monin eri tavoin. Indeksoinnissa käytetään hakasulkuja [] vektorin perässä. Yksinkertaisin indeksointitapa on viittaaminen elementtiin sen järjestysluvulla. Negatiivinen järjestysluku tarkoittaa, että valitaan kaikki muut elementit. > (x <- c (-3, 7, 11)) [1] -3 7 11 > x [2] [1] 7 > x [-2] [1] -3 11 Indeksoimalla voidaan muuttaa vektorin elementtejä. > (x <- c (-3, 7, 11)) [1] -3 7 11 > x; x [3] <- 22; x # voidaan vaihtaa yksi elementti... [1] -3 7 11 [1] -3 7 22 > x; c (-1, 0) -> x [-2]; x #... tai useampia [1] -3 7 22 [1] -1 7 0 Indeksoinnissa voidaan käyttää myös vektoria, joka sisältää valittujen elementtien järjestysnumerot. Jos järjestysnumerot ovat negatiivisia, valitaan jälleen kaikki muut elementit. > osallistujat <- c ("Jarmo", "Juhani", "Nina", "Ville") > osallistujat [c (2, 4)] [1] "Juhani" "Ville" > osallistujat [c (-1, -4)] [1] "Juhani" "Nina"

Ohjelmointi ja tilastolliset menetelmät 17 Loogisella vektorilla indeksoitaessa valitaan ne elementit, joita vastaavassa kohdassa on indeksointivektorissa arvo TRUE. Jos indeksointivektori on lyhyempi kuin se vektori, josta elementtejä valitaan, niin indeksointivektoria kopioidaan. > (x <- c (0, -2.1, 12, -99, (-3)^3, mean (c (2, 3.3, 10)))) [1] 0.0-2.1 12.0-99.0-27.0 5.1 > x [c (TRUE, TRUE, FALSE, FALSE, TRUE, FALSE)] [1] 0.0-2.1-27.0 > (negatiivinen <- x < 0) # TRUE jos vastaava elementti on negatiivinen [1] FALSE TRUE FALSE TRUE TRUE FALSE > x [negatiivinen] # vektorin x negatiiviset elementit [1] -2.1-99.0-27.0 > x [x < 0] # sama kuin edellä [1] -2.1-99.0-27.0 > max (x [x < 0]) # x:n suurin negatiivinen elementti [1] -2.1 > x [c (FALSE, TRUE)] # valitaan järjestysluvultaan parilliset [1] -2.1-99.0 5.1 R:ssä voidaan käyttää myös nimettyjä vektorielementtejä. Vektorin elementille voidaan antaa nimi, ja elementtiin voidaan sen jälkeen viitata annetulla nimellä (järjestysnumeron ja loogisen vektorin lisäksi). Elementtien nimet asetetaan funktiolla names (). > (kahvikupilliset <- c (0, 773, 2456, 1962)) [1] 0 773 2456 1962 > (kahvin.juojat <- c ("Jarmo", "Juhani", "Nina", "Ville")) [1] "Jarmo" "Juhani" "Nina" "Ville" > names (kahvikupilliset) <- kahvin.juojat > kahvikupilliset Jarmo Juhani Nina Ville 0 773 2456 1962 > kahvikupilliset ["Nina"] Nina 2456 > kahvikupilliset ["Nina"] <- 2156; kahvikupilliset # korjaus tietoihin Jarmo Juhani Nina Ville 0 773 2156 1962 > kahvikupilliset [c ("Juhani", "Jarmo")] Juhani Jarmo 773 0 > kahvikupilliset [kahvikupilliset > 1000] Nina Ville 2156 1962

18 Luku 2. Vektori > barplot (kahvikupilliset, + main = "kahvin lipitys", + ylab = "kuppia", + col = "white") kahvin lipitys kuppia 0 500 1000 1500 2000 Jarmo Juhani Nina Ville Argumentilla col="white" piirretään valkoiset pylväät; muitakin värejä voi kokeilla. Jostain syystä pylväsdiagrammin y-akseli piirretään oletusarvoisesti ainakin omaan makuuni liian lyhyenä. Muita tärkeitä vektorifunktioita Tasavälisiä lukuvektoreita voi luoda funktiolla seq (). > seq (1, 9) # luvut 1, 2,..., 9 [1] 1 2 3 4 5 6 7 8 9 > 1:9 # lyhennysmerkintä edelliselle [1] 1 2 3 4 5 6 7 8 9 > seq (-3, 5, by = 2) # luvut -3:sta 5:een kahden välein [1] -3-1 1 3 5 > seq (1, 9, length.out = 4) # neljä lukua tasavälein välillä [1, 9] [1] 1.000000000000 3.666666666667 6.333333333333 9.000000000000

Ohjelmointi ja tilastolliset menetelmät 19 Vektorin elementeistä voi laskea tunnuslukuja, ja elementtejä voi järjestellä. > (x <- c (-2, seq (-5, 4, 3), seq (14.08, 14.04, by = -0.01))) [1] -2.00-5.00-2.00 1.00 4.00 14.08 14.07 14.06 14.05 14.04 > (negat <- x < 0) # mitkä elementit negatiivisia [1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE > sum (negat) # negatiivisten lukumäärä (huom. loogisen vektorin "summa") [1] 3 > round (x, 1) # luvut pyöristettyinä yhden desimaalin tarkkuudella [1] -2.0-5.0-2.0 1.0 4.0 14.1 14.1 14.1 14.1 14.0 > min (x) # pienin luku [1] -5 > max (x) # suurin luku [1] 14.08 > mean (x) # keskiarvo [1] 6.63 > median (x) # mediaani [1] 9.02 > sort (x) # luvut kasvavaan järjestykseen [1] -5.00-2.00-2.00 1.00 4.00 14.04 14.05 14.06 14.07 14.08 > sort (x, decreasing = TRUE) # luvut vähenevään järjestykseen [1] 14.08 14.07 14.06 14.05 14.04 4.00 1.00-2.00-2.00-5.00 > head (x, 3) # 3 ensimmäistä; head: pää [1] -2-5 -2 > tail (x) # 6 viimeistä; tail: häntä [1] 4.00 14.08 14.07 14.06 14.05 14.04 > head (sort (x, decreasing = TRUE), 2) # 2 suurinta [1] 14.08 14.07 Erilaisia aikasarja-aineistoja pyöriteltäessä on tärkeää pystyä laskemaan muutoksia esimerkiksi vuodesta toiseen. Tässä auttaa funktio diff (). > x <- round (runif (10, min = 0, max = 10)) # satunnaista aineistoa... > names (x) <- 2001 : 2010 #... eri vuosilta > x; diff (x) # muutos edellisestä vuodesta 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 8 6 7 1 6 2 1 2 5 2 2002 2003 2004 2005 2006 2007 2008 2009 2010-2 1-6 5-4 -1 1 3-3 Vektorin elementeistä voidaan ottaa satunnaisia otoksia tai permutaatioita funktiolla sample (). Tällöin kullakin elementillä on yhtä suuri todennäköisyys tulla valituksi.

20 Luku 2. Vektori > osallistujat <- c ("Jarmo", "Ville", "Nina", "Juhani") > sample (osallistujat, 3) # kolme satunnaisesti valittua [1] "Juhani" "Jarmo" "Nina" > sample (osallistujat) # satunnainen permutaatio (jono) [1] "Nina" "Juhani" "Jarmo" "Ville" Kun jostain joukosta poimitaan näytteitä, näytteenotto voidaan tehdä kahdella tavalla. Valittu jäsen laitetaan takaisin joukkoon ennen seuraavan näytteen ottamista, jolloin sama jäsen voi tulla valituksi useaan otteeseen. Tästä käytetään nimitystä poiminta takaisinpanolla (sampling with replacement). Valittu jäsen poistetaan joukosta, jolloin yksi jäsen voi tulla valituksi korkeintaan kerran. Tästä käytetään nimitystä poiminta ilman takaisinpanoa (sampling without replacement). Funktiossa sample () oletusarvo on replace = FALSE eli poiminta ilman takaisinpanoa. > sample (c ("kruuna", "klaava"), 15, replace = TRUE) # kolikonheitto [1] "kruuna" "klaava" "klaava" "klaava" "kruuna" "kruuna" "klaava" [8] "kruuna" "klaava" "kruuna" "kruuna" "kruuna" "klaava" "klaava" [15] "klaava" > (x <- 1:5) [1] 1 2 3 4 5 > sample (x, 10, replace = TRUE) [1] 5 4 3 4 3 5 4 4 5 3 > sample (x, 10) # 10 eri elementtiä viidestä: ei onnistu Error in sample(x, 10) : cannot take a sample larger than the population when replace = FALSE Vektorit ja R:n valmiit funktiot R:ssä erittäin monien funktioiden argumenttina voi olla vektori. Tämä tekee suurilla aineistomäärillä laskemisesta helppoa: ohjelmakoodi ei usein riipu lainkaan siitä, kuinka paljon aineistoa on. Esimerkiksi funktio dbinom () laskee toistokokeisiin liittyviä todennäköisyyksiä. Todennäköisyys saada kymmenellä nopanheitolla tasan kolme kuutosta voidaan laskea funktiolla seuraavasti: > dbinom (3, 10, 1 / 6) [1] 0.1550453595743

Ohjelmointi ja tilastolliset menetelmät 21 Tutustumme funktioon tarkemmin luvussa 8 sivulla 90. Seuraavassa esimerkissä piirretään pylväsdiagrammi 10 nopanheiton kuutosten jakaumasta. > n <- 10 # heittojen lukumäärä > lukumaarat <- 0 : n # mahdolliset kuutosten lukumäärät: 0, 1,..., n > barplot (dbinom (lukumaarat, n, 1 / 6), + names.arg = lukumaarat, + ylab = "todennäköisyys", + xlab = "kuutosten lukumäärä", + col = "white") todennäköisyys 0.00 0.05 0.10 0.15 0.20 0.25 0.30 0 1 2 3 4 5 6 7 8 9 10 kuutosten lukumäärä

22 Luku 2. Vektori Tehtävät 8. Luo R:llä vektori, jonka a) elementit ovat kokonaisluvut 4, 3,..., 14, 15 b) elementit ovat kokonaisluvut 99, 102, 105,..., 150 c) elementit ovat desimaaliluvut 1; 0,98; 0,96;... ; 0,52 d) 45 elementtiä ovat tasavälein välillä r 8,36; 6,38s siten, että välin vasemmanpuoleinen päätepiste on 1. elementti ja oikeanpuoleinen päätepiste viimeinen elementti. 9. Luo R:llä vektori x, jonka elementit ovat kokonaisluvut 10, 6, 2,..., 38. Muodosta vektorin x avulla seuraavat vektorit; mikäli tehtävässä ei toisin mainita, muodostetun vektorin elementtien tulee olla samassa järjestyksessä kuin vastaavat vektorin x elementit. a) Vektori, joka sisältää vektorin x elementtien vastalukujen kuutiot. b) Vektori, joka sisältää vektorin x elementtien käänteisluvut. c) Vektori, jonka elementti on TRUE, jos vektorin x vastaava elementti on itseisarvoltaan korkeintaan 6, ja jonka vastaava elementti on muuten FALSE. d) Vektori, joka sisältää sellaiset vektorin x elementit, joiden itseisarvo on suurempi kuin 8. e) Vektori, joka sisältää kaikki muut vektorin x elementit paitsi 4. ja 7. elementin. f) Vektori, joka sisältää sellaiset vektorin x elementit, joiden arvo on välillä r 5, 10s. g) Vektori, joka sisältää sellaiset vektorin x elementit, jotka ovat pienempiä tai yhtä suuria kuin 2 tai suurempia kuin 6. h) Vektori, joka sisältää joka toisen vektorin x elementin toisesta elementistä alkaen. i) Vektori, jonka 1. elementti on vektorin x viides elementti ja loput elementit vektorin x neljä viimeistä elementtiä käänteisessä järjestyksessä. j) Olkoon x vektorin x elementtien keskiarvo. Muodosta vektori, jonka elementit ovat suuruusjärjestyksessä suurimmasta pienimpään neljä pienintä vektorin x elementtien etäisyyttä luvusta x. 10. Matematiikan vektorit, kuten 2ı j`k, voidaan esittää R:n vektoreina siten, että R:n vektorin elementit ovat matematiikan vektorin kertoimet. Siis esimerkiksi 2ı j ` k olisi R:ssä vektori c (2, -1, 1). Olkoon a 3ı 2j`5k ja b 4ı 4j`3k. Ratkaise seuraavat tehtävät R:n avulla.

Ohjelmointi ja tilastolliset menetelmät 23 a) Määritä vektori 114a ` 207b. b) Määritä a b. c) Määritä kahden desimaalin tarkkuudella a. d) Laske yhden desimaalin tarkkuudella vektorien a ja b välisen kulma suuruus. Tässä on hyödyksi funktio arkuskosini (kosini), joka vastaa laskimen funktiota cos 1. (Funktio arkuskosini () palauttaa kulman asteina; tavallisesti arkuskosini määritellään siten, että kulman mittana on radiaani.) 11. Aineisto talvilampotila.helsinki sisältää vektorin lampotila, jonka elementit ovat Helsingin kolmen talvikuukauden keskilämpötilat vuosina 1830 2010. 1 Lataa aineisto komennolla 2 lataa.aineisto ("talvilampotila.helsinki") ja ratkaise seuraavat aineistoon liittyvät tehtävät. a) Funktiokutsulla plot (x, y, type="l") voidaan piirtää viivadiagrammi, jossa piirrettävän murtoviivan vaaka-akselin arvot saadaan vektorista x ja pystyakselin arvot vektorista y. Laadi aineistosta viivadiagrammi, jossa vaaka-akselina on vuosiluku ja pystyakselina lämpötila; vaaka-akseli voi sisältää myös arvot merkkijonoina, joten voit käyttää sen asettamiseen funktiota names (). Akselien nimet voidaan asettaa parametreilla xlab ja ylab (kts. s. 21). b) Mitkä ovat olleet viisi kylmintä talvea, ja mitkä olivat tällöin keskilämpötilat? Entä viisi lämpimintä? c) Aineistovektorissa elementtien nimet ovat vuosilukuja merkkijonoina. Merkkijonovektorin x voi muuttaa lukuvektoriksi funktiolla as.numeric (x) Muodosta alkuperäisen aineistovektorin mittainen looginen vektori, jossa yksittäinen elementti on TRUE täsmälleen silloin, kun kyseinen vuosi on välillä 1900 1999. Laadi a-kohdan kuvaajaa vastaava kuvaaja vuosista 1900 1999. d) Muodosta koko ajanjaksosta vektori, jossa kukin elementti on talvilämpötilan muutos edellisestä vuodesta (vihje: diff ()). Muodosta histogrammi näistä muutoksista funktion hist () avulla. 12. a) Simuloi R:llä 20 nopanheittoa. b) Tarkastellaan tilannetta, jossa heitetään painotettua noppaa: kuutosen todennäköisyys on kaksi kertaa niin suuri kuin muiden silmälukujen todennäköisyys. Simuloi R:llä tuhatta heittoa painotetulla nopalla. (Simuloinnin voi tehdä mallintamalla noppaa, jossa on seitsemän sivua: kaksi kuutosta ja 1 Lähde: Tilastokeskus http://www.stat.fi 2 Aineiston lataaminen vaatii verkkoyhteyden.

24 Luku 2. Vektori yksi sivu muille silmäluvuille.) Olkoon x odotusarvo kuutosten määrälle, kun heitetään reilua noppaa 1000 kertaa. Laske painotetulla nopalla simulaatiossa saatujen kuutosten määrän ja luvun x suhde kahden desimaalin tarkkuudella. c) Toista b-kohdan simulaatio 100000 heitolla. d) Osoita kynällä ja paperilla että painotetulla nopalla saatujen kuutosten ja reilulla nopalla saatujen kuutosten odotusarvojen suhde n:ssä heitossa on 12 7 «1,71. 13. Tarkastellaan koetta, jossa x ja y ovat kaksi satunnaisesti väliltä r 1, 1s valittua lukua. Määritellään tapahtuma A seuraavasti: A : x ja y ovat xy-tasossa origokeskisen yksikköympyrän sisällä. y x a) Osoita kynällä ja paperilla, että P paq π 4. b) Koetta toistetaan n kertaa, jolloin tapahtuma A toteutuu n A kertaa. Tiedämme, että kun n kasvaa rajatta, niin suhde n A lähestyy todennäköisyyttä n P paq. Laske tämän avulla R:ää käyttäen arvio luvulle π. (Vihje: funktio runif ().)

3 Matriisi Matriisi taulukkona Taulukkoa tai joukkoa vektoreita voidaan R:ssä käsitellä matriisina. Siinä missä vektorin elementteihin viitataan yhdellä indeksillä, matriiseissa käytetään kahta indeksiä. Näistä ensimmäinen on taulukon rivi ja toinen taulukon sarake. Tyhjä indeksi tarkoittaa, että valitaan kaikki rivit / sarakkeet. Matriisin jokainen rivi samoin kuin matriisin jokainen sarake on vektori. Seuraavassa esimerkissä tarkastellaan taulukkoa talvilämpötiloista kolmessa Suomen kaupungissa. 1 > lataa.aineisto ("talvilampotila.suomi") # talvilämpotilat 3 kaupungissa > head (lampotila, 3) # aineiston 3 ensimmäistä riviä Helsinki Jyvaskyla Sodankyla 1902-6.9-10.3-15.6 1903-4.8-7.0-10.5 1904-3.3-6.1-12.0 > tail (lampotila, 2) # aineiston 2 viimeistä riviä Helsinki Jyvaskyla Sodankyla 2009-1.7-5.4-9.3 2010-7.4-12.2-14.7 > nrow (lampotila) # rivien määrä [1] 109 > ncol (lampotila) # sarakkeiden määrä [1] 3 > lampotila ["1902", "Jyvaskyla"] # indeksointi: [rivi, sarake] [1] -10.3 > lampotila [1, 2] # sama kuin edellä [1] -10.3 > lampotila [1, ] # matriisin ensimmäisen rivin kaikki sarakkeet Helsinki Jyvaskyla Sodankyla -6.9-10.3-15.6 > lampotila [99:101, ] # rivien 99-101 kaikki sarakkeet 1 Lähde: Tilastokeskus http://www.stat.fi 26

Ohjelmointi ja tilastolliset menetelmät 27 Helsinki Jyvaskyla Sodankyla 2000-1.7-5.5-12.5 2001-1.9-5.6-10.9 2002-3.0-7.1-12.7 > head (lampotila [, -1], 3) # alkupään rivit ilman 1. saraketta Jyvaskyla Sodankyla 1902-10.3-15.6 1903-7.0-10.5 1904-6.1-12.0 > tail (lampotila [, c ("Helsinki", "Sodankyla")], 3) # sarakkeiden häntä Helsinki Sodankyla 2008 1.4-7.4 2009-1.7-9.3 2010-7.4-14.7 > head (sort (lampotila[, "Sodankyla"], decreasing = TRUE)) # lämpimimmät 2008 1925 1930 1949 1995 1992-7.4-7.5-7.7-7.7-7.7-7.9 > colnames (lampotila) # sarakkeiden (column) nimet [1] "Helsinki" "Jyvaskyla" "Sodankyla" > rownames (head (lampotila)) # ensimmäisten rivien (row) nimet [1] "1902" "1903" "1904" "1905" "1906" "1907" > mean (lampotila[, "Helsinki"]) # Helsingin lämpötilojen keskiarvo [1] -4.318348623853 > mean (lampotila[, "Sodankyla"]) [1] -12.70733944954 Funktio apply () Edellisen esimerkin kahdella viimeisellä komennolla lasketaan talvilämpötilojen keskiarvot sekä Helsingissä että Sodankylässä. Tällaista laskentaa tarvitaan usein: sovelletaan jotakin funktiota tässä funktiota mean () taulukon riveihin tai sarakkeisiin. Niinpä tätä varten R:ssä on valmis funktio apply (X, MARGIN, FUN), joka soveltaa (apply) annettua funktiota FUN matriisin X kaikkiin riveihin tai sarakkeisiin. Jos MARGIN = 1, niin funktion arvo lasketaan kaikista riveistä; jos MARGIN = 2, niin funktion arvo lasketaan kaikista sarakkeista. Seuraavassa muutama esimerkki. > lataa.aineisto ("talvilampotila.suomi") # talvilämpotilat 3 kaupungissa > head (lampotila, 2) Helsinki Jyvaskyla Sodankyla 1902-6.9-10.3-15.6 1903-4.8-7.0-10.5 > mean (lampotila [, "Helsinki"])

28 Luku 3. Matriisi [1] -4.318348623853 > apply (lampotila, 2, mean) # keskiarvo kaikista sarakkeista Helsinki Jyvaskyla Sodankyla -4.318348623853-7.892660550459-12.707339449541 > apply (lampotila, 2, median) # mediaani sarakkeista Helsinki Jyvaskyla Sodankyla -4.1-7.6-12.7 > round (apply (head (lampotila), 1, mean), 1) # rivien keskiarvo 1902 1903 1904 1905 1906 1907-10.9-7.4-7.1-9.3-5.6-8.5 > plot (rownames (lampotila), + apply (lampotila, 1, mean), + main = "kaupunkien talvilämpötilojen keskiarvo", + xlab = "vuosi", + ylab = "keskiarvo (Celsius-astetta)", + type = "l") kaupunkien talvilämpötilojen keskiarvo keskiarvo (Celsius-astetta) -14-12 -10-8 -6-4 1900 1920 1940 1960 1980 2000 vuosi

Ohjelmointi ja tilastolliset menetelmät 29 Matriisin muodostaminen Matriisi voidaan muodostaa yhdestä tai useammasta vektorista. Vektorin data elementeistä muodostetaan matriisi funktion matrix (data, nrow = 1, ncol = 1, byrow = FALSE) avulla. Funktiokutsussa matriisin kokoa säädellään parametrien nrow ja ncol avulla, ja täyttöjärjestyksen määrää parametri byrow (by row tarkoittaa riveittäin). Matriisin rivien ja sarakkeiden nimet voidaan asettaa ja kysyä funktioiden rownames () ja colnames () avulla. > x <- 1 : 9 > matrix (x, 3, 3) [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > matrix (x, nrow = 3) # sama kuin edellä [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > matrix (x, ncol = 3) # sama kuin edellä [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 > (A <- matrix (x, 3, 3, byrow = TRUE)) # täytetään riveittäin [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9 > rownames (A) <- c ("a", "b", "c") # nimet riveille > colnames (A) <- seq (1980, 2000, by = 10) # nimet sarakkeille > A 1980 1990 2000 a 1 2 3 b 4 5 6 c 7 8 9 > colnames (A) [1] "1980" "1990" "2000"

30 Luku 3. Matriisi Vektoreita, joissa on sama määrä elementtejä, voi liittää (bind) toisiinsa matriisiksi riveittäin tai sarakkeittain: > x <- 2 : 5 > y <- x + 10 > z <- x^2 > cbind (x, y, z) # liitetään sarakkeittain (column) x y z [1,] 2 12 4 [2,] 3 13 9 [3,] 4 14 16 [4,] 5 15 25 > rbind (x, y, z) # liitetään riveittäin (row) [,1] [,2] [,3] [,4] x 2 3 4 5 y 12 13 14 15 z 4 9 16 25 Laskutoimitukset matriiseilla Matriisien laskutoimitukset tehdään elementeittäin samaan tapaan kuin vektoreilla. > (A <- matrix (1 : 4, nrow = 2)) [,1] [,2] [1,] 1 3 [2,] 2 4 > 2 * A [,1] [,2] [1,] 2 6 [2,] 4 8 > A^2 [,1] [,2] [1,] 1 9 [2,] 4 16 > (B <- matrix (round (runif (4, -1, 1)), nrow = 2)) # satunnaisdataa [,1] [,2] [1,] 0 1 [2,] 1-1 > B > 0 [,1] [,2] [1,] FALSE TRUE [2,] TRUE FALSE

Ohjelmointi ja tilastolliset menetelmät 31 > - 4 * A + 3 * B [,1] [,2] [1,] -4-9 [2,] -5-19

32 Luku 3. Matriisi Tehtävät 14. Muodosta R:ssä matriisi 4 5 6 7 10 9,98 9,96 9,94 a) muodostamalla ensin matriisin rivit ja käyttämällä sen jälkeen funktiota rbind () b) muodostamalla ensin yksi vektori, joka sisältää matriisin kaikki elementit, ja käyttämällä sen jälkeen funktiota matrix (). 15. a) Muodosta R:ssä matriisi 4 9 12 A. 44 35 19 b) Aseta matriisin rivien nimiksi a ja b ja sarakkeiden nimiksi luvut 1500, 1600 ja 1700. c) Laske R:llä 2. rivin 3. elementin ja 1. rivin 2. elementin välinen erotus. d) Laske rivien summat ja sarakkeiden summat. e) Laske rivien tulot ja sarakkeiden tulot funktion prod () avulla. f) Muodosta matriisi B matriisin A 1. ja 3. sarakkeesta. g) Matriisiin voidaan lisätä rivejä ja sarakkeita funktioiden rbind () ja cbind () avulla. Muodosta matriisi C, joka sisältää matriisin A elementtien lisäksi ylimääräisen sarakkeen, jossa on rivisummat, sekä ylimääräisen rivin, jossa on sarakesummat, sekä oikeassa alakulmassa näiden yhteisen elementin, jossa on matriisin A kaikkien elementtien summa. 16. Muodosta matriisi, jonka kukin sarake sisältää 30 satunnaisen kolikonheiton klaavojen lukumäärän (kukin elementti siis 0 tai 1) ja jossa on 10000 saraketta. (Vihje: matriisi voidaan muodostaa yhdestä vektorista, johon on arvottu 30 10000 kolikonheiton tulos.) Muodosta sen jälkeen vektori, jossa on kunkin sarakkeen klaavojen lukumäärä. Piirrä histogrammi vektorin sisältämästä aineistosta. 17. Lataa aineisto koulutus.suomi, joka sisältää matriisin koulutus. 2 Matriisi sisältää tiedot eri koulutusasteen koulutuksen saaneiden suomalaisten lukumääristä. a) Kuinka monta riviä ja saraketta matriisissa on? b) Mitkä ovat rivien nimet ja sarakkeiden nimet? c) Tarkastele matriisin kahta ensimmäistä riviä. Kuinka moni suomalainen oli saanut tutkijakoulutuksen vuonna 1999? 2 Lähde: Tilastokeskus http://www.stat.fi

Ohjelmointi ja tilastolliset menetelmät 33 d) Kuinka paljon ylemmän korkeakoulutuksen saaneiden määrä kasvoi vuodesta 1999 vuoteen 2009? e) Piirrä pylväsdiagrammi, jonka vaaka-akselina on vuosiluku ja pystyakselina tutkijakoulutettujen osuus kaikista koulutetuista prosentteina. f) Matriisin kunkin rivin viimeisen sarakkeen elementin pitäisi olla vastaavan rivin muiden elementtien summa. Tarkista, että näin on. g) Minä vuonna alimman korkea-asteen koulutuksen saaneiden lukumäärä laski eniten edellisestä vuodesta? (Vihje: funktio diff ().) 18. Lataa aineisto talvilampotila.suomi, joka sisaltaa matriisin lampotila. 3 a) Mikä oli keskimääräinen talvilämpötila Jyväskylässä vuonna 1941? b) Selvitä kunkin kaupungin korkein keskimääräinen talvilämpötila kyseisenä aikana (korkeinta lämpötilaa vastaava vuotta ei tarvitse selvittää). c) Piirrä viivadiagrammi Sodankylän talvilämpötiloista vuosina 1950 2000. (Kannattaa ensin tallentaa vektoriin rivien niminä olevat vuodet lukuina.) d) Minä vuonna Helsingin ja Sodankylän talvilämpötilojen ero on ollut suurin? 19. Aineisto talvilampotila.helsinki sisältää vektorin lampotila, jonka elementit ovat Helsingin kolmen talvikuukauden keskilämpötilat vuosina 1830 2009. 4 Lataa aineisto. Muodosta matriisi, jonka n. pystyrivi sisältää kyseisen ajanjakson n. vuosikymmenen talvilämpötilat, ja laske eri vuosikymmenten talvilämpötilojen keskiarvot. Aseta tuloksena saamasi vektorin elementtien nimiksi kunkin vuosikymmenen ensimmäinen vuosi ja esitä tulokset pylväsdiagrammissa. 3 Lähde: Tilastokeskus http://www.stat.fi 4 Lähde: Tilastokeskus http://www.stat.fi

4 Funktio ja algoritmi Funktio automatisoinnissa Tietotekniikan avulla voidaan automatisoida usein tehdyt toimenpiteet. Sama idea pätee myös tietokoneohjelman sisällä: usein tarvitut laskutoimitukset tms. automatisoidaan. Ohjelmoinnissa automatisoinnin perustyökalu on funktio. Funktion määritteleminen Otetaanpa käytännöllinen esimerkki hyödyllisestä funktiosta. Tällä kurssilla ladataan aineistoja kurssin kotisivuilta. Sen sijaan, että yhä uudestaan naputtelisimme samat komennot ja kotisivun osoitteen, käytämme funktiota lataa.aineisto (). Tämä funktio lataa annettua nimeä vastaavan aineiston. Funktion ohjelmakoodi näkyy alla (funktio 1); vasemmalla olevat numerot eivät ole osa funktiota vaan funktion analysoinnissa auttavia rivinumeroita. Ohjelmakoodi määrittelee uuden funktion lataa.aineisto (). Tarkastellaan lähemmin 1 lataa.aineisto <- function (aineiston.nimi) 2 { 3 osoite <- paste ("http://www.syk.fi/otm/aineistot/", 4 aineiston.nimi, 5 ".rda", 6 sep = "") 7 yhteys <- url (osoite) # avataan yhteys 8 load (yhteys, globalenv ()) # luetaan aineisto muistiin 9 close (yhteys) # suljetaan yhteys 10 } Funktio 1: Aineiston lataaminen kurssin kotisivuilta. Funktion vasemmassa reunassa olevat numerot eivät ole osa funktion määrittelyä, vaan auttavat funktion analysoinnissa. 34

Ohjelmointi ja tilastolliset menetelmät 35 funktion määrittelyä. Määrittely alkaa riviltä 1. Siinä kerrotaan, että muuttujaan lataa.aineisto sijoitetaan funktio, jonka parametri on aineiston.nimi. Funktion runko, eli se ohjelmakoodi, joka suoritetaan kun funktiota kutsutaan, on aaltosulkujen sisällä riveillä 3 9. Riveillä 3 6 muuttujaan osoite sijoitetaan merkkijono, joka on aineistotiedoston www-osoite. Tässä käytetään R:n funktiota paste (), joka liittää merkkijonoja toisiinsa yhdeksi merkkijonoksi; tällöin toisiinsa liitettävien merkkijonojen väliin laitetaan funktion parametri sep, jonka oletusarvo on sep = " ". Muuttuja osoite on funktion paikallinen muuttuja: se on olemassa vain sen aikaa, kun funktiota suoritetaan. Paikalliset muuttujat ovat välttämättömiä: muuten voitaisiin sotkea varsinaisessa työtilassa olevan samannimisen muuttujan osoite sisältö. Funktiota kirjoitettaessa ei voida tietää, mitä muuttujia käyttäjällä on työtilassa silloin kun funktiota kutsutaan. Vastaavasti funktiota käytettäessä ei ole järkevää ryhtyä selvittämään, minkä nimisiä muuttujia käytettävän funktion sisällä on. Rivillä 7 avataan yhteys aineistotiedostoon verkon yli. Esimerkistä huomataan, että muuttujiin voidaan R:ssä sijoittaa huomattavan monimutkaisiakin olioita; tässä paikalliseen muuttujaan yhteys sijoitetaan tarvittavat tiedot yhteydestä verkon yli. Rivillä 8 luetaan aineisto verkon yli. Aineistossa olevia muuttujia ei haluta tallentaa funktion paikallisiksi muuttujiksi, vaan varsinaiseen R:n työtilaan, joka tunnetaan myös globaalina ympäristönä. Tätä varten funktiolle load () annetaan tässä toinen argumentti globalenv (), joka on lyhenne sanoista global environment. Huomaa, että kun ladattavassa tiedostossa olevat muuttujat tallennetaan työtilaan, saatetaan tuhota työtilassa olevia samannimisiä muuttujia. Siksi kyseisellä funktiolla voisi joissain tilanteissa olla varsin yllättäviä sivuvaikutuksia. Rivillä 9 suljetaan verkkoyhteys aineistoon. Edellä määritelty funktio ei palauta mitään arvoa, mutta muuttaa sivuvaikutuksenaan työtilassa olevia muuttujia. Seuraava esimerkki on perinteisen matematiikan funktion kaltainen: funktiolla on paluuarvo, jota voidaan käyttää myöhemmässä laskennassa. Funktio määrittelee funktion fpyq p2y ` 1q 2 ` a2y ` 1. Paluuarvo palautetaan funktiolla return (). > f <- function (y) + { + x <- 2 * y + 1 # paikalliseen muuttujaan x sijoitetaan arvo + return (x^2 + sqrt (x)) # paluuarvo paikallisen muuttujan avulla