0 uvod - university of novi sadpeople.dmi.uns.ac.rs/~zlc/fajlovi/r_skripta.pdf1 ovaj material je...
TRANSCRIPT
1
Ovaj material je prevod teksta: M. Hutzenthaler, R course, February 24, 2011
0 Uvod
0.1 Sta je R?
S je okruženje za računanje i vizulizaciju odgovora na statistička pitanja.Razvija se od 1976
godine, od strane John Chambersa-a i njegovih kolega iz Bell Laboratorije (SAD). R je implementacija
otvorenog izvornog koda S. Naziv R se delom bazira na početnom slovu imena prvih autora programa
(Robert Gentleman i Ross Ihaka, Novi Zeland, 1991-1993), a delo. 1993 Bell Laboratorija je dala
’Insightful Corp.’ (sada TIBCO) ekskluzivnu licencu za razvijanje i prodaju S jezika. Insightful prodaje
svoju implementaciju S pod nazivom S-PLUS i uz to je i izgradio i brojne funkcije (većinonom GUIs).
Postoje samo male razlike između R i S-PLUS-a, tako da većina kodova iz R radi i u S-PLUS i obrnuto.
Primer aplikacije na R ćemo predstaviti na osnovu podataka do kojih je dosao Lee Salk (O ulozi otkucaja
srca između majke i novorođenčeta). Slučajno su izabrana novorođenčad koja su čula otkucaje srca
odraslog čoveka. Na sledećem grafiku prikazana je grupa beba sa porođajnom tezinom ispod 3000g,
zatim je izvršeno poređenje dobijanja na težini u raponu od 2 do 5 dana između kontrolne grupe i grupe
novorođečadi koja je čula otkucaje.
Dobrobiti novorođenčeta od slušanja otkucaja srca?
Dobitak na težini između 2 i 5 dana
Glavne prednosti:
R je besplatan software
Nove statističke metode se prvo implementiraju u R
Nedostaci
R zahteva navikavanje, jer se zasniva na komandnim linijama, a ne na GIU
U R grafika nije interaktivna (npr. nemamo opciju 'undo')
2
0.2 Preuzimanje R
R is besplatan software (GNU licenca).
Korisnici Windowsa: Preuzmite R Windows instalaciju sa
http://cran.r-project.org/bin/windows/base/
Nakon toga dupli klik na instalaciju, kako bi ste instalirali R kao i bilo koji drugi Windows software.
Mozete naknadano preuzeti i instalirati pakete koje želite iz CARN na sledeći način:
> Packages > Install packaegs. Isto tako, mozete instalirati Tinn-R programski ediotor za Windows.
Možete ga preuzeti sa :
http://sourceforge.net/projects/tinn-r/
Pokrenite R izvršavanjem ’R.exe’.
Mac korisnici: Univerzalni binarni za Mac OS X 10.4.4
http://cran.r-project.org/bin/macosx/
Dupli klik na ikonicu R.mpkg. Mozete preuzeti i instalirati pakete preko interneta:
> Packages and Data > Packages Installer menu.
Linux/Unix korinisci: Prekompajlirani binarni za mnoge Linux sisteme su dostupni na:
http://cran.r-project.org/bin/linux/
Ili korisnici mogu sastaviti R od izvora. Videti:
http://cran.r-project.org/
0.3 Literatura
• Ligges, Uwe. Programmieren mit R. SpringerVerlag Berlin 2005 (Njemacka)
• R web-strnanica daje sledeci uvod u R
http://cran.r-project.org/doc/manuals/R-intro.pdf
• Lista najčešće postavljenih pitanja vezanih za R
http://cran.r-project.org/doc/manuals/R-FAQ.html
• Indexi R komandi sa objasnjenjem (Njemački,u izradi)
http://de.wikibooks.org/wiki/GNU_R:_Befehle-Index
3
• Kratka lista bitnih komandi
http://cran.r-project.org/doc/contrib/Short-refcard.pdf
Ova lista je posebno korisna kako bi se podsetili na komande.
0.4 Biblioteka
R ima previše komandi za učitavanja kada se krene sa upotrebom. R komande su organizovane
kao paketi. Na primer, paket ’base’sadrži osnovne komande, paket ’stats’ sadrži statističke komande kao
sto su distribucije. Paket ’datasets’ sadrže primere paketa podataka. Izbora važnih paketa
(library(lib.loc=.Library)) je napunjen na početku. Dalji paketi trebaju se dodati ''rucno'' . Na primer,
paket 'lattice' se dodaje na sledeci nacin
>library(lattice)
Pokretanje paketa zihteva instalaciju paketa na računar.
Lista instaliranih paketa može se videti na installed.packages().
Lista komadi koje sadrži paket xyz može biti viđena sa library(help=”xyz ”).
Komande available.packages(), download.packages(), install.packages(), update.packages() mogu
pomoći pri instalaciji i ažuriranju podataka.
1. Osnove
1.1 R kao kalkulator
Svi počeci su teški. Zato mi počinjemo sa nečim poznatim.
> 2+3 [1] 5 > 3*6 [1] 18 > # Ovo je komentar > 2^6; 7/3 # više komandi je odvojeno sa ';' [1] 64 [1] 2.333333 > 4+3*5^2 # pravila o prednosti operacija važe kao i uvek [1] 79 > 1.2 [1] 1.2 > 1,2 # nemačka decimalna notacija ne funkcioniše Error: Unexpected ',' in "1," > 1.2e3 # ovo je jednako 1.2 * 10^3. 'e' kao 'exponent (eksponent)' [1] 1200 > 5 %/% 3 # celobrojni količnik [1] 1 > 5 %% 3 # ostatak pri deljenju [1] 2
4
> exp(1) # eksponencijalna funkcija [1] 2.718282 > exp(log(5)) # log() je prirodni logaritam [1] 5 > sin(pi/2) # sinus [1] 1 > cos(pi/2) # kosinus od pi/2 je nula. Napomena: R ne nudi nulu kao
#odgovor! [1] 6.123234e-17 > max(4,2,5,1) # maksimum svih elemenata [1] 5 > sum(4,2,5,1) # suma svih elemenata [1] 12 > prod(4,2,5,1) # proizvod svih elemenata [1] 40 > factorial(4) # 4 faktorijal [1] 24 > choose(5,2) # 5 nad 2 [1] 10 # Još neke funkcije : # exp(), log(), log10(), log2(), # sin(), cos(), tan(), asin(), acos(), atan(), # sinh(), cosh(), tanh(), asinh(), acosh(), atanh() # sum(), prod(), abs(), sqrt(), max(), min(), factorial(), choose() # round(), floor(), ceiling(), trunc(), signif()
1.2 Pomoć pri radu
> help(solve) # Prikazuje stranicu za pomoć za komandu "solve". > ?solve # Isto kao help(solve). > help("exp") > help.start() # Prikazuje html-stranu sa raznim linkovima. > help.search("solve") # Prikazuje listu komandi koje mogu biti povezane sa stringom
# “solve”. > ??solve # Isto kao help.search("solve"). > example(exp) # Prikazuje primere za korišćenje funkcije 'exp'. > example("*") # Imajte na umu da se posebni znakovi moraju navesti unutar
# navodnika. 1.3 Zadaci, poređenja i logički izrazi
> # promenljivoj x je dodeljena vrednost 5. > x [1] 5 > 6 -> x # ekvivalentno sa x <- 6 ali neuobičajeno.
5
> x [1] 6 > x = 7 # ekvivalentno sa x <- 7 ali neuobičajeno > x [1] 7 > y <- x^2 + 3 # dodeli 7^2 + 3 promenljivoj y > y [1] 52 > myfunction <- exp # uvođenje nove funkcije > myfunction(log(5)) [1] 5 > myfunction <- sqrt > myfunction(81) [1] 9 Birajući elemente koji imaju određena ‘svojstva’ pristupamo podskupovima skupova velikih
grupa podataka. ‘Svojstva’ se formulišu preko logičkih izraza koje sada uvodimo.
> 4 == 4 # Da li su obe strane jednake? [1] TRUE # TRUE je konstanta u R-u. > 4 == 5 [1] FALSE # FALSE je konstanta u R-u. > 4 == 3 + 1 [1] TRUE > cos(pi/2) == 0 # UPOZORENJE: Nikad ne treba upoređivati dve
#numeričke vrednosti sa ==. Umesto toga proveriti da li #je apsolutna vrednost od cos(pi/2) manja od dovoljno #malog broja koji predstavlja prag vrednosti.
[1] FALSE > 3 <= 4 [1] TRUE > 5 > 2*2 [1] TRUE > 5 > 2+3 [1] FALSE > 4 != 3 # ! je negacija, != znači ‘nije jednako’. [1] TRUE > 3 != 3 [1] FALSE > 2 != 3 [1] TRUE > TRUE & TRUE # & je znak za logičko I. Rezultat je TRUE ako su oba
# izraza tačna. [1] TRUE > TRUE & FALSE [1] FALSE > TRUE | FALSE # | je znak za logičko ILI. Rezultat je TRUE ako je bar
# jedan od izraza tačan. [1] TRUE > FALSE | FALSE [1] FALSE
6
> FALSE | TRUE [1] TRUE > 5 > 3 & 0 != 1 [1] TRUE > 5 > 3 & 0 != 0 [1] FALSE > ! TRUE # ! je znak za logičko NE. Rezultat od !(izraz) je TRUE
# ako i samo ako je ‘izraz‘ netačan. [1] FALSE > ! FALSE [1] TRUE > ! ( 5 == 5 ) [1] FALSE
1.4 Ispisivanje i crtanje
Objekti se ispisuju sa print(). U interaktivnom modu R-a '> print(x)' je isto što i ‘> x‘. Komanda cat() vrši konkatenaciju svojih argumenata u jedan string karaktera i ispisuje ga. Komanda plot() crta funkcije i vektore.
> print(sqrt(2)) # isto što i '> x'(u interaktivnom modu) [1] 1.414214 > print(sqrt(2),digits=5) # ispisuje 5 cifara [1] 1.4142 # vidi ?format za više o formatiranju > sqrt(2) [1] 1.414214 # ako nije naglašeno drugačije, ispisuje 7 cifara > options(digits=10) # 10 cifara se ispisuje od sada > sqrt(2) [1] 1.414213562 > y <- 42 > cat("I odgovor je",y,"ako ne grešim.\n") # Oznakom \n prelazimo u novi red. I odgovor je 42 ako ne gresim. > cat("Danas je:\t",date(),"\n") # date() vraća današnji datum i vreme. Danas je: Fri Jan 01 06:00:00 2010
> plot(sin, from=-10, to=10) Ovde smo koristili ‘\n‘ za novi red i '\t' za ubacivanje taba – vidi ?Quotes za kompletnu listu.
7
Histogram vektora v se crta sa hist(v). Komanda ecdf(v) vraća empirijsku kumulativnu distribuciju funkcije (‘ECDF’) vektora v.
> v <- c ( 1:7, rep(2,4), rep(3,6), rep(4,3), 6:7, 7, 7 ) > hist(v) > ecdf(v) # ecdf() vraća ecdf ali je ne ispisuje. Empirical CDF Call: ecdf(v) x[1:7] = 1, 2, 3, ..., 6, 7 > plot(ecdf(v))
1.5 Vektori
8
Vektori predstavljaju nabrajanja proizvoljnih objekata. Za kreiranje vektora koristimo komande 'c', 'seq' i 'rep'.
> c(2,5,3,7) # poveže elemente u vektor [1] 2 5 3 7 > seq(from=1,to=10,by=3) # kreira niz od 1 do 10 sa korakom 3 [1] 1 4 7 10 > seq(from=3,to=7) # kraća forma za seq(from=3,to=7,by=1) [1] 3 4 5 6 7 > seq(1,11,3) # kraća forma za seq(from=1,to=11,by=3).
# Ovde je bitan redosled 1, 11 i 3! [1] 1 4 7 10 > seq(3,7) # kraća forma za seq(from=3,to=7). Ponovo je bitan
# redosled! [1] 3 4 5 6 7 > 3:7 # kraća forma za seq(from=3,to=7) [1] 3 4 5 6 7 > c(2:5, 3:7) [1] 2 3 4 5 3 4 5 6 7 > rep(3,5) # replicira prvi objekat (ovde je to 3) 5 puta [1] 3 3 3 3 3 > rep(0:2,3) [1] 0 1 2 0 1 2 0 1 2 > rep(7:9,2:4) # Ako su oba vektora iste dužine. [1] 7 7 8 8 8 9 9 9 9 # Ovde: Replicira 7 dva puta, 8 tri puta, 9 četiri puta
Koristimo elemenat vektora koristeći operator [].
> x <- c(12,15,13,17,11) > x[4] # Četvrti element vektora x. [1] 17 > x[3:5] # Podvektor sastavljen od trećeg, četvrtog i petog #
elementa vektora x. [1] 13 17 11 > x[-2] # Minus znači ‘bez’. [1] 12 13 17 11 > x[-(3:5)] # Svi elementi osim trećeg, četvrtog i petog. [1] 12 15
Standardne operacije na vektorima su element po element. U binarnoj operaciji, dužina jednog
vektora mora da bude umnožak dužine drugog. Primeri:
> c(2,5,3) + c(4,2,7) [1] 6 7 10 > c(2,5,3) * c(4,2,7) [1] 8 10 21 > 2 + c(2,5,3) # Isto kao c(2,2,2) + c(2,5,3) [1] 4 7 5 > 2 * c(2,5,3) # Isto kao c(2,2,2) * c(2,5,3) [1] 4 10 6 > c(2,5,3)^2 # Isto kao c(2,5,3) c(2,2,2)
9
[1] 4 25 9 > c(2,5,3) c(3,2,1) [1] 8 25 3 > c(3,2) * c(2,5,3,4) # Isto kao c(3,2,3,2) * c(2,5,3,4) [1] 6 10 9 8 > c(2,5,3,4) c(3,2) # Isto kao c(2,5,3,4) c(3,2,3,2) [1] 8 25 27 16 > c(3,2) c(2,5,3,4) [1] 9 32 27 16 > exp( c(0,1,log(5)) ) [1] 1.000000 2.718282 5.000000 > sum(5:7) # 5 + 6 + 7 [1] 18 > prod(4:6) # 4 * 5 * 6 [1] 120 > x <- 1:5 > x > 3 # Koji elementi su veći od 3 [1] FALSE FALSE FALSE TRUE TRUE > (x %% 2) == 1 # Koji elementi su parni [1] TRUE FALSE TRUE FALSE TRUE
Standardne operacije na vektorima su po elementima. U binarnom sistemu, dužina jednog vektora
pomnožena je dužinom drugog vektora. Primer:
> c(2,5,3) + c(4,2,7)
[1] 6 7 10 > c(2,5,3) * c(4,2,7) [1] 8 10 21 > 2 + c(2,5,3) # Isto kao c(2,2,2) + c(2,5,3) [1] 4 7 5 > 2 * c(2,5,3) # Isto kao c(2,2,2) * c(2,5,3) [1] 4 10 6 > c(2,5,3)^2 # Isto kao c(2,5,3) c(2,2,2) [1] 4 25 9 > c(2,5,3) c(3,2,1) [1] 8 25 3 > c(3,2) * c(2,5,3,4) # Isto kao c(3,2,3,2) * c(2,5,3,4)
[1] 6 10 9 8 > c(2,5,3,4) c(3,2) # Isto kao c(2,5,3,4) c(3,2,3,2) [1] 8 25 27 16 > c(3,2) c(2,5,3,4) [1] 9 32 27 16 > exp( c(0,1,log(5)) ) [1] 1.000000 2.718282 5.000000 > sum(5:7) # 5 + 6 + 7 [1] 18 > prod(4:6) # 4 * 5 * 6 [1] 120 > x <- 1:5 > x > 3 # Elementi koji su > 3
10
[1] FALSE FALSE FALSE TRUE TRUE > (x %% 2) == 1 # Elementi koji su neparni [1] TRUE FALSE TRUE FALSE TRUE
Snažne odlike R-a su indeksranje sa logičkim indeksima vektora. Time, mi možemo izabrati pomoćni
vektor koji se sastoji od svih elemenata sa određenim svojistvima.
> v <- c(12,15,13,17,11) > v[c(TRUE,FALSE,TRUE,TRUE,FALSE)] [1] 12 13 17 > v[c(TRUE,FALSE,TRUE)] # Kraći indeksi vektora su dopunjeni sa 'FALSE' [1] 12 13 > v[c(TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE)] [1] 12 13 17 NA NA > v>12 [1] FALSE TRUE TRUE TRUE FALSE > v[v>12] [1] 15 13 17 > v<=16 & (v%%2)==1 [1] FALSE TRUE TRUE FALSE TRUE > v[ v<=16 & (v%%2)==1 ] [1] 15 13 11 > v[ v>=13 | (v%%2)==0 ] [1] 12 15 13 17 > v[v>12] <- 0 # Skup svih elemenata većih od 12 do 0 > v [1] 12 0 0 0 11 > v[v==0] <- 2 # Dodeliti 2 svim elementima koji su jednaki 0 > v [1] 12 2 2 2 11 > v==2 [1] FALSE TRUE TRUE TRUE FALSE Ovde su izabrane komande na vektorima. > v <- c(13, 15, 11, 12, 19, 11, 17, 19) > length(v) # Vraća dužinu vektora v [1] 8 > rev(v) # Vraća okrenut vektor [1] 19 17 11 19 12 11 15 13 > sort(v) # Vraća sortiran vektor [1] 11 11 12 13 15 17 19 19 > sort(v,partial=4) # Vraća vector I četvrti element [1] 11 11 12 13 19 15 17 19 # Slaže se sa sortiranim vektorom > indexvec <- order(v) > indexvec # Indeksi vektora su sortirani [1] 3 6 4 1 2 7 5 8 > v[indexvec] # v[ order(v) ] je isti kao sort(v) [1] 11 11 12 13 15 17 19 19 > duplicated(v) # Identifikuje duple elemente [1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
11
> unique(v) # Vraća vector bez duplih elemenata [1] 13 15 11 12 19 17 > rank(v) # Vraća rang elemenata vektora v [1] 4.0 5.0 1.5 3.0 7.5 1.5 6.0 7.5 > some <- ( v > 13 ) > some [1] FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE > any(some) # Vraća TAČNO ako je na poslednjem mestu TAČNO; inače NETAČNO [1] TRUE > all(some) # Vraća TAČNO ako je na svim mestima TAČNO; inače NETAČNO [1] FALSE > which(some) # Vraća indekse na kojima su TAČNO [1] 2 5 7 8 > which.max(v) # Vraća indeks maksimalnog elementa vektora [1] 5 > which.min(v) # Vraća indeks minimalnog elementa vektora [1] 3
1.6 Matrice
Matrice su obično kreirane sa 'matrix', pretvaranjem vektora u matricu ili spajanjem skupa vektora. > m <- matrix( data = 1:8, nrow=4, ncol=2 ) > m [,1] [,2] [1,] 1 5 [2,] 2 6 [3,] 3 7 [4,] 4 8 > matrix ( 1:8,4,2 ) # Isto kao matrica( data = 1:8, nrow=4, ncol=2 ) Indeksiranje je “vrsta po koloni” > m[3,2] # Prikazuje element treće vrste i druge kolone. [1] 7 > m[2,] # Druga vrsta [1] 2 6 > m[,2] # Druga kolona [1] 5 6 7 8 > m[2:3,1:2] # Podmatrica [,1] [,2] [1,] 2 6 [2,] 3 7 Komanda 'matrix' podrazumeva vektore podataka po kolonama, što znači, prva kolona se prva puni.. Ako želite podatke po vrstama, onda dodati 'byrow = TRUE'. > y <- matrix( data = 1:8, nrow=4, ncol=2, byrow = TRUE ) > y [,1] [,2]
12
[1,] 1 2 [2,] 3 4 [3,] 5 6 [4,] 7 8 > t(y) # t(y) je transponovana matrica y [,1] [,2] [,3] [,4] [1,] 1 3 5 7 [2,] 2 4 6 8 > z <- as.matrix(1:6) # Pretvaranje vektora 1:6 u matricu sa jednom kolonom > z [,1] [1,] 1 [2,] 2 [3,] 3 [4,] 4 [5,] 5 [6,] 6 > dim(z) [1] 6 1 > dim(z) <- c(2,3) # Pretvaranje matrice 6x1 u matricu 2x3 > z [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > dim(z) [1] 2 3 > is.matrix( 1:6 ) [1] FALSE > is.matrix( as.matrix(1:6) ) [1] TRUE > cbind(1:3,5:7) # Vezuje vektore po kolonama [,1] [,2] [1,] 1 5 [2,] 2 6 [3,] 3 7 > rbind(1:3,5:7,10:12) # Vezuje vektore po kolonama [,1] [,2] [,3] [1,] 1 2 3 [2,] 5 6 7 [3,] 10 11 12 Komanda 'diag' kreira dijagonalnu matricu. > diag(1,nrow=3,ncol=3) # Kreira 3x3 jediničnu matricu. [,1] [,2] [,3] # Dijagonalna matrica sa tri kolone I tri vrste [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 > diag(3) # Isto kao diag(1,nrow=3,ncol=3) > diag(5:7,3,4) [,1] [,2] [,3] [,4]
13
[1,] 5 0 0 0 [2,] 0 6 0 0 [3,] 0 0 7 0 Kao I na vektorima, standardne operacije na matricama definisane su po elementima. > m1 <- matrix(1:6,nrow=3) ; m1 [,1] [,2] [1,] 1 4 [2,] 2 5 [3,] 3 6 > m2 <- matrix(16:11,nrow=3) ; m2 [,1] [,2] [1,] 16 13 [2,] 15 12 [3,] 14 11 > m1 + m2 [,1] [,2] [1,] 17 17 [2,] 17 17 [3,] 17 17 > m1 * m2 [,1] [,2] [1,] 16 52 [2,] 30 60 [3,] 42 66 Zapis poput m1*m2 nije matrični proizvod. Operator za matrično množenje je '%*%'. Proizvod m x n matrice y, i k x l matrice z je definisan samo ako je n == k. Po definiciji, y% * %z je
> mat1 <- matrix(1:6,2,3) > mat2 <- matrix(5:0,2,3) > mat1 [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 6 > mat2 [,1] [,2] [,3] [1,] 5 3 1 [2,] 4 2 0 U matričnom množenju vektora i matrice, vector je prikazan kao vrsta vektora za 'vektor %*% matrica' i kao kolona vektora za 'matrica %*% vektor'. Pravilo za 'vektor %*% vektor' se interpretira kao skalarni proizvid 'vrsta vektora %*% kolona vektora'. > mat3 <- t(mat2) ; mat3 [,1] [,2] [1,] 5 4 [2,] 3 2 [3,] 1 0
14
> mat1 %*% mat3 # 2 x 3 matrica puta 3 x 2 matrica [,1] [,2] [1,] 19 10 [2,] 28 16 > mat3 %*% mat1 # 3 x 2 matrica puta 2 x 3 matrica [,1] [,2] [,3] [1,] 13 31 49 [2,] 7 17 27 [3,] 1 3 5 > v <- 7:9 > v %*% mat3 # v je interpretirano kao vrsta vektora [,1] [,2] [1,] 14 8 > v %*% v # Skalarni proizvod v sa samim sobom [,1] [1,] 194 # kolona vektora %*% vrsta vektora mora da se sprovede > as.matrix(v)%*% t( as.matrix(v) ) [,1] [,2] [,3] [1,] 1 2 3 [2,] 2 4 6 [3,] 3 6 9 Zapisi vektora nisu uvek interpretirani kao vrsta vektora niti su uvek interpretirani kao kolone vektora. Interpretacija zavisi od vrednosti funkcije. 1.7 Tipovi podataka u R-u
Sve promenljive i objekti su klasifikovani kao (npr. matrice, liste, skupovi podataka) i vrste podataka kao (npr. logički podaci, numerički podaci, kompleksni podaci, simboli) koji su vrste tipova podataka koje objekti sadrže. Tipovi podataka u R: Tip podatka Opis Primer logički TAČNO ili NETAČNO TAČNO, NETAČNO numerički celi i realni brojevi 5, -2, 3.1415, sqrt(2) kompleksni kompleksni brojevi 2.1+3i, 5+0i simboli niz karaktera "Ovo je tekst", "5" Tipovi mogu biti pretvoreni komandama as.logical(), as.numeric(), as.complex() i as.character(). Pretvaranje (zvano prinuda) tipova podataka obično ne rade korisnici ali implicitno R uradi tamo gde je potrebno. Pimetimo da implicitno pretvaranje ide u pravcu logički →numerički → kompleksno → simbolički. Tip podataka promenljive proverava se komandama is.logical(), is.numeric(), is.complex(), is.character(). Tip podataka promenljive se pronalazi pomoću mode() a klasa promenljive sa class(). Primeri: > x <- TRUE; mode(x) [1] "logical" > as.numeric(TRUE) ; as.numeric(FALSE) [1] 1 # Interna reprezentacija TRUE je 1 [1] 0 # Interna reprezantica FALSE je 0 > c("1.0",2) # 2 je implicitno prevedeno u 'character' [1] "1.0" "2"
15
> v <- c(1,2,2,2,5); as.numeric(v==2) [1] 0 1 1 1 0 > sum(v==2) # Isto kao sum( as.integer(v==2) ) > [1] 3 # Koliko elemenata je jednako 2? > 2*c(TRUE, FALSE) # Implicitno prevedeno logički -> numerički tip [1] 2 0 > as.numeric(c("1.0", "2)) # Eksplicitno prevedeno simbol -> numerički tip [1] 1 2 > 2*c("1.0","2") # Implicitno prevođenje logički -> numerički tip ne radi Error in 2 * c("1.0", "2") : ne numerički argument za binarni operator
2. Osnovne statistike u R-u
Neke raspodele implementirane u R-u
R programski jezik omogućava rad sa sledećim raspodelama:
Raspodela Komanda u R-u
beta raspodela beta
binomna raspodela binom
Košijeva raspodela Cauchy
Hi-kvadratna raspodela chisq
eksponencijalna raspodela exp
Fišerova raspodela f
gama raspodela gamma
geometrijska raspodela geom
hipergeometrijska raspodela hyper
log-normalna raspodela lnorm
logistička raspodela logis
multinomijalna raspodela multinom
normalna raspodela sa više promenljivih mvnorm
negativna binomna raspodela nbinom
normalna raspodela norm
Poasonova raspodela pois
rapodela Vilkoksove statisktike ranga signrank
raspodela Vilkoksove statistike sume ranga Wilcox
Studentova t-raspodela t
uniformna raspodela unif
16
Vejlbulova raspodela weilbull
Odavde, normalna raspodela se najčešće koristi, mahom zbog njene veze sa centralnom graničnom
teoremom. Često se koriste i binomna i uniformna raspodela, dok se hi-kvadratna, Studentova i
Fišerova raspodela koriste u standardnim statističkim testovima. Ostale raspodele se u nastavku
neće pominjati.
Za svaku raspodelu, R nudi sledeće četiri komande:
dxxx: funkcija gustine raspodele xxx,
pxxx: funkcija raspodele date raspodele xxx,
qxxx: kvantilna funkcija raspodele xxx,
rxxx: generator slučajnih brojeva iz raspodele xxx,
gde se za svaku pojedinačnu raspodelu odgovarajuća komanda u R-u (videti tabelu) stavi na mesto
“xxx”. Tako je, na primer dnorm komanda koja daje gustinu normalne raspodele, dok dt daje
gustinu Studentove t-raspodele.
Normalna raspodela
Funkcija gustine normalne raspodele sa zadatim očekivanjem i standardnom devijacijom data je sa:
Očekivana vrednost slučajne promenljive sa ovom raspodelom je , a njena varijansa .
Standardizovana normalna raspodela ima očekivanu vrednost 0 i standardnu devijaciju 1. Dakle,
odgovarajuća funkcija gustine je dnorm(x, mean=0, sd=1). Ako 'mean' i 'sd' nisu eksplicitne u okviru
dnorm() komande, uzimaju se vrednosti 0 i 1, respektivno. Dakle, dnorm(x) je ekvivalentno sa
dnorm(x, mean=0, sd=1), i njenoj funkciji raspodele pnorm dodeljuje se vrednost:
Kvantilna funkcija raspodele za predstavlja najmanju vrednost x takva da je
. Formalnije:
Primetimo da se u slučaju apsolutno neprekidnih raspodela kvantilna funkcija svodi na inverznu
funkciju funkcije raspodele.
Komanda rnorm(n) generiše slučajan uzorak obima n standardizovane normalne raspodele. Imajući
ovo na umu, podsetimo se da se 68% podataka uzorka iz realizovane standardizovane normalne
17
raspodele nalazi u rasponu jedne standardne devijacije, a čak 95% u rasponu dve standardne
devijacije:
> pnorm(1)-pnorm(-1) #68% podataka
[1] 0.6826895
> pnorm(2)-pnorm(-2) #95% podataka
[2] 0.9544997
> pnorm(3)-pnorm(-3) #99.7% podataka
[3] 0.9973002
Još jedno svojstvo kojeg se treba podsetiti jeste da ako je , onda je:
I obrnuto važi, svako obeležje sa nestandardizovanom normalnom raspodelom može se
standardizovati:
Ako želimo plotovati komandu dnorm (standardizovanu i nestandardizovanu) između -4 i 4 sa
isprekidanom linijom debline 3, možemo uneti:
> # Histogram 10000 simuliranih vrednosti
> # i njihov odnos sa funkcijom gustine,
> # probability=TRUE crta histogram verovatnoca, ne vrednosti,
> # breaks=seq(...) odredjuje koje vrednosti koji stubic broji:
> hist(rnorm(10000),col="grey",probability=TRUE,breaks=seq(-5,to=5,by=0.2))
> plot( dnorm, from=-4,to=4,add=TRUE ,lwd=3, lty="dashed")
i odmah zatim:
> # skalirana nestandardizovana normalna raspodela
> # lwd je linewidth, lty je linestyle
> hist( (rnorm(10000,mean=5,sd=10)-5) / 10,col="grey",probability=TRUE,
18
+ breaks=seq(-5,to=5,by=0.2) )
> plot( dnorm, from=-4,to=4,add=TRUE ,lwd=3, lty="dashed")
Binomna raspodela
Znamo da je binomna raspodela zapravo raspodela slučajne promenljive koja broji broj uspešnih ogleda iz serije ogleda. Preciznije, funkcija gustine dbinom(k,m,p) daje verovatnoću da su od ukupnih m ogleda k uspešno realizovane, ako je verovatnoća uspešnosti ogleda . Funkciji gustine binomne raspodele dodeljuje se vrednost:
Očekivana vrednost je pritom mp, dok je varijansa mp(1-p). Funkciji raspodele binomne raspodele
dodeljuje se vrednost:
Pritom, kvantilna funkcija raspodele qbinom(q,m,p) za predstavlja najmanju vrednost x
takvu da je dbinom (x,m,p) veće ili jednako od q. Komanda rbinom(n,m,p) generiše slučajan uzorak
obima n ove raspodele:
> dbinom(1,3,1/6) # Verovatnoca da ce pasti jedna sestica,
# ako se kocka baca 3 puta
[1] 0.3472222
> dbinom(0,1,1/2) # Verovatnoca da ce pasti pismo pri bacanju novcica
[1] 0.5
> dbinom(1,1,1/2) # Verovatnoca da ce pasti glava pri bacanju novcica
[1] 0.5
19
> sum(dbinom(5:10,60,1/6)) # Verovatnoca da padne izmedju pet i deset
# sestica, ako se kocka baca 60 puta
[1] 0.5631944
> sum(dbinom(0:60,60,1/6)) # Ukupna suma pojedinacnih verovatnoca
[1] 1
> qbinom(0.5833866,60,1/6)
[1] 11
> qbinom(0.5833865,60,1/6) # qbinom se svodi na inverznu funkciju od pbinom
[1] 10
> qbinom(pbinom(0:29,60,1/6),60,1/6) == 0:29
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE
16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
TRUE
> rbinom(8,60,1/6)
[1] 12 10 11 11 4 12 7 11
Poslednja komanda, rbinom(8,60,1/6) daje ispis osam brojeva, od kojih svaki predstavlja broj
sestica koje su pale nakon bacanja kocke 60 puta.
Uniformna raspodela
Uniformna raspodela na intervalu [a,b] ima funkciju gustine:
Standardizovana uniformna raspodela definisana je nad intervalom [0,1], tako da joj je funkcija
gustine data sa dunif(x, min=0, max=1). Naravno, ako se minimalna i maksimalna vrednost ne
naglase, one uzimaju vrednosti 0 i 1, respektivno. Funkciji raspodele se dodeljuje vrednost:
Očekivana vrednost slučajne promenljive sa raspodelom je 1/2 a varijansa 1/12.
Ispitivanje raspodele zadatog skupa podataka
mean(v) računa uzoračku srednju vrednost
vektora podataka v,
var(v) računa uzoračku varijansu
, n=length(v),
sd(v) računa standardnu devijaciju uzorka , n=length(v)
cov(v,w) računa uzoračku kovarijansu
za zadata dva
vektora podataka v i w i n=length(v)=length(w),
20
cor(v,w) računa uzorački koeficijent korelacije za vektore v i w,
median(v) ispisuje vrednost medijane uzorka,
quantile(v) ispisuje kvartile uzorka v,
summary(v) ispisuje srednju vrednost, varijansu, medijanu i kvartile uzorka,
boxplot(v) pravi box-plot i whisker plot,
hist(v) pravi histogram vrednosti u v,
ecdf(v) vraća emirijsku funkciju raspodele v.
Podsetimo se šta su kvartili i medijana. Neka je . Ako se podaci sortiraju u varijacioni niz,
iza kvantila reda p nalazi se p-ti deo svih vrednosti u vektoru. Za više detalja, može se pozvati
``?quantile''. Kvantil reda 0.25 naziva se prvim kvartilom, reda 0.5 medijanom, a reda 0.75 trećim
kvartilom. Kvartili dakle, dele varijacioni niz na četiri dela.
U nastavku slede primeri:
> mean(c(1,2,21)) # (1+2+21)/3
[1] 8
> mean(c(0,1,2,21)) # (0+1+2+21)/4
[1] 6
> mean(c(-1,0,1))
[1] 0
> var(c(-1,0,1)) # ( (-1)^2+1^2 ) / ( 3-1 )
[1] 1
> var(c(-2,0,2))
[1] 4
> var(rep(1,4))
[1] 0
> mean(rep(1,4))
[1] 1
> mean(1:4) # ( 1+2+3+4 ) / 4
[1] 2.5
> cov(1:4,1:4) # isto sto i var(1:4)
[1] 1.666667 # ( (1-2.5)^2+(2-2.5)^2+(3-2.5)^2+(4-2.5)^2 ) / ( 4-1 )
> cor(1:4,1:4) # = cov(1:4,1:4) / sqrt( var(1:4)*var(1:4) )
[1] 1
> cor(1:4,-1:4)
[1] -1
> cor(1:4,17:20)
[1] 1
> cor(1:4,20:17)
[1] -1
> median(c(1,2,9,1100))
[1] 5.5
> quantile(c(1,2,9,1100))
0% 25% 50% 75% 100%
1.0 1.75 5.50 281.75 1100.00
> summary(c(1,2,15))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.0 1.5 2.0 6.0 8.5 15.0
> mean(rnorm(1000000))
[1] 0.0004818741
21
Box plot i whisker plot mogu postlužiti za vizualizaciju podataka i kvartila podataka. Horizontalna linija u sredini pokazuje medijanu podataka. Horizontalna linija nad medijanom pokazuje treći kvartil i horizontalna linija ispod medijane pokazuje prvi kvartil. Sama kutija (box) pokazuje gde se središnjih 50% podataka u varijacionom nizu nalaze (interkvartilno rastojanje), a dužina svake vertikalne linije (whisker) odgovara jednoj i po dužini interkvartilnog rastojanja. Svi podaci van ovih linija nazivaju se autlajeri (outliers) i označeni su kružićima na boxplotu.
>summary(c(1,2,1500))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.0 1.5 2.0 501.0 751.0 1500.0
> boxplot(c(1,2,1500))
> summary(rnorm(10000))
Min. 1st Qu. Median
Mean 3rd Qu. Max.
-3.858000 - 0.690200
0.005504 - 0.003528
0.667200 3.944000
>
boxplot(rnorm(10000))
> summary(rbinom(10000,60,1/6))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.00 8.00 10.00 10.01 12.00 22.00
> summary(runif(1000000))
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.036e-06 2.496e-01 5.002e-01 5.000e-01 7.506e-01 1.000e+00
22
> hist(rnorm(10000))
> plot(ecdf(rnorm(100)))
Generatori slučajnih brojeva
Slučajni brojevi kakvi se mogu generisati u R-u zapravo su pseudo-slučajni brojevi. Postoji više razloga zašto je to tako. Najpre, slučajna promenljiva sa normalnom raspodelom može uzimati kontinuum mnogo potencijalnih vrednosti, ali kompjuteri mogu prikazivati samo konačno mnogo vrednosti. Takođe, na ovaj način se dobijaju rezultati koje je moguće reprodukovati, zato što pseudo-slučajne brojeve odlikuju sledeće osobine:
(gotovo da) nema ponavljanja u generisanom nizu brojeva,
slučajan niz može se reprodukovati,
slučajan niz se generiše što je moguće brže.
Generator pseudo-slučajnih brojeva kreće od takozvanog seed-a, koristići komandu set.seed(). Niz
se tada generiše primenom poznate determinističke funkcije u svakoj iteraciji. Stoga, ako generator
krene od istog seed-a, on će generisati isti niz brojeva. Po pravilu, ako se generator eksplicitno ne
definiše, R koristi Mersenne-Twister generator (Matsumoto i Nishimira 1998). Ovo se može menjati
uz pomoć komande RNGkind(), videti ``?RNGkind''. Ako se ni seed ne naglasi, generator kreće od
vremenskog trenutka kada se R pokrenuo. Pogledajmo primere:
> rnorm(3)
[1] 1.0844412 -2.3456977 0.4291247
> set.seed(1234) # koristi ovaj seed za generator
> rnorm(3)
[1] -1.2070657 0.2774292 1.0844412
> rnorm(3)
[1] -2.3456977 0.4291247 0.5060559
23
> set.seed(1234) # restartuj generator sa ovim seedom
> rnorm(3) # dobijaju se iste vrednosti kao ranije
[1] -1.2070657 0.2774292 1.0844412
> rnorm(3)
[1] -2.3456977 0.4291247 0.5060559
> RNGkind("Wichmann-Hill") # koristi drugaciji generator
> set.seed(1234) # kreni od istog seed-a
> rnorm(3) # vrednosti se sada razlikuju zbog drugacijeg
generatora
[1] -0.2160838 0.8444022 0.6975076
> RNGkind("Mersenne-Twister")
> set.seed(1234)
> rnorm(3)
[1] -1.2070657 0.2774292 1.0844412
3 Čitanje i unos podataka
3.1 Liste
Skupovi podataka su reprezentovani kao takozvani okviri podataka (data frames) u R. Sad
uvodimo specijalne liste. Liste su kolekcije proizvoljnih objekata. Tako npr. lista može da se
sastoji od matrice, vektora, logičke vrednosti, stringa (niza karaktera)... Liste kreiramo sa list()
komandom. Elementima liste pristupamo sa [[]] - operatorom. I bitno je razlikovati opeartor [[]]
od [].
npr.
> L <- list( c(1,5,3), matrix(1:6, nrow=3), c("Hello", "world") )
> L [[1]] [1]1 5 3
[[2]]
[,1] [,2]
[1,] 1 4 [2,] 2 5
[3,] 3 6
[[3]]
[1] "Hello" "world"
> L[[1]] # Prvi element iz liste L
[1] 1 5 3
> L[[2]][2,1] # Element [2,1] izdrugog elementaliste L [1] 2 # Primetimo da je L[[2]] matricačijim elementima možemo pristupiti sa []
24
> L[[c(3,2)]] # Rekurzivno: 2. komponentu iz 3. elementaiz L, (string u ovom slučaju)
[1] "world"
> list(1:4,7:8) # Lista sačinjena od dva vektora [[1]] [1] 1 2 3 4
[[2]]
[1] 7 8 > c(1:4,7:8) # c() povezuje (spaja) dva vektora u jedan
[1] 1 2 3 4 7 8
# kada povezuje liste, c() spaja liste kao u lanac > L2 <- c( list(1:3,2:4), list( c("Hello","world"), c(1,5,3) ) ) > L2
[[1]] [1] 1 2 3
[[2]] [1] 2 3 4
[[3]]
[1] "Hello" "world" [[4]]
[1] 1 5 3
> mode(L2) # mode() pokazuje tip objekta koji se nalazi u listi [1] "list" # zaista, L2 je lista
> L2[[2]] <- NULL # postavlja drugi elemenat liste u NULL > L2 # ekvivalentno je brisanju drugog elementa liste
[[1]] # u ovom slucaju to je bio vektor (2,3,4) [1] 1 2 3
[[2]] [1] "Hello" "world"
[[3]] [1] 1 5 3
Listama možemo alternativno pristupati imenom promenljivih umesto brojem. U primeru
navedenom iznad, moramo se setiti da je drugi element u L bila matrica. Sledeća definicija je
25
lakša za pamćenje jer ćemo elementima liste pristupati njihovim imenom. Elementi iz liste su povezani sa $-operatorom. Dodelimo imena elementima L liste.
> L <- list( v=c(1,5,3), m=matrix(1:6, nrow=3), text=c("Hello", "world") )
> L$v [1] 1 5 3
> L$m [,1] [,2]
[1,] 1 4 [2,] 2 5 [3,] 3 6
> L$text
[1] "Hello" "world" > L$m[2,1] # L$m je matrica čijim elementima možemo pristupiti sa []
[1] 2
> L$text[2] [1] "world"
> L[[1]] # bez obzira što smo elementima liste dodelili imena pristup sa brojevima i dalje funkcioniše [1] 1 5 3
3.2 Okviri podataka
Okviri podataka su tipične reprezentacije skupova podataka u R-u. Okviri podatakasu liste sa ograničenjem da su svi elementi vektori iste dužine. Komandom data.frame() kreiramo okvir
podataka.
> group <- data.frame(name = c("Hans", "Caro", "Lars", "Ines", "Samira","Peter", "Sarah"), gender = c("male", "female", "male", "female","female", "male", "female"), favourite_colour = c("green", "blue", "yellow","black", "yellow", "green", "black"),
income = c(800,1233,2400,4000,2899,1100,1900) )
> group name gender fav_col income 1 Hans male green 800
2 Caro female blue 1233 3 Lars male yellow 2400
4 Ines female black 4000 5 Samira female yellow 2899 6 Peter male green 1100
7 Sarah female black 1900
26
> group$income [1] 800 1233 2400 4000 2899 1100 1900
> group$gender[2] [1] female
Levels: female male
> group$name[,1] name 1 Hans
2 Caro 3 Lars
4 Ines 5 Samira 6 Peter
7 Sarah
> group$name [1] Hans Caro Lars Ines Samira Peter Sarah Levels: Caro Hans Ines Lars Peter Samira Sarah
> group[1,]
name gender favourite_colour income 1 Hans male green 800
Okviri podataka obično sadrže velike skupove podataka koje je teško posmatrati, upravo zbog obima. Komanda str() daje nam pregled svih promenljivih u okviru podataka. Komanda
summary() ispisuje sumiran izveštaj datog okvira podataka. > str(group)
'data.frame': 7 obs. of 4 variables: $ name : Factor w/ 7 levels "Caro","Hans",..: 2 1 4 3 6 5 7
$ gender : Factor w/ 2 levels "female","male",..:3 1 2 1 1 3 1 $ favourite_colour: Factor w/ 4 levels "black","blue",..: 3 2 4 1 4 3 1 $ income : num 800 1233 2400 4000 2899 ...
> summary(group)
name gender favourite_colour income Caro :1 female :4 black :2 Min. : 800 Hans :1 male :3 blue :1 1st
Qu.:1166 Ines : 1 green :2 Median
:1900 Lars : 1 yellow:2 Mean :2047
27
Peter :1 3rdQu.:2650 Samira:1 Max. :4000
Sarah :1
Pisanje komande 'group$' iznova i iznova je naporno. Da bismo uštedeli nešto vremena koristimo naredbu attach(group). Ova komanda kao da nalepi 'group' u putanju pretrage R-a (zamislimo
mesto gde R traži varijable) tako da možemo pristupiti svim elementima bez pominjanja 'group$'.
> gender[2] Error: object "gender" not found
> attach(group) # poveže (kopira) 'group' u putanju pretrage (search path)
> gender[2] # 'gender' je sada poznata promenljiva [1] female Levels: female male
> name[3]
[1] Lars Levels: Caro Hans Ines Lars Peter Samira Sarah
> name[3] <- "Samira" # ova naredba vrši izmene samo u kopiji group-e u putanji pretrage, ne i našu # promenljivu na kojoj radimo
> name [1] Hans Caro Samira Ines Samira Peter Sarah
Levels: Caro Hans Ines Lars Peter Samira Sarah
> group$name # originalni okvir podataka 'group' ostaje nepromenjen [1] Hans Caro Lars Ines Samira Peter Sarah Levels: Caro Hans Ines Lars Peter Samira Sarah
> detach(group) # odvoji 'group' od putanje pretrage (komandu detach možemo
shvatiti kao inverznu > name[3] # komandi attach), posle detach(group), 'name' nam nije poznata Error: object "name" not found
Posmatranjem 'group' možemo pomisliti da ljudi čija je omiljena boja 'žuta' imaju viša primanja.
Da bismo istražili ovo, treba da selektujemo podskup 'group' sa omiljenom bojom 'žuta'. Ovo možemo učiniti na sledeći način:
> group[group[["favourite_colour"]]=="yellow",] # pristupamo koloni koja ima ime fav_col==yellow
name gender favourite_colour income 3 Lars male yellow 2400
28
5 Samira female yellow 2899
Do istog rešenja možemo doći na jednostavniji način kroz naredbu subset():
> subset(group,favourite_colour=="yellow") Primetimo, kolona omiljena boja je identički jednaka boji ‘žuta’ , pa nam nije potrebna. Brišemo
kolonu tako što selektujemo sve sem treće kolone.
> subset(group,favourite_colour=="yellow",select=-3) name gender income 3 Lars male 2400
5 Samira female 2899
Takođe može da nam padne napamet da napravimo podskupkoji čine ljudi čija je omiljena boja 'green' ili 'black'. Tada bi podskupfavourite_colour {green, black} bio praktičan. Simbol je
predstavljen u R sa operatorom %in%.
> subset( group, favourite_colour %in% c("green","black") )
name gender favourite_colour income 1 Hans male green 800
4 Ines female black 4000 6 Peter male green 1100 7 Sarah female black 1900
Da li sad podgrupa sa omiljenom bojom 'žuta' ima viši prihod? Možemo da izračunamo
očekivanje od 'yellow'-group prihoda, pa dobijemo da je očekivani prihod veći nego kod ostalih grupa.Naravno, ovo ne daje odgovor na pitanje, jer je obim uzorka premali da daje bilo kakve značajne rezultate.
> yellow_group <- subset(group,favourite_colour=="yellow")
> mean(yellow_group$income) [1] 2649.5
> subset( group, favourite_colour %in% c("green","black") )$income [1] 800 4000 1100 1900
> mean( group$income ) [1] 2047.429
> mean( subset(group,favourite_colour != "yellow")$income ) [1] 1806.6
> mean( subset(group,favourite_colour %in% c( "green","blue","black"))$income )
29
[1] 1806.6 # je ekvivalentno sa prethodnom komandom
Takođe, moguće je podeliti okvir podataka u listu sačinjenu od respektivnih podgrupa. Na primer možemo podeliti 'group' prema 'favourite colour' (omiljenoj boji). Ovo radimo naredbom split()
koja vraća listu od okvira podataka. Komanda unsplit() vraća unazad ono što smo učinili sa komandom split() i ona povezuje nazad listu od okvirova podatakau jedan okvir podataka.
> L <- split(group, group$favourite_colour) > L # L je lista okvira podataka
$black name gender favourite_colour income 4 Ines female black 4000
7 Sarah female black 1900
$blue name gender favourite_colour income 2 Caro female blue 1233
$green
name gender favourite_colour income 1 Hans male green 800 6 Peter male green 1100
$yellow
name gender favourite_colour income 3 Lars male yellow 2400 5 Samira female yellow 2899
> all( unsplit(L,group$favourite_colour)== group ) # identično?
[1] TRUE Ukoliko želimo da proširimo naš okvir podataka, to radimo komandom merge(). Sledi primer.
> snd_colour <- data.frame(favourite_colour=c("green","blue","yellow"), + second_colour=c("red","yellow","brown")) > merge(group,snd_colour,all.x=TRUE)
favourite_colour name gender income second_colour 1 black Ines female 4000 <NA> 2 black Sarah female 1900 <NA>
3 blue Caro female 1233 yellow 4 green Hans male 800 red
5 green Peter male 1100 red 6 yellow Lars male 2400 brown
30
7 yellow Samira female 2899 brown
Primetimo da svi sa favourite colour=="green" imaju second colour=="red". Boja "black" nije povezana ni sa bilo kojom drugom bojom, pa respektivni unosi u proširenom okviru podataka
ostaju NA (not available (nedostupni podaci)). Za više o komandi merge(), pogledajmo ?merge ili help(merge).
3.3 NA, Inf, NaN, NULL
Skupovi podataka su često nekompletni. Ponekad postoje vrednosti koje iz nekih razloga nisu poznate. Ove vrednosti koje nedostaju pamte se kao NA (= not available). R je dobar u radu sa
nedostajućim podacima. Mnoge komande su prilagođeneza rad sa njima. Komanda za detektovanje nedostajućih vrednosti je is.na().
> v <- c( 1,3,NA,5 ) > v[1] <- NA
> v
[1] NA 3 NA 5 > is.na(v)
[1] TRUE FALSE TRUE FALSE
> 5*v [1] NA 15 NA 25
> v*NA [1] NA NA NA NA
> sum(v) [1] NA
> exp(v)
[1] NA 20.08554 NA 148.41316 > is.na(v)==FALSE
[1] FALSE TRUE FALSE TRUE
> w1 <- v[is.na(v)==FALSE] # uklanja sve nedostajuće vrednost iz vektora v > w1 # tj. definisali smo novi vektor w1 u koji smo smestili sve vrednosti iz v, koje
[1] 3 5 # nisu NA > w2 <- v[!is.na(v)] # isto kao w1
31
Mnoge komande dozvoljavaju ignorisanje nedostajućih podataka. Ovo radimo modifikacijom 'na.rm=TRUE'(uklanja NA-ove) u komandama koje dozvoljavaju ovu modifikaciju.
> sum(v,na.rm=TRUE) # rm je skraćeno od remove
[1] 8 Ugrađene konstante Inf i -Inf su predstavljene sa i . Sve van određenog intervala R vidi kao
Inf ili -Inf. Ovaj interval zavisi od sistema (32bit or 64bit). Druga ugrađena konstanta je NaN
(not a number). Sva računanja koja nisu definisana rezultuju u NaN. > 1.7e308
[1] 1.7e+308
> 1.8e308 [1] Inf
> exp(709) [1] 8.218407e+307
> exp(710) [1] Inf
> 5/0
[1] Inf > exp(Inf)
[1] Inf
> Inf*(-2) [1] -Inf
> Inf*Inf [1] Inf
> 0/0 [1] NaN
> 0*Inf
[1] NaN > Inf –Inf
[1] NaN 'NULL' predstavlja null objekat (tj. 'there is no object' (ovaj objekat ne postoji)) u R. NULL često
vraćaju funkcije i izrazi čije vrednosti nisu definisane. Dakle, NaN je nedefinisana numerička vrednost i NULL često koristimo kao nedefinisan objekat.
32
3.4 Uređivanje podataka
Kad je pozvan uz okvir podataka ili matricu, edit() otvara posebno tabelarno okruženje za uređivanje podataka. Ovo je zgodno za pravljenje malih promena pošto je skup podataka učitan.
Zapamtimo da edit(x) uređuje lokalnu kopiju objekta, i ne skladišti nov rezultat (tj. promene koje smo uneli) u nov objekat, tako da su sve promene izgubljene ukoliko ne snimimo uređeni skup
podataka. Nastavljamo sa demonstracijom na okviru podataka 'group' izpododeljka 3.2. > edit(group) # sve promene će biti izgubljene
> newgroup <- edit(group) # newgroup uzima vrednosti edit(group) > group <- edit(group) # promene su skladištene u group
> fix(group) # ekvivalentna komanda sa 'group <- edit(group)' Ako je edit() pozvan sa funkcijom, onda je editor otvoren sa funkcijom što nam dalje dozvoljava
uređivanje samog načina na koji je funkcija definisana.
3.5 Čitanjei pisanje okvira podataka Učitajmo okvir podataka iz fajla read.table(). Napišimo okvir podataka fajla sa komandom
write.table(). Tipičan poziv:
read.table("filename.txt",header=TRUE) write.table(dataframe, file="filename.txt")
Pre učitavanja naših podataka iz fajla u okvir podataka, moramo pripremiti naš fajl sa podacima. Podaci bi nam mogli izgledati otprilike ovako:
težinska_kat pušač životni_vek 3 0 50.5
3 0 52.8 3 1 54.7
3 0 56.0 2 0 58.1 2 1 60.2
2 0 62.8 2 0 64.5
1 1 66.3 1 0 68.4 1 0 70.2
1 1 72.1
33
Pokrenimo Excel i otvorimo novu tabelu. Unesimo podatke kao u tabeli gore. Onda snimimo ovaj eksel fajl kao tekst na sledeći način. Otvorimo karticu File/Save as/... onda u ćeliji gde piše
'Save as type' biramo 'Text (Tab delimited)'. Snimimo fajl sa nazivom 'lifespandata'. Excel automatski dodaje ekstenziju'.txt' za tekst fajlove. Alternativno možemo otvoriti 'lifespandata.txt'
npr. Notepadom ili bilo kojim drugim tekst editorom i možemo pisati iznad tabele. Separator polja može da bude jedan ili više razmaka ili tabova (ili tačka zarez ; ).
Ne zaboravimo da se fajl nalazi u trenutnom radnom direktorijumu. Koristimo meni (File/Change directory) ili getwd() i setwd() da bismo odredili, odnosno postavili radni
direktorijum, respektivno. Onda učitamo fajl sa komandomread.table(). Prva linija fajla sadrži imena varijablai zovemo je 'header', pa uključimo opciju 'header=TRUE'.
> setwd("D:/Rcourse/") # "" su obavezni. Napomena koristimo/umesto\ > riscfactor <- read.table(file="lifespandata.txt",header=TRUE)
> # Alternativno koristimo file.choose() (choose-file-meni iskoči u grafičkom interfejsu): > # riscfactor <- read.table(file=file.choose(),header=TRUE)
> riscfactor težinska_kat pušač životni_vek 1 3 0 50.5
2 3 0 52.8 3 3 1 54.7
4 3 0 56.0 5 2 0 58.1 6 2 1 60.2
7 2 0 62.8 8 2 0 64.5
9 1 1 66.3 10 1 0 68.4 11 1 0 70.2
12 1 1 72.1
> str(riscfactor) 'data.frame' : 12 obs. of 4 variables: $ weightcls : int 3 3 3 3 2 2 2 2 1 1 ...
$ smoker : int 0 0 1 0 0 1 0 0 1 0 ... $ lifespan : num 50.3 52.8 54.7 56 58.1 60.2 62.8 64.5 66.3 68.4 \ldots
> write.table(riscfactor,file="lifespanout.txt") Važno je znati kako da ubacimo podatke u fajl sa podacima ili ekselovtabelarni prikaz. Postoji
mnogo načina da uradimo ovako nešto ali samo jedan će namolakšati život. Ključna stvar je upamtiti da
sve vrednosti iste promenljive idu u ISTU KOLONU.
34
Sledi primer. Ako smo imali eksperiment sa tri tretmana (control, pre-heated, prechilled),
i 4 merenja po tretmanu, dobra je ideja da kreiramo tabelarni prikaz na sledeći način:
Control Pre-heated
Pre-chilled
6.1 6.3 7.1
5.9 6.2 8.2 5.8 5.8 7.3
5.4 6.3 6.9 Ipak, ovo nije idealno za baratanje sa podacima u R-u. Mnogo bolje je da imamo jednu kolonu za
sva merenja i jednu kolonu koja bi vezala svako od merenja sa tretmanom pri kome je nastalo konkretno merenje.
Response Treatment 6.1 Control
5.9 Control 5.8 Control
5.4 Control 6.3 Pre-heated 6.2 Pre-heated
5.8 Pre-heated 6.3 Pre-heated
7.1 Pre-chilled 8.2 Pre-chilled 7.3 Pre-chilled
6.9 Pre-chilled
Ovakva organizacija podataka je pogodnija i prirodnija za R, jer je R posebno dobar u grupisanju vektora (u konkretnom primeru 'Response') prema kriterijumu (ovde 'Treatment'). Kasnije ćemo posmatrati relaciju 'Response~Treatment'. Nije jednostavno nadovezati vektore u R-u.
Sledeće dve opcije (naredbe) detaljnije objašnjavaju važne osobine read.table() i write.table().
read.table(file, header = FALSE, sep = "", dec = ".", row.names, fill = FALSE, ...) • header: logička vrednost koja govori o tome da li fajl sadrži imena promenljivih u svojoj prvoj
vrsti. Ako nedostaje, vrednost je određena iz formata fajla : 'header' je 'TRUE' ako i samo ako prva vrsta sadrži jedno polje manje nego broj kolona.
• sep: polje za separaciju karaktera (vrednosti). Vrednosti na svakoj liniji fajla su odvojene ovim karakterom. Ako je ' sep = "" ' (predefinisanoza 'read.table') separator je 'prostor bez
teksta',odnosno jedan ili više razmaka, tabova, entera,...
35
• row.names: je vektor sačinjen od imena vrsta. Ovo može biti vektor koji dodeljuje stvarna imena vrstama, ili brojna vrednost koja kolonama tabele daje imena vrsta, ili niz karaktera koji
dodeljuje ime kolone u tabeli koja sadrži imena vrsta.
Ako postoji header i prva vrsta sadrži jedno polje manje nego broj kolona, onda je prva kolona u unosu korišćena za imena vrsta. Inače ako 'row.names' nedostaje, vrste su numerisane.
• fill: logička vrednost. Ako je 'TRUE' onda imamo slučaj sa vrstama koje imaju nejednaku dužinu, prazna polja su implicitno definisana. Inače dobijamo ispis sa error porukom.
... Pored ovih navedenih postoje i mnoge druge opcije, pogledajmo ?read.table.
write.table(x,file="", append=FALSE, quote=TRUE, sep=" ", eol="\n", dec = ".", row.names=TRUE,...)
• x: objekat koji ćemo zapisati, najčešće matrica ili okvir podataka. Ako nije matrica, onda R pokušava da veže 'x' za okvir podataka.
• file: niz karaktera koji dodeljuje ime fajlu koji pišemo. '""' ukazuje izlaz na konzoli.
• append: logički. Ako je njegova vrednost 'TRUE', onda je njegov izlaz dodat fajlu. Ako je 'FALSE', bilo koji postojeći fajl istog imena je uništen. Imajući ovo u vidu treba biti pažljiv.
• quote: logička vrednost ('TRUE' ili 'FALSE') ili numerički vektor. Ako je vrednost 'TRUE', bilo
koji karakter ili faktor kolona će biti okružen sa duplim navodnicima. Ako je vrednost numerički vektor, njegovi elementi su tretirani kao indeksi kolona za navođenje. U oba slučaja, imena vrsta i kolona su navedena ako su ispisana u fajlu sa podacima. Ako je vrednost 'FALSE' ništa nije
navedeno.
• sep: separator niza karaktera. Ovaj niz karaktera odvaja vrednosti unutar svake kolone od 'x'. • dec: niz karaktera koji se koristi za decimalne tačke u numeričkim ili složenim kolonama: mora
biti jedan karakter.
... Za više opcija pogledati ?write.table. Postoje prečice za različite tipove unosa fajlova koje će nam uštedeti vreme. Sledi lista primera
koja precizira šta se podrazumeva pod različitim komandama.
Command header sep dec fill
read.table() FALSE "" "." FALSE read.csv() TRUE "," "." TRUE
36
read.csv2() TRUE ";" "," TRUE read.delim() TRUE "nt" "." TRUE
read.delim2() TRUE "nt" "," TRUE
3.6 Primeri različitih ulaznih fajlova
Pre učitavanja ulaznog fajla, trebali bismo otvoriti fajl sa podacimada bismo ispitali kog je fajl formata. Slede primeri koji pokazuju prve linije ulaznog fajla i preciziraju komande za učitavanje
podataka.
Primer 1: Prve tri linije fajlasu:
tež_kat "pušač" životni_vek
"3" 0 50.3 3 0 52.8
R komanda (string "3" je konvertovan u 3)
> riscfactor <- read.table("lifespandata2.txt",header=TRUE) Primer 2: Prve tri linije fajla su:
tež_kat "pušač" životni_vek
3 0 50.3 3 0 52.8
Dve komande u R-u koje rade isto su:
> riscfactor <- read.csv("lifespandata.csv") > riscfactor <- read.table("lifespandata.csv",header=TRUE,sep=",",fill=TRUE)
Primer 3: Prve tri linije fajla su:
tež_kat;pušač;životni_vek 3;0;50,3 3;0;52,8
R command
> riscfactor <- read.csv2("lifespandata.csv2") Primer 4: Prve tri linije fajla su:
težinska
klasa
pušač životni_vek
3 0 50.3
37
3 0 52.8
Primetimo da ime prve promenljive sadrži razmak. Ovo je problem ako su razmaci istovremeno i separatori. Ovde R očekuje 4 unosa po liniji. Komanda u R-u:
> riscfactor <- read.table("lifespandataspace.txt",header=TRUE)
zato završava sa greškom. Dodavanje opcije fill=TRUE rezultujesa 4 promenljive sa tako da 4. promenljiva ’životni_vek’ ima samo NA unose. Možemo izbeći ovaj problem tako što zamenimo
polje 'težinska klasa' sa npr. 'težinska.klasa' ili 'težinskaklasa' or '"težinska klasa"' ili ako zamenimo separator sa nekim drugim karakterom, a ne sa 'praznim prostorom' (npr. razmak ili tab) kao u fajlu 'lifespandataspace.csv'.
3.7 Faktori
U okviru podataka 'riscfactors', vrednosti kolone 'weightcls' su tipa 'numeric'. Ipak, vrednosti '1', '2' i '3' u vektoru 'weightcls' su pre namenjene imenima različitih grupa nego pravim numeričkim
vrednostima. Ovo definitivno pravi razliku u R-u,pa nam treba da preciznije definišemo R-u naše potrebe, što postižemo uz pomoć naredbe factor(). Komanda levels() vraća imena različitih grupa
u faktoru. Obratimo pažnju na različito ponašanje naredbe str() i summary() prouzrokovano načinom na koji posmatramo argument, bilo da je on numerički vektor ili faktor.
> x <- c("female","male","male","female","female") > levels(x)
NULL > str(x)
chr [1:5] "female" "male" "male" "female" "female"
> x <-factor(x) > levels(x) [1] "female" "male"
> str(x)
Factor w/ 2 levels "female","male": 1 2 2 1 1 > y <- rep(c(17,17,18),4); str(y)
num [1:12] 17 17 18 17 17 18 17 17 18 17 ...
> summary(y) Min. 1st Qu. Median Mean 3rd Qu. Max. 17.00 17.00 17.00 17.33 18.00 18.00
> y <- factor(y); str(y)
Factor w/ 2 levels "17","18": 1 1 2 1 1 2 1 1 2 1 ...
38
> summary(y) 17 18
8 4
Ako su numeričke vrednosti korišćene za imenovanje a ne kao prave numeričke vrednosti, onda markiramo vektor kao faktor. Sledeća definicija riscfactors2 popravlja definiciju riscfactors (faktora rizika).
> riscfactors2 <- data.frame( weightcls=factor( rep(3:1,c(4,4,4)) ),
+ smoker=factor( rep(c(0,0,1),4) ), lifespan=seq(50,72,2) ) > summary(riscfactors2) tež_kls pušač životni_vek
1 1:4 0:8 Min. : 50.0 2 2:4 1:4 1st Qu.: 55.5
3 3:4 Median : 61.0 4 Mean : 61.0 5 3rd Qu.: 66.5
6 Max. : 72.0 (Other):6
> summary(riscfactors) weightcls smoker lifespan Min. : 1 Min. : 0.0000 Min. : 50.0
1st Qu.: 1 1st Qu.: 0.0000 1st Qu.: 55.0 Median
:
2 Median
:
0.0000 Median
:
61.0
Mean : 2 Mean: 0.3333 Mean: 61.0 3rd Qu.: 3 3rd Qu.: 1.0000 3rd Qu.: 66.5
Max. : 3 Max. : 1.0000 Max. 72.0
Ako je kolona ulaznog fajla faktor, onda ili definišemo klasu kolone sa colClasses= ili konvertujemo promenljivu nakon učitavanja podataka:
> riscfactor <- read.table("lifespandata.txt",header=TRUE, + colClasses=c("factor","numeric","numeric"))
> riscfactor <- read.table("lifespandata.txt",header=TRUE) > class(riscfactor$wghtcls) [1] "integer"
> riscfactor$wghtcls <- factor(riscfactor$težkls) > class(riscfactor$težkls)
[1] "factor"
39
4. Crtanje
Naredbe za crtanje dele se na 3 vrste:
1. Funkcije visokog nivoa – kreiraju novi crtež ( sa osama, oznakama, naslovima,...)
2. Funkcije niskog nivoa – omogućavaju dodavanje informacija na postojeći crtež
(nove tačke, linije, oznake,...)
3. Interaktivne grafičke funkcije – omogućavaju interaktivno dodavanje i izvlačenje informacija iz
postojećeg crteža.
4.1 Funkcije visokog nivoa:
Standardna (plotting) naredba za crtanje visokog nivoa je plot( ). Ponašanje ove naredbe zavisi od izbora tipa argumenta (ulaznog podatka). Dat je pregled mogućih tipova ulaznih podataka i zavisnost izlaznih podataka od izbora argumenata (ulaznih podataka).
plot(x,y) : Ako su x i y numerički vektori funkcija plot(x,y) pravi scatterplot od y(x)
plot(y) : Ako je y numerički vektor onda je data funkcija identična funkciji plot(1:length(y),y)
plot(f) : Ako je f faktor onda funkcija plot(f) pravi barplot od f
plot(f,y) : Ako je f faktor a y numerički vektor onda funkcija plot(f,y) pravi boxplot od y za svaki nivo f-a
Primeri: Dužina pređenog puta (ft) potrebnog za zaustavljanje vozila koje je kreće određenom brzinom (mp/h).
>data(cars) # cars je skup podataka iz biblioteke 'datasets' vidi ?cars >?cars >attach(cars) >str(cars) >plot(speed,dist)
40
Skup podataka za sledeći primer preuzet je sa stranice http://evol.bio.lmu.de/_statgen/Rcourse/ws1112/
> rent <- read.table("miete03.asc",header=TRUE) > attach(rent) > str(rent) 'data.frame': 2053 obs. of 13 variables: $ nm : num 741 716 528 554 698 ... $ nmqm : num 10.9 11.01 8.38 8.52 6.98 ... $ wfl : int 68 65 63 65 100 81 55 79 52 77 ... $ rooms : int 2 2 3 3 4 4 2 3 1 3 ... $ bj : num 1918 1995 1918 1983 1995 ... $ bez : int 2 2 2 16 16 16 6 6 6 6 ... $ wohngut : int 1 1 1 0 1 0 0 0 0 0 ... $ wohnbest: int 0 0 0 0 0 0 0 0 0 0 ... $ ww0 : int 0 0 0 0 0 0 0 0 0 0 ... $ zh0 : int 0 0 0 0 0 0 0 0 0 0 ... $ badkach0: int 0 0 0 0 0 0 0 0 0 0 ... $ badextra: int 0 0 0 1 1 0 1 0 0 0 ... $ kueche : int 0 0 0 0 1 0 0 0 0 0 ... > plot(nm) > plot(factor(rooms))
41
> plot(rooms,nm) # rooms - numericki vector
> plot(factor(rooms),nm) # vektor rooms je konvertovan u factor
> plot(dnorm,from=-3, to=3) > plot(sin,from=-2*pi, to=2*pi) > plot(cos,from=-2*pi, to=2*pi, add=TRUE, lty='dashed') #dodaje cos(x) na postojeci grafik I menja tip linije na isprekidanu
42
> boxplot(nmqm,col='orange') # boxplot vektora net rent/m2 > boxplot(nmqm~rooms,col='lightgray',border='green') # odnos net rent/m2 i broja soba Grupisanje vektora ‘nmqm’ saglasno nivoima faktora ‘rooms’ vrši se operatorom ~ > boxplot(list( nmqm[which(rooms==1)], nmqm[which(rooms==2)], nmqm[which(rooms==3)], nmqm[which(rooms==4)], nmqm[which(rooms==5)], nmqm[which(rooms==6)] ),col='lightgray',border='green') # detto boxplot(nmqm~rooms,..)
Vektor rooms mogu da predstavim barplot-om funkcijom barplot(). Prvo se kreira tabela broj stanova sa 1 sobom, 2sobe,… funkcijom table().
> barplot(table(rooms),xlab='Rooms') > barplot(table(bez),xlab='District')
43
Postoje brojni argumenti koji mogu biti prosleđeni grafičkim funkcijama visokog nivoa. Sledeća lista sadrži najvažnije argumente:
add=TRUE forsira funkciju da se ponaša kao funkcija niskog nivoa,stavljajući novi crtež na postojeći
type=” ” argument kontroliše tip crteža na sledeći način:
type=” p ” crta pojedinačne tačke (points)
type=” l ” crta linije
type=” b ” crta tačke povezane linijom (both)
type=” o ” crta tačke prevučene linijom
type=” h ” crta vertikalnu liniju od tačke na grafiku f(x) do f(0) (high-density)
type=” s ” stepenasta funkcija
type=” S ” type=”n ” crtež koordinatnog sistema bez grafika,idealan za kreiranje crteža grafičkim funkcijama niskog nivoa
xlab=string ylab string definiše nazive koordinatnih osa
main=string naslov crteža, velikog formata, smešten na vrhu
sub=string podnaslov crteža, malog formata, smešten ispod x-ose
axes=FALSE poništava pravljenje osa,korisno kada dodaješ svoje ose naredbom axis()function axes=TRUE se podrazumeva
log="x" log="y" log="xy" pravi logaritamske koordinatne ose cex=1 veličina za koju se uvećavaju objekti u odnosu na uobičajenu ova opcija se koristi kada je osnovna veličina teksta jako mala
Grafički parametri takođe mogu biti trajno promenjeni naredbom par(), npr:
> par(col="green",lty="dashed") Poništavanje ove operacije se radi na sledeći način
44
> oldpar <- par(col="green",lty="dashed") čuva stare parametre u ‘oldpar’ > ... naredbe za crtanje ... > par(oldpar) resetuje sve parametre
4.2 Funkcije za crtanje niskog nivoa
Koriste se za dodavanje novih informacija (tačke,linije,tekst,...) postojećem crtežu. Neke korisne funkcije iz ove kategorije su: points(x, y) dodaje tačke postojećem crtežu
lines(x, y) dodaje tačke ili povezane linije postojećem crtežu
text(x, y, nazivi, ...) dodaje tekst u tačkama zadatim sa (x,y)
abline(a; b) dodaje liniju bx+a
abline(h=y ) može da se koristi za specifikaciju y koordinate kao visina (height)
abline(v=x ) može da se koristi za specifikaciju x koordinate kao vertikala
title(main=main,sub=sub ) dodaje naslove
axis(side=side, ...) dodaje osu postojećem crtežu sa strane, korisno za dodavanje svojih osa kada axes= FALSE
legend(x, y, legend, ...) dodaje legendu postojećem crtežu legend( , fill=v ) boja obojenih kutija (kod boxplota)
legend( , col=v ) boja linija i tačaka
legend( , lty=v ) tip linije
legend( , lwd=v ) širina linija
legend( , pch=v ) crta kataktere
arrows(x0,y0,x1,y1, ...) crta strelice od (x0,y0) do (x1,y1)
p.arrows(x0,y0,x1,y1, ...) iste strelice ali sa obojenim vrhom
plot.new() prazni postojeci prozor za crtanje
mtext() dodaje tekst na margine Sledi demonstracija dodavanja matematičkog zapisa postojećem crtežu. Primer: crtanje funkcije y=x
> x <- seq(from=0,to=5,by=0.1) > plot(x,x,type="l") > text(4.5,4,"y=x",cex=2) > plot(x,x^2,type="l") > text(4.5,15,"y=x^2",cex=2)
45
> x <- seq(from=0,to=5,by=0.1) > plot(x,x,type="l") > text(4.5,4,expression(y==x),cex=2) > plot(x,x^2,type="l") > text(4.5,15,expression(y==x^2),cex=2) expression() formira matematički zapis
Lista skraćenica koje se mogu koristiti za dodavanje matematičkog zapisa na crteže:
46
Više informacija, uključujući kompletnu listu skraćenica, može se naći na sledeći način: > demo(plotmath) > help(plotmath) > example(plotmath)
4.3 Interaktivni crteži
R je opremljen funkcijama koje omogućavaju korisniku da dodaje ili oduzima informacije sa postojećih crteža korišćenjem miša. locator(n,type="n") očekuje od korisnika da označi određene lokacije na crtežu,koristeći levi taster miša,nastavlja se dok se ne označi n lokacija ili dok nije pritisnut drugi taster miša;
identify(x,y,labels ) omogućava da korisnik istakne tačke definisane preko x i y,koristeći levi taster miša,crtajuci odgovarajuće komponente naziva (labels); vraća indekse označenih tačaka pritiskom na desni taster miša;
47
Ove funkcije se na primer mogu koristiti prilikom traženja outlier-a u podacima.
> plot(sin,from=-2*pi,to=2*pi,) > plot(cos,from=-2*pi,to=2*pi,add=TRUE,lty="dashed",col="red") > text(locator(1),"sin",adj=0) > text(locator(1),"cos",adj=1,col="red") > legend(locator(1),legend=c("sin","cos"),col=c("black","red"),lty=c(1,2))
4.4 Primeri crteža
Primer 1:
> attach(cars) > str(cars) > plot(speed,dist) > legend("topleft",legend="4 speed-17",lty="solid") > abline(-17,4) > title(main="Distance taken to stop a car from a certain speed")
48
Primer 2:
> oldpar <- par(las=1,cex=2) > x <- seq(-1,1,by=0.01) > y1 <- x^2 > y2 <- x^4 > plot(x,y1, type="l",axes=FALSE,main="Example",xlab="x", ylab=expression(paste("balck: ", x^2, " red: ", x^4)) ) > lines(x,y2, type="l", col=2) > axis(1, at=c(-1, 0, 1), labels=c("-1.0", "0.0", "1.0" ),col = "gold",lty = "solid", lwd = 2 ) > axis(2, at=c(0, 0.5, 1.0), labels=c("0.0", "0.5", "1.0" ),col = "blue", lty = "solid", lwd = 2 ) > legend( -0.5,0.75,legend=c(expression(y==x^2), expression(y==x^4)),col=c("black", "red"), lwd=2 ) > box() > par(oldpar)
49
Primer 3: Da li na novorođenčad dobro utiče slušanje kucanja srca?
> data<-read.table("heartbeats.txt",header=TRUE) > attach(data) > str(data) 'data.frame': 210 obs. of 3 variables: $ wghtcls : int 1 1 1 1 1 1 1 1 1 1 ... $ treatment: int 0 0 0 0 0 0 0 0 0 0 ... $ wghtincr : int -190 -130 -120 -110 -100 -80 -70 -70 -60 -50 ... > h<-treatment[wghtcls==1] > i<-wghtincr[wghtcls==1] > boxplot(i~h,names=c("Kontrola","Otkucaji"),xlab="Dobitak na tezini (g) izmedju 2. i 5. Dana ",notch=TRUE) > title(main=" Da li na novorođenčad dobro utiče slušanje kucanja srca?") > detach(data)
50
Primer 4:
> data<-read.table("heartbeats.txt",header=TRUE) > attach(data) > h<-treatment[wghtcls==1] > i<-wghtincr[wghtcls==1] > mtitle<-"Do newborns benefit from hearing heartbeats?" > sbtitle<-"Lightweight group: Birth weight below 3000 g" > xlb<-"Weight gain (g) between day 2 and day 5" > dev.new(height=6,width=9.5) > par(cex.main=1.5,cex.axis=1.4,cex.lab=1.4,font.main=1,mar=c(5,5,3,1)) > stripchart(i~h,method="stack",col="blue",pch=16,cex=1.4, + group.names=c("Control","Heartbeats"),ylim=c(0.4,3),main=mtitle,xlab=xlb) > text((min(i)+max(i))/2,2.9,sbtitle,cex=1.4) > abline(v=0,lty=3) > m0<-mean(i[h==0]) > m1<-mean(i[h==1]) > lines(c(m0,m0),c(0.9,1.5))
51
> text(m0+25,0.8,paste(round(m0),"g (Mean)"),cex=1.3) > lines(c(m1,m1),c(0.9+1,1.5+1)) > text(m1+25,0.8+1,paste(round(m1),"g (Mean)"),cex=1.3) > arrows(m0,1.6,m1,1.6,col="red") > text(m1+40,1.6,paste("Difference =",round(m1-m0)," g"),cex=1.3,col="red", + adj=0) > n0<-length(i[h==0]) > n1<-length(i[h==1]) > text(-170,1.2,paste("n =",n0),cex=1.3) > text(-170,1.2+1,paste("n =",n1),cex=1.3) > detach(data)
Prevela Ana Bešlin
4.5. Uređaji (devices)
Kada smo napravili dobar crtež, sledeći korak je da ga sačuvamo u pdf dokumentu. To ćemo
učiniti na ovaj način:
> plot(...) # Započinjemo crtanje sa funkcijom visokog nivoa kao što je plot() > ... # Naredne funkcije nižeg nivoa obogaćuju crtanje # Kada smo završili sa crtanjem: > dev.print(device=pdf, file="filename.pdf" )
52
Sada dokument filename.pdf sadrži isti crtež koji smo videli na ekranu. Ostatak paragrafa objašnjava dalje
načine čuvanja crteža u dokumente.
Crteži se mogu prikazati u prozorima i sačuvati u dokumentima. Reč “uređaj” se odnosi i na
prozore i na dokumenta. Komanda dev.new() otvara novi prozor koji postaje aktivan uređaj. U svakom
trenutku postoji tačno jedan aktivan uređaj (ili ni jedan). Sve grafičke operacije se obavljaju nad aktivnim
uređajem. Komanda plot.new() se koristi da se obriše sav sadržaj aktivnog uređaja (pokreće novi plot).
Ukoliko nema aktivnog uređaja, plot.new() otvara novi prozor koji postaje aktivni uređaj. Sve funkcije za
crtanje visokog nivoa prvo pozivaju plot.new(). Tako da, ukoliko pokušamo prikazati dva grafika sa
funkcijom plot(), drugi grafik će biti upisan preko prvog. Ukoliko želimo videti oba grafika u isto vreme,
pozivamo dev.new() pre pozivanja komande plot() po drugi put. Postoji lista otvorenih uređaja, koja je
kružno numerisana lista. Uređaj sa brojem 1 je uvek “null uređaj”, koji samo čuva mesto. Ukoliko
pokušamo koristiti ovaj uređaj, kreiraćemo novi. Naredna lista komandi nam omogućava da koristimo
ovu listu uređaja.
dev.new(height=7,width=7) Otvara novi prozor koji postaje aktivni uređaj. Osnovna veličina prozora je
kvadrat od 7 inča.
dev.off() Zatvara aktivni uređaj. Naredni uređaj sa liste postaje aktivan.
graphics.off() Zatvara sve otvorene uređaje.
plot.new() Briše sav sadržaj aktivnog uređaja. Ukoliko nema aktivnog uređaja, onda plot.new() otvara
novi prozor koji postaje aktivan uređaj.
dev.set( n ) Postavi uređaj pod brojem n za aktivan uređaj
dev.prev()
dev.cur()
dev.next() Prikaži ime i broj prethodnog/trenutnog/narednog uređaja iz liste uređaja.
dev.list() Prikaži sve otvorene uređaje.
dev.print(device=dev,file="filename" ) Kopira sadržaj aktivnog uređaja u dokument "filename". Tip
dokumenta se deklariše sa device=dev, a može biti pdf, postscript, jpeg, bitmap, pictex, xg, bmp,
png.
dev.copy(device=dev,file="filename" ) Isto kao dev.print(), ali ne zatvara uređaj.
dev.print(which=n ) Kopira sadržaj aktivnog uređaja u uređaj sa liste pod brojem n.
dev.copy2pdf(file="filename.pdf" ) Isto kao dev.copy(device=pdf,le="lename.pdf").
dev.copy2eps(file="filename.eps" ) Kopira sadržaj aktivnog uređaja u eps dokument.
Alternativa kopiranju uređaja u dokument jeste crtanje direktno u dokument. Ovo je takođe korisno pri
pisanju R skripti. Na primer, pdf("fillename.pdf") otvara pdf dokument filename.pdf kao pdf uređaj. Sve
53
grafičke operacije se onda direktno odvijaju nad ovim pdf uređajem. Primetićemo da se pdf dokument
često zatvara samo kada pdf uređaj zatvorimo sa dev.off(). Ovo je lista komandi koja otvara uređaje.
pdf("filename ") Otvara pdf dokument filename kao pdf uređaj. postscript("filename ") Otvara postscript dokument filename kao uređaj. jpeg("filename ") Otvara jpeg dokument filename kao jpeg uređaj. bitmap("filename ") Otvara bitmap dokument filename kao bitmap uređaj. tiff("filename ") Otvara tiff dokument filename kao tiff uređaj. xfig("filename ") Otvara xfig dokument filename kao xfig uređaj.. pictex("filename ") Otvara pictex dokument filename kao pictex uređaj. bmp("filename ") Otvara bmp dokument filename kao bmp uređaj. windows() Na Windows-u: otvara grafički prozor. X11() Na Unix-u/Linux-u: otvara grafički prozor . quartz() Na Mac-u: otvara grafički prozor.
Pravljenje dobrog crteža retko uspeva iz prvog pokušaja. Nažalost, ne postoji način da se vratimo
korak unazad sa komandama za crtanje. Najbolje rešenje je da kucamo komande u script dokument i tek
onda izvršimo skriptu. Alternativa je blagovremeno čuvanje stanja pre nego što nastavimo. Evo i primera.
plot(exp,from=0,to=3) > dev.copy(dev.new) # Sačuvaj trenutno crtež tako što ćeš ga snimiti u novom prozoru X11cairo 3 > text(2,5,"text at wrong position") # Da bi poništili sve komande pri crtanju do prethodnog snimanja, zatvori trenutni # prozor i napravi da je prethodno stanje aktivni prozor. > dev.set(dev.prev()) > dev.copy(dev.new) # Sačuvaj trenutni crtež X11cairo 3 > text(1,10,"text at good position")
4.6. Lista komandi visokog nivoa za crtanje
Korisne komande visokog nivoa za crtanje su izlistane ovde:
54
barplot() Vizualizuje vektor stubičastim grafikonom boxplot() Box and whisker plot contour() Kontura površine je nacrtana u 2D-u. coplot() Conditioning-Plots dotchart() Crta lokacije elemenata vektora na realnoj liniji. hist() Histogram. image() 3d podaci vizualizovani pomoću boja. mosaicplot() Crtež u obliku mozaika. pairs() Daje matricu sa tačkastim dijagramima. persp() 3D crtež površine. pie() Kružni grafik. qqplot() Kvantilno-kvantilni crtež.
> x <- rnorm(50) > dotchart(x) # crte tačke od x > qqnorm(x) # crta uzoračke kvantile od x u odnosu na kvantile # standardne normalne raspodele > qqline(x) # dodaje liniju koja prolazi kroz prvi i treći kvartil
> library(mvtnorm) # višedimenzionalna normalna i t raspodela > x <- seq(from=-2, to=2, by=0.1) > y <- x > z <- matrix(nrow=length(x), ncol=length(y), data=0 )
55
> for ( i in 1:nrow(z) ) for ( j in 1:ncol(z) ) > z[i,j] <- dmvnorm( cbind( x[i], y[j] ) ) > image(x,y,z) > contour(x,y,z)
> persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue") > library(lattice) # lattice obezbeđuje nekoliko funkcija za crtanje visokog nivoa > trellis.device() > wireframe(z,shade=TRUE) # wireframe je u biblioteci lattice
> data(volcano) # Učitajte volcano data, pogledajte ?volcano > wireframe(volcano,shade=TRUE,apsect=c(61/87,0.4),light.source=c(10,0,10))
56
## Sledeći primer koristi cumsum() koja sumira na sledeći način: > cumsum(1:7) # 1 1+2 1+2+3 1+2+3+4 1+2+3+4+5 1+2+3+4+5+6 1+2+3+4+5+6+7 [1] 1 3 6 10 15 21 28 > cumsum(c(5,2,9,3)) # 5 5+2 5+2+9 5+2+9+3 [1] 5 7 16 19 ## Primer koji pokazuje kako se popunjava prostor između krivih. > par(bg="white") > n <- 500 > x <- c(0,cumsum(rnorm(n))) > y <- c(0,cumsum(rnorm(n))) > xx <- c(0:n, n:0) > yy <- c(x, rev(y)) > plot(xx, yy, type="n", xlab="Time", ylab="Distance") > polygon(xx, yy, col="gray") > title("Distance Between Brownian Motions")
Još primera grafičkih mogućnosti R-a se mogu videti sa: > demo(graphics) > demo(image) > demo(persp) > demo(plotmath) Postoji još dosta funkcija visokog nivoa za crtanje u “lattice” biblioteci (barchart bwplot cloud contourplot densityplot dotplot histogram levelplot parallel piechart qq qqmath rfs splom stripplot tmd wireframe xyplot). Ukoliko želimo pregled opcija ovih funkcija, možemo probati sledeću komandu. > demo(lattice)
57
R nema svoj grafički pogon i samim tim nije sposoban da izvršava funkcije poput rotiranja 3D figura. Da budemo precizni, postoje komande rotate.cloud(), rotate.persp() i rotate.wireframe() u biblioteci “TeachingDemos”, ali su one veoma spore.
4.7. Prikazivanje višedimenzionalnih podataka
R pruža dve veoma korisne funkcije za predstavljanje višedimenzionalnih podataka. Ukoliko je x
numerička matrica, ili “data frame”, komanda
> pairs(x)
pravi scatterplot matricu po parovima od promenljivih definisanih u kolonama od x, tj. svaka
kolona od x je nacrtana naspram svake druge kolone od x. Rezultujući crteži su poređani u
matricu .
> rent <- read.table("miete03.asc",header=TRUE) > attach(rent) > pairs(cbind(nm,wfl), labels=c("rent","living space") ) > pairs(cbind(nm,nmqm), labels=c("rent","net rent per square meter"), + panel=panel.smooth )
58
Kada je uključeno tri ili četiri promenljive, “coplot” može biti jasniji. Ukoliko su a i b numerički vektori i
c je numerički vektor ili faktor objekat (svi iste dužine), onda komanda
> coplot(a ~ b | c)
pravi broj scatterplot-ova za a naspram b, za date c. Ukoliko je c faktor, onda ovo znači da je a nacrtan
naspram b za svaki nivo c. Kada je c numeričko, podeljeno je u broj uslovnih intervala I za svaki interval
a je nacrtano naspram b za vrednost c iz intervala. Pogledajte ?coplot za više detalja. Takođe možete
koristiti dve date varijable sa komandom
> coplot(a ~ b | c * d)
koja pravi scatterplot-ove za a naspram b za svaki udruženi interval od c i d. Obe coplot() i pairs()
funkcije uzimaju argument panel= koji se može koristiti za prilagođavanje crteža koji se pojavljuje u
svakom panelu. Osnovna funkcija za pravljenje scatterplot-a je points(), ali dodavanjem još nekih
funkcija nižeg nivoa od dva vektora x i y za vrednost panel=, možemo napraviti bilo kakav crtež. Korisna
funkcija kao primer jeste panel.smooth.
> coplot( nm~wfl | as.factor(rooms) )
> coplot( nm~wfl | as.factor(rooms)*as.factor(badextra), panel=panel.smooth )
59
4.8. Argumenti funkcija višeg nivoa za crtanje
Funkcije višeg nivoa za crtanje uzimaju veliki broj argumenata. Lista argumenata se nalazi na
“help” stranici funkcije par(). Ovu listu ćemo izložiti ispod.
‘add’ Tera funkciju da se ponaša kao grafička funkcija nižeg nivoa, postavljajući crtež na vrh
postojećeg crteža (ne radi pouzdano).
‘adj’ Vrednost ‘adj’ određuje poravnjanje teksta string-ova u ‘text’, ‘mtext’ i ‘title’. Vrednost 0 pravi
levo poravnanje teksta. Vrednost 0,5 (osnovna) centrira tekst, a vrednost 1 pravi desno
poravnjanje. (Svaka vrednost u intervalu od nula do jedan dolazi u obzir) Primetimo da ‘adj’
argument od ‘text’ dozvoljava 'adj = c(x,y)' za različita podešavanja po x i y pravcu. Primetimo
da ‘text’ utiče na poravnanje teksta, dok ‘mtext’ i ‘title’ utiču na položaj teksta na crtežu.
‘ann’ Ukoliko se podesi na ‘FALSE’, funkcija višeg nivoa 'plot.default' ne beleži na crtežima koje pravi
naslove osa ili naslove uopšte. Podrazumevana vrednost je da beleži ove stvari.
‘ask’ Logička. Ukoliko je podešena na ‘TRUE’ ( i R sesija je interaktivna) zahteva se unos od korisnika, pre nego što se nacrta naredna figura. Kao što se odnosi na uređaje, ovo se takođe odnosi I na izlaz po paketima 'grid' i 'lattice'. Može se čak i podesiti za uređaje bez ekrana, ali neće baš imati efekta.
‘bg’ Boja koja se koristi kao pozadina za region uređaja. Kada se poziva iz ‘par()’, takođe podešava ‘new=FALSE’. Za većinu uređaja, osnovna vrednost se podešava iz ‘bg’ parametra tog uređaja, a za ostale, normalno je “white”. Primetimo da grafičke funkcije poput ‘plot.default’ i ‘points’ imaju argument sa ovim imenom, ali različitim značenjem.
‘bty’ String karaktera koji određuje tim ‘kutije’ koja se crta za crteže. Ukoliko je ‘bty’ jedno od “o” (osnovna vrednost), “’I’”, “’7’”, “’c’”. “’u’” ili “’]’“, rezultat je kutija koja podseća na odgovarajuće veliko slovo. Vrednost “’n’“ poništava kutiju.
’cex’ Numerička vrednost koja određuje koliko bi tekst i simboli na crtežu trebali biti uvećanu u ondosu na osnovnu vrednost. Primetimo da grafičje funkcije kao što je ’plot.default’ imaju argument sa istim imenom koji množi onaj grafički parametar, a neke funkcije poput ’points’ prihvataju i vektorske vrednost koje recikliraju. Naredna korišćenja će uzeti samo prvu vrednost, ukoliko je dat vektor veličine veće od 1.
Ovo počinje sa vrenošću “1“ kada je uređaj otvoren, a resetuje se kada je izgled promenjen, tj. podešavanjem ’mflow’.
’cex.axis’ Uveličanje koje se koristi za ose, u odnosu na trenutno podešavanje ’cex’-a. ’cex.lab’ Uvećanje koje se koristi za x i y labele u odnosu na trenutno podešavanje ’cex’-a. ’cex.main’ Uvećanje koje se koristi za glavne naslove u odnosu na trenutno podešavanje ’cex’-a. ’cex.sub’ Uvećanje koje se koristi za podnaslove u odnosu na trenutno podešavanje ’cex’-a. ’cin’ Veličina karaktera (širina i visina) u inčima. Ovo su iste mere kao i u ’cra’, samo izražene drugim
jedinicama. ’col’ Specifikacija za osnovnu boju crtanja. Za listu dostupnih boja, pogledati ?clours() ili ?colors().
(Neke funkcije kao što je ’lines’ prihvata vektor vrednosti koje se recikliraju. Naredna korištenja uzimaju prvu vrednost ukoliko je dat vektor veličine veće od 1.)
’col.axis’ Boja koja se koristi za nazive osa. Osnovna vrednost je “black“. ’col.lab’ Boja koja se koristi za x i y labele. Osnovna vrednost je “black“. ’col.main’ Boja koja se koristi za glavne naslove. Osnovna vrednost je “black“. ’col.sub’ Boja koja se koristi za podnaslove. Osnovna vrednost je “black“.
60
’cra’ Veličina osnovnog karaktera ( širina, visina ) u rasterskoj vrednosti ( pikselima ). Neki uređa ju nemaju koncept piksela, tako da uzimaju proizvoljnu vrednost za veličinu piksela, uglavnom 1/72 inčca. Ovo je ista vrednosta kao i ’cin’, samo u izražena drugim jedinicama.
’crt’ Numerička vrednost koja određuje (u stepenima) koliko bi se trebalo pojed ini karakteri rotirati. Nije mudro očekivati da će vrednosti osim umnožaka od 90 stepeni da rade. Poredimo ga sa ’srt’ koji rotira stringove.
’csi’ Veličina karaktera u inčima. Isto kao za ’part(“cin“). ’cxy’ Veličina osnovnog karaktera ( širina, visina ) koji se koristi u koordinatnim jedinicama.
’par(“cxy“) je ’par(“cin”)/par(“pin”)’ skalirano na koordinate korisnika. Primetimo da ’c(strwidth(ch),strheight(ch))’ za dati string ’ch’ je obično više precizno.
’din’ Dimenzije uređaka, ( širina, visina ) u inčima. ’err’ ( Nije implementirana. R se ne oglašava kada se tačke van regiona crtanja crtaju) Količina prijave
grešaka koju želimo. ’family’ Ime familije fonta za crtanje teksta. Najveća dozvoljena dužina je 200 bajtova. Ovo ime se
mapira za svaki grafički uređaj na opis fonta specifičan uređaju. Osnovna vrednost je “’’”, što znači da će se koristiti font koji je osnovno podešen ( Koji je to font bi trebalo da bude izlistano na help stranici uređaja). Standardne vrednosti su “serif”, “sans” i “mono”, a Hershey porodice fontova su takođe dostupne. ( Neki uređaju mogu definisati druge, a neki će kompletno ignorisati ovo podešavanje). Ovo se može specificirati u liniji za ’text’.
’fg’ Boja koja se koristi za ’foreground’ crteža. Ovo je osnovna boja koja se koristi za stvari kao što su ose i kutije oko crteža. Kada se poziva iz ’par()’, ovo takođe podešava parametar ’col’ na istu vrednost. Poneki uređaji imaju argument koji podešava početnu vrednost, koja je u suprotnom “black”.
’fig’ Numerički vektor forme ’c(x1,x2,y1,y2)’ koji daje (NDC) koordinate regije figure koja se prikazuje na regionu uređaja. Ukoliko podesimo ovaj parametar, za razliku od S, pravimo novi crtež, tako da bi dodali na već postojaći koristimo ’new=TRUE’ takođe.
’fin’ Dimenzije regije figure, ( širina, visina ) u inčima. Ukoliko podesimo ovaj parametar, za razliku od S, pravimo novi crtež.
’font’ Celobrojna vrednost koja određuje koji font se koristi za tekst. Ukoliko je moguće, drajveri uređaja podešavaju tako da vrednost 1 odgovara za običan tekst (osnovna), 2 za podebljano, 3 za nakrivljeno, a 4 za podebljano i nakrivljeno. Takođe, font 5 se očekuje da bude simbol font, u Adobe “symbol encoding“. Na nekim uređajima, familije fonta se mogu birati sa ’family’ da bi se odabrao različit set od 5 fontova.
’font.axis’ Font koji se bira za naziv osa. ’font.lab’ Font koji se bira za x i y labele. ’font.main’ Font koji se koristi za glavne naslove. ’font.sub’ Font koji se koristi za podnaslove. ’lab’ Numerički vektor forme ’c(x,y,len)’ koji modifikuje osnovni način na koji su ose obeležene.
Vrednosti ’x’ i ’y’ daju ( procenjen ) broj podeoka na x i y osama, a ’len’ daje dužinu labele. Osnovna vrednost je ’c(5,5,7)’. Primetimo da ovo utiče samo na način na koji se parametri ’xaxp’ i ’yaxp’ podešavaju kada se korisnički koordinatni sistem postavlja, a ne koristi se kada se crtaju ose. ’len’ nije implementirano u R-u.
’las’ Nemrička vrednost, može biti 0,1,2,3. Stil labela ose. 0: Uvek paralelna osi (osnovna). 1: Uvek horizontalna. 2 Uvek normalna na osu. 3 Uvek vertikalna. Takođe podržano od ’mtext’. Primetimo da druge string/karakter rotacije (od argumenata ’srt’ do
’par’) ne utiču na labele osa. ’lend’ Stil kraja linije. Ovo se može odrediti kao celobrojna vrednost ili string: ’0’ ili “round“ znači obli krajevi linije ( osnovna vrednost ).
61
’1’ ili “butt“ zbači ’butt’ krajevi linije. ’2’ ili “square” daje kvadratne krajeve linija. ‘lheight’ Umnožak visine linije. Visina linije teksta ( koristi se za vertikalni razmak između teksta koji
poseduje više linija ) se pronalazi množeći visinu karaktera sa trenutnom ekspanzijom karaktera is a umnoškom visine linije. Osnovna vrednost je 1. Koristi se u ‘text’ i ‘strheight’.
‘ljoin’ Stil koji se koristi pri spajanju linija. Ovo se može specifikovati kao celobrojna vrednost ili string. ‘0’ ili “round” znači obla oznaka spajanja linija (osnovna). ‘1’ ili “mitre” znači “mitred” oznaka spajanja linija. ‘2’ ili “bevel” znači “beveled” oznaka spajanja linija. ’lmitre’ Ovo kontroliše kada se ’mitred’ spojevi linija automatski konvertuju u ’bevelled’ spojeve linija.
Vrednost mora biti veća od 1, a osnovna vrednost je 10. Ovo podešavanje neće poštovati svi uređaji.
’lty’ Tip linije. Tip se može odabrati celobrojnom vrednošću (0=blank, 1=solid (default), 2=dashed, 3=dotted, 4=dotdash, 5=longdash, 6=twodash) ili sa stringom ('"blank"', '"solid"',
'"dashed"' , '"dotted"', '"dotdash"', '"longdash"' , or '"twodash"'). “Blank” pravi “nevidljive” linije, tj. ne crta ih. Takođe možemo proslediti string sa do 8 karaktera, koji daje veličinu linijskih segmenata koji se alternativno crtaju i preskaču.Neke funkcije kao što je ‘lines’ prihvataju vektor vrednosti koje posle recikliraju. Naredna korišćenja će uzimati prvu vrednost, ukoliko je dati vektor duži od 1.
’lwd’ Širina linije, pozitivan broj, osnovna vrednost je ’1’. Interpretacija ove komande zavisi od uređaja i neki uređaju ne prihvataju linije sa širinom manjom od 1. Neke funkcije kao što je ‘lines’ prihvataju vektor vrednosti koje posle recikliraju. Naredna korišćenja će uzimati prvu vrednost, ukoliko je dati vektor duži od 1.
‘mai’ Numerički vektor forme ‘c(dno, levo, vrh, desno)’ koji daje veličinu margina u inčima. ‘main’ Figura naslova, postavlja se na vrhu crteža velikim fontom. ‘mar’ Numerički vektor forme ‘c(dno, levo, vrh, desno)’ koji daje broj margina koje treba iscrtati sa
svake strane crteža. Osnovna vrednost je ‘c(5, 4 ,4 ,2)+ 0.1’. ‘mex’ Faktor ekspanzije veličine karaktera koji se koristi da opiše coordinate u marginama crteža. On ne
menja veličinu fonta, već povećava font. ‘mfcol’ ‘mfrow’ Vektor forme ‘c(nr, nc)0. Svaka sledeća figura će biti nacrtana u ‘nr’ od ’nc’ nizu na
uređaju po kolonama (‘mfcol’) ili redovima (‘mfrow’). U rasporedu gde ima tačno dva reda i kolone, bazna vrednost od “cex” je smanjena za factor od 0.83. Ukoliko imamo tri ili vise kolona ili redova, factor je 0.66. Podešavanjem resporeda resetujemo osnovnu vrednost ‘cex’-a i ‘mex’-a na ‘1’. Upitivanje nam neće reći kojim redom će niz biti ispunjen. Alternative su ‘layout’ i ‘split.screen’.
‘mfg’ Numerički vektor forme ‘c(i, j)’, gde ‘i’ i ‘j’ pokazuju koja od figura u nizu figura se bira sledeća. Niz mora biti već postavljen od strane ‘mfcol’ ili ‘mfrow’. Zbog kompatibilnosti sa S-om, forma ‘c( i, j, nr, nc)’ je takođe prihvatljiva, gde su ‘nr’ i ‘nc’ trenutni broj redova i kolona. Promašaji će biti ignorisani uz upozorenje.
‘mgp’ Linija margine za naslov ose, labelu ose i liniju ose. Primetimo da ‘mgp[1]’ utiče na naslov, dok ’mgp[2:3]’ utiče na ose. Osnovna vrednost je ’c(3, 1, 0)’.
’new’ Ukoliko je podesimo na ’TRUE’, sledeća komanda za crtanje visokog nivoa neće obrisati okvir pre crtanja, kao da crta na “novom“ uređaju. Greška je pokušati koristiti ’new=TRUE’ na uređaju koji trenutno nema crtež višeg nivoa ( ignoristano uz upozorenje ).
’oma’ Vektor forme ’c( dno, levo, vrh, desno)’ koji daje veličinu spoljašnjih margina u linijama teksta. ’omd’ Vektor forme ’c( x1, x2, y1, y2 )’ dajući region unutar spoljašnjih margina u NDC (
normalizovane koordinate uređaja ), th. kao deo ( u [0,1] ) regiona uređaja.
62
’omi’ Vektor forme ’c( dno, levo, vrh, desno)’ koji daje veličinu spoljašnjih margina u inčima. ’pch’ Ili je celobrojna vrednmost koja određuje neki simbol ili pojedini karakter koji se treba koristiti
kao osnovna vrednost za crtanje tačaka. Primetimo da samo celobrojne vrednosti i pojedinačni karakteri mogu biti dati kao grafički parametri ( a ne i ’NA’ ili ’NULL’).
’pin’ Trenutne dimenzije crteža. ’( širina, dužina)’ u inčima. ’plt’ Vektor forme ’c( x1, x2, y1, y2)’ koji daje koordinate regiona crteža kao delove trenutne regije
figure. ’ps’ Celobrojna vrednsot, veličina tačaka teksta. Ne menja odnos između ’mar’ i ’mai’. (ili ’oma’ i
’omi’). Na šta se tačno misli pod ’point size’ zavisi od uređaja, ali uglavnom je to više 1bp, što je 1/72 inča.
’pty’ Karakter koji određuje tip regiona crteža koji se koristi. “S“ generiše kvadratni region za crtanje, a “m“ generiše maksimalni region za crtanje.
’smo’ ( Nije implementirano. ) Vrednost koja ukazuje na to koliko obli bi krugovi i kružne krive trebale biti.
’srt’ Rotacija stringa u stepenima. Podržano samo od strane ’text’. ’sub’ Podnaslov, postavlja se ispod x-ose manjim fontom. ’tck’ Dužina podeoka kao deo manjeg dela širine ili vise od regiona crtanja. Ako je tck >= 0.5
interpretira se kao deo relevantne strane, tako da ako je tck = 1, linije mreže se crtaju. Osnovno podešavanje (tck= NA) je da se koristi tcl= -0.5.
’tcl’ Dužina podeoka kao deo od visine linija teksta. Osnovna vrednost je ’-0.5’. Podešavanjem ’tcl= NA’ postavlja ’tck = -0.01’ sto je osnova u S-u.
’type’ type= argumnt kontroliše tip crteža koje se pravi, kao: type=“P“ Crta zasebne tačke (osnovno) type=“l“ Crta linije type“b“ Crta tačke spojene linijama type“o“ Crta tačke prekrivene linijama type“h“ Crta vertikalne linije od tačaka do nule na osi. type“s“ type“S“ U prvoj form, gornji deo vertikale definiše tačku. U drugoj, donji deo. type“n“ Nema crtanja. Ose se svakako crtaju i koordinatni sistem se postavlja u odnosu na podatke. Idealno za pravljenej crteža sa rednim grafičkim funkcijama nižeg nivoa. ’usr’ Vektor forme ’c( x1, x2, y1, y2)’ koji daje ekstreme od korisničkog koordinatnog sistema regije
crtanja. Kada se logaritamska skala koristi, onda je x-ograničenje 10^par(“usr“)[1:2]. Slično za y-osu.
’xaxp’ Vektor forme ’c(x1, x2, n)’ koji daje koordinate ekstrema podeoka i broj intervala između njih kada je par(“xlog“) netačno. U suportnom, kada su log koordinate aktivne, tri vrednosti imaju drugačije značenje: Za manji opseg, ’n’ je negativno, a podeoci su kao u linearnom slučaju, u suprotnom, ’n’ je u ’1:3’, sto ukazuje na ’’case number’’, a ’x1’ i ’x2’ su najmanja i najveća moć od 10 unutar korisnikovih koordinata, 10^par’’usr’’)[1:2]. ( ’’usr’’ koordinate su log10-transformisane ovde!)
n=1 će praviti podeoka na 10^j za ceo broj j. n=2 daje podeoke k 10^j sa vrednošću za ka 1,5. n=3 daje podeoke k 10^j sa vrednošću za ka 1,2,5. Ovaj parametar se resetuje kada se postave korisnički koordinatni sistem, postavljanjem nove
stranice na primer ili pozivnom ’plot.window’ ili podešavanjem ’par(’’usr’’):’n’ je uzeto iz ’par(’’lab’’)’. Utiče na osnovno ponašanje rednih poziva ’axis’ za strane 1 ili 3.
’xaxs’ Stil proračuna intervala ose koji se treba koristiti za x-osu. Moguće vrednosti su ’’r’’, ’’i’’, ’’e’’, ’’s’’, ’’d’’. Stilovi su generalno kontrolisani opsegom podataka ili sa ’xlim’, ukoliko je dato.
Stil ’’r’’ (regular) prvo povećava opseg podataka za 4% ka svakom kraju i onda pronalaza osu sa labelama koja odgovara proširenom opsegu. Stil ’’i’’ (internal) samo pronalazi osu sa labelom
63
koja odgovara originalnom opsegu podataka. Stil ’’s’’ (standard) pronalazi osu sa labelom unutar originalnog opsega podataka. Stil ’’e’’ (extended) je kao stil ’’s’’, samo što takođe obezbeđuje mesto za crtanje simbola unutar okvirujuće kutije. Stil ’’d’’ (direct) određuje da trenutna osa treba da se koristi za naredne crteže. ( Samo ’’r’’ i ’’i’’ stilovi su trenutno implementirani)
’xaxt’ Karakter koji određuje tip x ose. Argument ’’n’’ ponišstava crtanje ose. Standardna vrednost je ’’s’’: zbog kompatibilnosti sa S-om, vrednosti ’’l’’ i ’’t’’ su prihvatljive, ali su isto što i ’’s’’. Svaka vrednost sem ’’n’’ implicira crtanje.
’xlab’ Labela ose za x-osu. ’xlog’ Logička vrednost. Ukoliko je ’TRUE’, logaritmička skala se koristi. Za nov uređaj, osnovna
vrednost je ’FALSE’, tj. linearna skala. ’xpd’ Logička vrednost ili ’NA’. Ukoliko je ’FALSE’,svo crtanje je skraćeno na region crtanje, a
ukoliko je ’TRUE’, svo crtanje je skraćeno na region figur. Ukoliko je ’NA’, svo crtanje je skraćeno na region uređaja.
’yaxp’ Vektor formata ’c( y1, y2, n )’ koji daje koordinate ekstrema podeoka i broj intervala između njih, osim za logaritamske koordinate. Pogledati ’xaxp’ iznad.
’yaxs’ Stil proračuna intervala za osu koji se koristi na y-osi. Pogledati ’yaxs’ iznad. ’yaxt’ Karakter koji određuje tip y ose. Ukoliko je data vrednost’’n’’, neće se crtati. ’ylab’ Labela ose za y-osu. ’ylog’ Logička vrednost. Pogledati ’xlog’ iznad.
5. Neki statistički testovi
5.1 Teorija statističkih testova
Želite da podržite hipotezu (npr. lekovi imaju efekat)
Pretpostavimo da su sva merenja slučajna, neki pesimista bi mogao da tvrdi da je
značenje podataka čista slučajnost ( „da se svih 20 pacijenata oporavi može se dogoditi
slučajno“ )
Kako bi se osporio pesimista, pretpostavimo da je u pravu i pokazujemo da je malo
verovatno da su posmatrani podaci slučajni.
U statističkom jeziku, mišljenje pesimiste se naziva nulta hipoteza koja obično tvrdi
„posmatranje zbog slučajnosti“, i formulisana je precizno za svaki test, npr.
H0: lekovi imaju isti efekat kao i placebo
Postupak statističkog testa:
Formulisanje nulte hipoteze, npr. H0: lekovi imaju isti efekat kao i placebo
Pokazuje se da je realizovani uzorak dovoljno neverovatan pod pretpostavkom nulte
hipoteze. Naučnici se slažu da je dovoljna verovatnoća od najviše 5%.
Ovo osporava pesimistu. Statističkim jezikom: Odbacujemo nultu hipotezu na nivou
značajnosti 5%.
64
Verovatnoća realizovanog uzorka pod pre tpostavkom nulte hipoteze se naziva p-vrednost.
Formalo:
p-vrednost = P(realizovani uzorak | H0 je tačna).
Dakle, p-vrednost od 2%, nam pokazuje da ako je pesimista u pravu, onda se u samo 2 od 100
eksperimenata rezultuje takav uzorak. Treba imati na umu da nismo osporili pesimistu. Nulta
hipoteza bi ipak mogla biti istinita. Međutim, ako je nulta hipoteza tačna, onda je malo verovatno
dobiti takav uzorak.
Ako je p-vrednost iznad nivoa značajnosti, recimo 8%, onda ne možemo odbaciti nultu hipotezu
na nivou 5%. Naravno, ovo nikako ne pokazuje da je nulta hipoteza tačna. Nemati mogućnost da
odbacimo nultu hipotezu je isto što i biti neodlučan, nemati mišljenje.
Sledeća dva poglavlja će nam dati dva važna statistička testa.
5.2 Test razlika između sredina: t-test
Šta je dato? Nezavisni uzorci (x1,…, xn) i (y1,…,ym).
Nulta hipoteza: x i y su uzorci iz raspodela koji imaju istu sredinu.
Test: t-test
R komanda: t.test( x, y )
Ideja testa: Ako se dve uzoračke sredine puno razlikuju odbacuje se nulta hipoteza.
t-test je aproksimativni test, test statistika je samo približno t-distribuirana. Srećom, ovaj test je
prilično jak. Takođe, radi prilično dobro i za male uzorke. Jedino je osetljiv na narušavanje
nezavisnosti. Prema tome, treba biti pažljiv u slučaju ako su uzorci zavisni.
Primer. U suprotnosti sa opštim mišljenjem je da ne postoje samo zeleni marsovci, već i plavi i
crveni marsovci. U fajlu 'mars.txt' se nalazi visina (u cm), kao i boja sva 42 marsovca koji su
pronađeni u poslednjih 50 godina. Želimo da testiramo hipotezu da je visina zelenih marsovaca
različita od prosečne visine plavih marsovaca.
> mars <- read.table("mars.txt",header=TRUE)
> head(mars) Size color
1 65.67974 red 2 65.90436 red
3 67.34730 red 4 60.42924 red
5 55.34526 red
6 62.85024 red > attach(mars)
> t.test(size[color=="green"],size[color=="blue"])
Two Sample t-test
65
data: size[color == "green"] and size[color == "blue"] t = -3.4244, df = 19.419, p-value = 0.002775
alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval:
-16.875514 -4.083647 sample estimates:
mean of x mean of y 60.86840 71.34798
Odgovor: Odbacujemo nultu hipotezu da su prosečne visine zelenih i plavih marsovaca jednake
(na nivou značajnosti od 5%). Ovde smo upotrebili neuparen t-test jer su ova dva uzorka
nezavisna.
Sada ćemo dati jedan primer uparenog t-testa. Dati su nam podaci o habanju cipela od materijala
A i B (svaka na jednom stopalu) od deset dečaka. Dva uzorka su sada korelisana kako je dečak
nosio odgovarajuću obuću. Neki dečaci su uzrokovali veće habanje, a neki manje. Dakle,
moramo primeniti uparen t-test.
> data(shoes,package='MASS') > attach(shoes)
> head(shoes) $A
[1] 13.2 8.2 10.9 14.3 10.7 6.6 9.5 10.8 8.8 13.3 $B
[1] 14.0 8.8 11.2 14.2 11.8 6.4 9.8 11.3 9.3 13.6 > t.test(A,B,paired=TRUE) Paired t-test data: A and B t = -3.3489, df = 9, p-value = 0.008539 alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval: -0.6869539 -0.1330461
sample estimates: mean of the differences
-0.41 Odgovor: Odbacujemo nultu hipotezu da su materijali A i B jednako dobri (u proseku), na nivou značajnosti 5%.
5.3 Test zavisnosti
66
U zavisnosti od vrste promenljive odlučujemo koji test da koristimo:
promenljive koje imaju nominalnu vrednost (nema poretka, npr. boja očiju ili pol)
promenljive koje imaju diskretne vrednosti (vrednosti su u poretku npr. ishod bacanja kockice, starost u godinama iz skupa prirodnih brojeva)
promenljive koje imaju kontinualne (neprekidne) vrednosti (bilo koja vrednost iz nekog intervala je moguća, npr. visina ).
5.3.1. Nominalne promenljive
Neka su zapažanja data u parovima (X1, Y1),…, (Xn,Yn). Dobijeni podaci su dati u tabeli kontigencije. Npr. X –boja očiju, a Y- boja kose.
X\Y plava braon crna ukupno
plava 47 42 8 97
braon 3 60 33 96
zelena 8 15 3 26
ukupno 58 117 44 219
Šta je dato? relizovani uzorak je dat u parovima (x1,y1), (x2,y2),..., (xn,yn)
Nulta hipoteza: x i y su nezavisne
Test: χ2 – test za nezavisnost
R komanda: chisq.test( x, y ) ili chisq.test( contingency.table )
Ideja testa: Izračunavaju se očekivane učestalosti pod pretpostavkom o nezavisnosti. Ako dobijene vrednosti previše odtupaju od očekivanih, onda odbacujemo nultu hipotezu. χ2 – test za nezavisnost je aproksimativan test, test statistika je samo približno χ2 distribuirana.
Ovaj test se može primeniti samo ako je zadovoljen sledeći uslov: Neka su podaci koji u tabeli kontigencije. Neka je .= sume vrsta, =
sume kolona i = ukupna suma. Tada su očekivana učestalosti =
.
Pravilo za χ2 – test: Sve očekivane učestalosti treba da budu veće od 1 i 80% njih treba da budu veće od 5.
Primer:
> contingency <- matrix( c(47,3,8,42,60,15,8,33,3), nrow=3 ) > chisq.test(contingency)$expected
[,1] [,2] [,3] [1,] 25.689498 51.82192 19.488584
[2,] 25.424658 51.28767 19.287671
67
[3,] 6.885845 13.89041 5.223744
# expected abundances are all above 5, so we may apply the test > chisq.test(contingency)
Pearson's Chi-squared test
data: contingency
X-squared = 58.5349, df = 4, p-value = 5.892e-12
Odgovor: Odbacujemo nultu hipotezu da su boja očiju i boja kose nezavisne varijable (na nivou
značajnosti od 5%). U specijalnom slučaju 2x2 tabela, nije potrebno koristiti χ2 aproksimaciju, već tada koristimo
Fisher-ov test.
Šta je dato? realizovani uzorak u parovima (x1,y1), (x2,y2),..., (xn,yn); dve kategorije obe za x i y Nulta hipoteza: x i y su nezavisne
Test: Fisher–ov test za nezavisnost R komanda: fisher.test( x, y ) ili fisher.test( contingency.table)
Primer: Rosen i Jerdee (Influence of sex role stereotype on personnel decisions, J. Appl.
Psych 59, 9-14, 1974) su dali učesnicima kursa za menadžment da pogledaju lične fajlove i pustili ih da odluče da li da unaprede osobu ili ne. Lični fajlovi su bili identični osim pola (24
ženski, 24 muški). Rezultat je bio Ženski pol Muški pol
Unapređenje 14 21
Nema unapređenja 10 3
> table <- matrix( c(14,10,21,3), nrow=2 ) > fisher.test(table)
Fisher's Exact Test for Count Data
data: table p-value = 0.04899 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval:
0.03105031 0.99446037 sample estimates: odds ratio
0.2069884
68
Odgovor: Odbacujemo nultu hipotezu da su pol osobe i odluka o unapređenju nezavisne (nivo značajnosti 5%).
5.3.2 Neprekidne promenljive
Ovde pretpostavljamo da promenljive, teoretski, mogu uzeti sve vrednosti nekog intervala.
Šta je dato? Realizovan uzorak u parovima (x1,y1), (x2,y2),..., (xn,yn); sve vrednosti iz nekog
intervala su moguće
Nulta hipoteza: x i y su nezavisne
Test: Pearson-ov test korelacije za nezavisnost
Pretpostavka: x i y su uzorci sa normalnom raspodelom
R komanda: cor.test( x, y )
Primer: Dužina puta potrebna za zaustavljanje (u stopama) iz određene brzine (u miljama po
satu, mph):
> data(cars) # cars is a dataset in the library 'datasets', see ?cars > attach(cars)
> str(cars) > ?cars
> plot(speed,dist) > cor.test(speed, dist) Pearson's product-moment correlation data: speed and dist t = 9.464, df = 48, p-value = 1.49e-12 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.6816422 0.8862036
sample estimates: cor 0.8068949
Odgovor: Odbacujemo nultu hipotezu da su speed i dist nezavisne (nivo značajnosti 5%).
5.3.3 Ordinalne (diskretne) promenljive
Pretpostavljamo da se dobijena posmatranja mogu poređati. Posebno pretpostavljamo da nema
(bar ne puno) ponovljenih vrednosti.
69
Šta je dato? Realizovan uzorak u parovima (x1,y1), (x2,y2),..., (xn,yn); vrednosti se mogu poređati
Nulta hipoteza: x i y su nekorelisane
Test: Spearman-ova rangirana korelacija ρ
R komanda: cor.test( x, y, method="spearman")
Primer: Dužina puta potrebna za zaustavljanje (u stopama) iz određene brzine (u miljama po
satu, mph):
> attach(cars) > cor.test(speed, dist, method="spearman") Spearman's rank correlation rho data: speed and dist S = 3532.819, p-value = 8.825e-14 alternative hypothesis: true rho is not equal to 0
sample estimates: rho 0.8303568 Warnmeldung: In cor.test.default(speed, dist, method = "spearman") :
Kann exakte p-Werte bei Bindungen nicht berechnen
Odgovor: Odbacujemo nultu hipotezu da su speed i dist nekorelisane (nivo značajnosti 5%).
5.4 Moć testa
Alternativna hipoteza u odnosu na nultu hipotezu je alternativa (oznaka H1). Ono što želite da
pokažete treba da bude deo alternative.
Primer:
H0: µ=0
H1: µ≠0
Postoje dve moguće greške:
„greška prve vrste“, „α greška“ ili „lažno pozitivna“: greška odbacivanja nulte hipoteze
kada je ona zapravo tačna. Primer: test pokazuje trudnoću iako žena nije trudna.
„greška druge vrste“, „β greška“ ili „lažno negativna“: greška neodbacivanja nulte
hipoteze kad ona nije tačna. Primer: test ne pokazuje trudnoću iako je žena trudna.
H0 je tačna H1 je tačna
H0 nije odbačena ispravno greška druge vrste
H0 je odbačena greška prve vrste ispravno
70
Ako je β verovatnoća greške druge vrste, onda je moć testa definisana sa 1-β. Ako je moć testa 0,
onda nulta hipoteza nikad neće biti odbačena čak i ako je alternativna tačna. Kako želimo da
odbacimo nultu hipotezu, preferiraćemo moć testa blizu 1. Za ovo, alternativa H1: µ≠0 je loša.
Problem je taj da ako je prava vrednost µ veoma blizu 0, tada test nema šansu da prikaže razliku
od 0. Umesto ove alternative, trebalo bi koristiti H1 : |µ| ≥ 0.5.
Generalno, moć testa se povećava sa porastom obima uzorka. Postoje funkcije, npr.
power.t.test() ili power.fisher.test() koje izračunavaju minimalnu veličinu uzorka potrebnu da se
postigne data moć testa.
5.5 Lista statističkih testova u R-u Test R komanda Opis
t-test t.test() Da li su tačne sredine dva uzorka različite?
F-test aov() Da li su tačne sredine više uzoraka različite?
(balansirani dizajn)
Hi-kvadrat test chisq.test() Test nezavisnosti uparenih uzoraka (broji podatke)
Fisher-ov test fisher.test() Test nezavisnosti uparenih uzoraka (broji podatke)
Spearman-ovo ,
Kendall-ovo cor.test() Test nezavisnosti uparenih uzoraka
Wilcoxon, Mann-Whitney wilcox.test() Da li je parametar lokacije isti u obe grupe?
Kruskal-Wallis-ov test sume rangova
kruskal.test() Da li je parametar lokacije isti u svim grupama?
Shapiro-Wilk test normalnosti
shapiro.test() Da li je uzorak dobijen iz normalne raspodele?
Kolmogorov-Smirnov test ks.test() Da li su dva uzorka dobijena iz iste raspodele?
Quade-ov test quade.test() Da li je parametar lokacije isti u svim grupama?(blok dizajn)
Friedman-ov test friedman.test() Da li je parametar lokacije isti u svim
grupama?(blok dizajn)
Tačan binomni test binom.test() Tačan test za verovatnoću uspeha za Bernulijev eksperiment
Test disperzija var.test() Test homogenosti disperzija između dve grupe
Bartelett-ov test bartlett.test() Test homogenosti disperzija među grupama
Fligner-Killeen-ov test fligner.test() Test homogenosti disperzija među grupama
Levene-ov test levene.test() Test homogenosti disperzija među grupama
Test jednakih proporcija prop.test() Da li su verovatnoće uspeha jednake u nekoliko grupa?
Kendall-ovo ,
Spearman-ovo cor.test() Test nezavisnosti među uparenim uzorcima
Box-Pierce, Ljung-Box Box.test() Test nezavisnosti u vremenskim serijama
Cochran-Mantel-Hanszel- mantelhaen.tes Da li su (nominalne) promenljive uslovno
71
ov test t() nezavisne u svakom sloju?
Mood-ov test skaliranja mood.test() Dvouzorački test za različitost u parametrima skale
Ansari-Bradley-jev test ansari.test() Test za različitost u parametrima skale
McNemar-ov Hi-kvadrat
test mcnemar.test() Test za simetriju vrsta i kolona u
dvodimenzionalnoj tabeli kontigencije
Mauchly- jev test sfernosti mauchly.test() Da li je Wishart-distribuirana kovarijansa matrica proporcionalna datoj matrici?
Poisson-ov test poisson.test() Test za parametar stope u Poasonovoj raspodeli
5.6 Stepeni slobode Izraz stepeni slobode se javlja s vremena na vreme. Kako je taj koncept često nepoznat, ukratko
ćemo ga objasniti. Pretpostavimo da možemo da biramo između pet vrednosti x1, x2, x3, x4, x5.
Tada je naš stepen slobode jednak 5. Slično, postoji pet stepeni slobode u vektoru:
x < -c(x1, x2, x3, x4, x5).
Sada uzmimo u obzir vektor
v < -x – E(x) = c(x1, x2, x3, x4, x5) – x.
U ovom slučaju možemo slobodno da izaberemo v1, v2, v3, v4. Međutim, vrednost za v5 je
fiksirana. Već znamo da je očekivanje od v jednako v = 0. Sledi da je peti element vektora v
određen preko v1+v2 +v3+ v4+v5 = 0.
Uopšteno, ako je x vektor dužine n, tada ima n-1 stepen slobode u vektoru x – x. Još jedna
činjenica koja ide u prilog ovome je da postoji jedan ocenjen parametar preko x, a to je naime x.
To umanjuje stepene slobode za jedan. Stoga, preostaje n-1 stepena slobode. Uopštenije,
predstavićemo formalnu definiciju stepena slobode:
broj stepeni slobode uzorka =
veličina uzorka – broj ocenjenih parametara iz uzorka
72
LINEARNA REGRESIJA
7.1. Uvod
Linearna regresija predstavlja proces pronalaženja prave koja najbolje aproksimira podatke.
Pretpostavimo da imamo dve promenljive x i y sa decimalnim vrednostima (npr. visina, težina,
zapremina ili temperatura), gde je y zavisna promenljiva koja zavisi od x.
Pretpostavimo da je ova zavisnost linearna
gde se parametar zove odsečak, a b nagib.
Razmotrimo sledeće fitovane podatke. Uzmimo da je x broj merenja, a y izmereni rast.
> x <-0:8
> y <- c(12, 10, 8 , 11, 6, 7, 2, 3, 3)
> plot (x,y)
Tačke su prikazane na levoj slici:
Linearnu regresiju pravimo tako što tražimo pravu koja najbolje aproksimira date podatke.
Vidimo da vrednosti promenljive y opadaju između 12 i 2, dok vrednosti promenljive x rastu
između 0 i 8. Kada je x = 0, imamo da je y = 12, pa je odsečak = 12. Kako je ∆y = -10, a ∆x = 8
nagib je u našem slučaju
73
= -
= -1.25.
Linearna funkcija sa ovako zadatim parametrima ima sledeći oblik:
i prikazana je na slici gore desno.
Naš cilj je sada, da u R-u nađemo model funkciju y koja zavisi od x. Pomenutu vezu između x i y
kratko zapisujemo kao y ~ x. Uzimajući u obzir da mi želimo da nađemo linearnu vezu ove dve
promenljive, u R-u koristimo komandu lm( ). Primetimo da je lm skraćena oznaka za linear
model.
> lm (y~x)
Call:
lm( formula = y~x)
Coefficients:
( Intercept) x
11.576 -1.217
Pa dobijamo da je prava koja najbolje aproksimira naše podatke data sa
.
Objekat vraćen sa lm() je veoma detaljna lista. Između ostalog, vraća nam vektor koeficijenata
dužine 2, čija je prva komponenta odsečak, a druga nagib tražene funkcije.
> regr.obj <- lm(y~x)
> cat( "The intercept is",regr.obj$coefficient[1],"and the slope is",
+ regr.obj$coefficient[2],"\n")
The intercept is 11.75556 and the slope is -1.216667
Komanda coef() takođe vraća koeficijente. Na primer coef(regr.obj) je isto što i
regr.obj$coefficient.
74
7.2. Pozadina
Još uvek nismo definisali šta znači "najbolja aproksimacija". Najbolja aproksimacija ili najbolje
fitovanje, je model kod kog su sume kvadrata grešaka minimizirane. Formalno, to su vrednosti
( , ) koje minimiziraju
Treba još da znamo, da li i koliko dobro linearni model aproksimira unete podatke, a odgovor
dobijamo analizom varijanse ili preciznije iz sume kvadrata
elemenata vektora y.
Linearni model nam ipak ne daje sve o SSY, ostaju nam greške. Razlika između svake tačke i
predviđene vrednosti modela za istu vrednost x se zove rezidual. Slika koju vidimo ispod,
prikazuje reziduale naših podataka. Koristimo R-komandu predict(), koja računa vrednosti
regresijske linije u tačkama x.
> fitted <- predict(regr.obj)
> plot(x,y)
> abline(regr.obj)
> for( i in 1:9 ){ lines( c(x[i],x[i]),c(y[i],fitted[i]) ) }.
Linearni model ne objašnjava sumu kvadrata reziduala
gde je a odsečak, a b koeficijent nagiba. Objašnjena varijacija je regresijska suma kvadrata
75
SSR < - SSY – SSE.
Možemo pokazati i da je SSR =
gde su
SSXY = (n-1) * cov(x,y)
SSX = (n-1) * var(x).
Mera fitovanja je vrednost ukupne varijacije od y koja je objašnjena regresijom. Za ukupnu
varijaciju SSY i prethodno objašnjenu varijaciju SSR, imamo da je naša mera fitovanja data sa:
r2
= (cor(x,y))2.
Formalan naziv prethodnog izraza je koeficijent determinacije, ali većina ljudi ga naziva samo ' r
kvadrat '. Vrednost r2 je između 0 i 1. Što je r2 veći, imamo bolju aproksimaciju. Ako je
aproksimacija savršena, onda je r2 =1.
> n <- length(x)
> SSY <- (n-1)*var(y) ; SSY
[1] 108.8889
76
> SSR <- ( (n-1)*cov(x,y) )^2/ ( (n-1)*var(x) ) ; SSR
[1] 88.81667
> SSE <- SSY-SSR ; SSE
[1] 20.07222
> SSR/SSY ; ( cor(x,y) )^2 # r^2
[1] 0.8156633
[1] 0.8156633
Ove vrednosti su sačuvane u tabeli poznatoj kao “Anova tabela”. Anova je skraćenica za analizu
varijanse.
Izvor Suma
kvadrata
Stepeni
slobode
Srednja
vr.kvadrata
F vrednost Pr(>F)
Regresija 88.817
Greška 20.072
Total 108.889
Postoji n < - length(x) tačaka na grafiku. Kako su ove tačke unošene nezavisno od normalne
raspodele, postoji n stepena slobode u datom vektoru y. Vektor x je sada fiksiran. U ukupnoj
sumi kvadrata SSY= , vektor y je centriran sa njegovom srednjom vrednošću.
Rezultujući vektor sada ima srednju vrednost 0. Pa su stepeni slobode centriranog vektora n-1.
Stoga stepeni slobode u ukupnoj sumi kvadrata iznose n-1. Dalje razmotrimo, greške sume
kvadrata
SSE= . Pa onda imamo dva parametra ocenjena iz y, a i b. Stoga ostaje n-2
stepena slobode. Zbog SSR = SSY - SSE, pa ostaje n-1-(n-2)=1 stepen slobode za ovu regresijsku
sumu kvadrata.
Drugi način da izvedemo ovo je iz SSR = SSXY2/ SSX koji sadrži jedan parametar koji je izveden
iz y.
77
Da završimo Anova tabelu, unosimo varijanse u 4. kolonu. Primetimo da
varijansa =
Peta kolona sadrži F vrednost, dok poslednja sadrži verovatnoću da uzme vrednost veću ili
jednaku od F. Raspodela odnosa sredine kvadrata je F raspodela. Pa dobijamo verovatnoću
pomoću F-vrednosti ili veću komandom 1-pf( ).
> 20.072/7
[1] 2.867429
> 108.889/8
[1] 13.61112
> 88.817/2.86746
[1] 30.974
> 1-pf(30.9741,1,7)
[1] 0.0008460645 # the regression line is highly significant (ocena je dobra
Izvor Suma
kvadrata
Stepeni
slobode
Srednja
vr.kvadrata
F vrednost Pr(>F)
Regresija 88.817 1 88.817 30.974 0.000846
Greška 20.072 7 2.867
Total 108.889 8 13.611
78
7.3. Summary.aov() i summary()
R nam daje gornju tabelu bez poslednje vrste sa komandom summary.aov koja vrši analizu
varijanse nešeg modela.
> summary.aov(regr.obj)
Df Sum S Mean Sq F value Pr(>F)
x 1 88.817 88.817 30.974 0.000846 ***
Residuals 7 20.072 2.867
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Komanda summary() nam daje sve što treba da znamo o parametrima i njihovim standardnim
greškama.
> summary(regr.obj)
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-2.4556 -0.8889 -0.2389 0.9778 2.8944
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 11.7556 1.0408 11.295 9.54e-06 ***
x -1.2167 0.2186 -5.565 0.000846 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
79
Residual standard error: 1.693 on 7 degrees of freedom
Multiple R-squared: 0.8157,adjusted R-squared: 0.7893
F-statistic: 30.97 on 1 and 7 DF, p-value: 0.000846
Iz prethodne analize možemo videti da su očekivana vrednost odsečka i očekivana vrednost
nagiba značajne.
U nastavku ćemo videti dva ekstremna primera i jedan sa samogenerišućim podacima.
# prvi primer je opadajuća prava sa koeficijentom nagiba -1 i nema šuma.
> x <- 0:8
> decrease <- 8:0
> regr <- lm(decrease~x)
> regr1 <- lm(decrease~x)
> plot(x,decrease) ; abline(regr1)
> summary(regr1)
Call:
lm(formula = decrease ~ x)
Residuals:
Min 1Q Median 3Q Max
-1.724e-15 1.370e-16 2.031e-16 2.472e-16 9.006e-1
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.000e+00 4.894e-16 1.635e+16 <2e-16 ***
x -1.000e+00 1.028e-16 -9.729e+15 <2e-16 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
80
Residual standard error: 7.962e-16 on 7 degrees of freedom
Multiple R-squared: 1,djusted R-squared: 1
F-statistic: 9.465e+31 on 1 and 7 DF, p-value: < 2.2e-16
# U drugom primeru postoji šum koji ne zavisi od x.
> x <- seq(0,8,by=0.1)
> length(x)
[1] 81
> indpndnt <- rnorm(81,0,2)
> regr2 <- lm(indpndnt~x)
> plot(x,indpndnt) ; abline(regr2)
> summary(regr2)
Call:
lm(formula = indpndnt ~ x)
Residuals:
Min 1Q Median 3Q Max
-5.1527 -1.2588 -0.1359 1.2855 4.2083
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.81396 0.45566 -1.786 0.0779
x 0.11480 0.09835 1.167 0.2466
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
81
Residual standard error: 2.07 on 79 degrees of freedom
Multiple R-squared: 0.01695,djusted R-squared: 0.004511
F-statistic: 1.362 on 1 and 79 DF, p-value: 0.2466
# U trećem primeru imamo opadajuću pravu sa koeficijentom nagiba -1/2 sa šumom.
> noisyline <- seq(8,0,by=-0.1) + rnorm(81,0,4)
> regr3 <- lm(noisyline~x)
> plot(x,noisyline) ; abline(regr3)
> summary(regr3)
Call:
lm(formula = noisyline ~x)
Residuals:
Min 1Q Median 3Q Max
-8.4352 -2.5893 0.3918 2.3173 8.9245
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.6273 0.7892 10.932 < 2e-16 ***
x -1.0420 0.1703 -6.117 3.43e-08 ***
---
Signif. codes: 0 *** 0.001 ** 0.01 * 0.05 . 0.1 1
Residual standard error: 3.584 on 79 degrees of freedom
Multiple R-squared: 0.3214,djusted R-squared: 0.3129
F-statistic: 37.42 on 1 and 79 DF, p-value: 3.429e-08
82
7.4. Provera modela
Da bi ustanovili da li je naš model dobar, potrebno je proveriti više stvari od kojih je jedna i p-
vrednost. Osim toga, proveravamo i da li je rasipanje konstantno i da li su greške normalno
raspoređene slučajne promenljive. Najlakši način da to uradimo jeste da koristimo funkciju plot.
> plot(regr3)
83
Tačke na slici s rezidualima izgledaju kao tačke iz centrirane normalne raspodele i linija je
jednaka nuli, dok tačke sa slike pored, treba da budu blizu isprekidane linije.
U nastavku dajemo primer regresione linije koja ne aproksimira dobro.
> x <- seq(-2,6,by=0.1)
> noisy <- x^2 + rnorm(81,0,0.1)
> regr4 <- lm(noisy~x)
> plot(x,noisy) ; abline(regr4)
84
85
> plot(regr4)
86
R - UNOS i IZVOZ PODATAKA
1 UVOD
Unošenje podataka u statistički sistem radi analize i eksportovanje rezultata u neke druge sisteme
za pisanje izveštaja moze biti izuzetno zahtevan zadatak koji ume da oduzme mnogo više
vremena od samih statističkih analiza.
Ovaj priručnik opisuje unosne i izvozne mogućnosti kako u samom R-u, tako i putem paketa koji
su dostupni sa CRAN-a (Comprehensive R Archive Network) ili drugde.
Osim ako nije drugačije navedeno, sve opisano u ovom priručniku je (u principu) dostupno na
svim platformama koje podržavaju R.
Generalno, statistički sistemi kao što je R nisu praktično pogodni za manipulacije sa velikom
grupom podataka. Neki drugi sistemi su u ovom smislu bolji od R-a, i delom suština ovog
priručnika je da se umesto dupliranja funkcionalnosti u R-u naprave novi sistemi koji ce raditi
posao! ( Na primer, Therneau & Grambsch (2000) ) Sistemi baza podataka koji omogućavaju
manipulacije su često veoma pogodni za manipulacije i izvoz podataka : nekoliko paketa koji su
u interakciji sa DBMS-om (Database management systems) se razmatraju ovde.
87
Postoje paketi koji dozvoljavaju da se funkcionaknost razvijena u programskim jezicima kao što
zu Java, Perl i Python direktno integrišu sa R-kodom, što čini krišćenje objekata na ovim
jezicima primerenijim. (Pogledati rJava paket iz CRAN-a i SJava, RSPerl i RSPython pakete iz
Omegahat projekta, http://www.omegahat.org.)
Ono što je takođe značajno upamtiti da R, kao i S, dolazi iz Unix-ove tradicije malih široko
primenjivih alata, i korišćenje alata kao što su awk i perl za manipulaciju podacima pre unosa i
posle izlaza može biti korisno. Studija slučaja u Becker, Chambers & Wilks (1988, poglavlje 9)
je primer ovoga, gde Unix-ovi alati korišćeni za proveru i manipulaciju podacima pre njihovog
unosa u S. Tradicionalni Unix-ovi alati su sada daleko više i šire dostupni, uključujući i za
Windows.
1.1 UNOS
Najjednostavniji oblik podatka za unošenje u R je običan tekst fajl, ato će često biti
prihvatljivo za probleme malog i srednjeg obima . Osnovna funkcija za unos tekstualnog fajla je
scan, i ovo je u osnovi većine praktičnih funkcija razmatranih u Poglavlju 2.
Međutim, svi statistički konsultanti su uglavnom suočeni sa situacijama gde im klijent ponudi
podatke sa prenosive memorije (floppy disc, flash memorija ili CD-R) ili podatke u nekom
pripadajućem binarnom format, na primer Excel tabela ili SPSS fajl. Obično je najlakša stvar
iskoristiti izvornu aplikaciju za eksportovanje podatka kao tekstualnog fajla. Međutim, ovo nije
uvek moguće, i Poglavlje 3 razmatra koji objekti su u mogućnosti da pristupe takvim fajlovima
iz R-a. Što se tiče Excel radnih tabela, moguće metode su sumirane u Poglavlju 9 [Učitavanje
Excel radnih tabela]. Za ODS tabele (OpenDocument Spreadsheet (.ods) format) iz Open Office,
pogledati Omegahat paket ROpenOffice.
U nekim slučajevima, podaci su sačuvani u binarnom obliku zbog kompaktnosti i brzine
pristupa. Jedna primena ovoga, što smo videli nekoliko puta, su podaci u formi slika, koji se
normalno čuvaju kao niz bajtova u memoriji. Takvi oblici podataka se razmatraju u Poglavlju 5 i
Poglavlju 7.5.
Za mnogo veće baze podataka uobičajeno je da se podacima rukuje koristeći se sistemom za
upravljanje bazom podataka (DBMS-Database Management System). Još jedna mogućnost
korišćenja DBMS-a je da se izvuče obična datoteka, ali u mnogim takvim slučajevima DBMS-
ova operacija ekstrakcije se može direktno izvršiti iz R paketa.
1.1.1 Kodiranje
Osim ako datoteka iz koje se vrši uvoz podataka nije kompletno u ASCII-u (American Standard
Code for Information Interchange), obično je neophodno znati na koji način je kodirana. Što se
tiče tekstualnih fajlova, dobar način za otkrivanje informacija o njihovoj strukturi je komanda
88
file na komandnoj liniji alata ( za Windows, uključeno u Rtools). Ovo se zapisuje na sledeći
način
text.Rd: UTF-8 Unicode English text
text2.dat: ISO-8859 English text
text3.dat: Little-endian UTF-16 Unicode English character data,
with CRLF line terminators
intro.dat: UTF-8 Unicode text
intro.dat: UTF-8 Unicode (with BOM) text
Savremeni sistemi nalik Unix-u, uključujući OS X, često prave UTF-8 fajlove. Windows može
napraviti takozvane “Unicode” fajlove (UCS-2LE ili možda UTF-16LE). U suprotnom, većina
fajlova će biti 8-bitno kodirani osim ako su iz kineskog/japanskog/korejskog područja (koji
imaju širok opseg kodiranja u praktičnoj primeni). Nije moguće automatski sa sigurnošću
detektovati šta je 8-bitno kodiranje (mada su nagađanja moguća i file će možda pogoditi kao
što jeste u prethodnom primeru), tako da ćete jednostavno morati pitati inicijatora za neke
tragove (npr. “Russian on Windows”).
‘BOM-ovi’ (Byte Order Marks,
http://en.wikipedia.org/wiki/Byte_order_mark) izazivaju probleme kod Unicode
fajlova. U Unix svetu BOM-ovi se retko koriste, dok su u Windows svetu skoro uvek za UCS-
2/UTF-16 fajlove, i obično ya UTF-8 fajlove. Korišćenjem opcije file neće biti moguće ni
prepoznati UCS-2 fajlove bez BOM-a, ali mnoge druge opcije će odbiti da učitaju fajlove sa
BOM-om i IANA standardi za UTF-16LE i UTF-16E to zahtevaju. Obično smo ograničeni na
posmatranje fajla preko opcije od sa komandne linije ili na hex editor da bismo proučili njegov
kod.
Primetimo da utf8 nije pravilan naziv za kod (UTF-8 jeste), i macintosh je
najprimenjivije ime za ono što se nekad naziva “Mac Roman” kod.
1.2 Eksportovanje u tekst fajlove
Eksportovanje rezultata iz R-a obično nije sporno, ali i dalje postoji veliki broj zamki. Treba
imati u vidu aplikaciju koja je meta eksportovanja, i naravno tekst fajl je napogodniji oblik za
razmenu.
Funkcija cat je u osnovi funkcija za eksportovanje podataka. Uzima se file argument, i
append argument dozvoljava da se tekst fajl napiše putem uzastopnih poziva funkcije cat.
Međutim bolje je, pogotovo ako je ovo neophodno uraditi veliki broj puta, otvoriti file vezu za
pisanje ili sređivanje, i odraditi cat na tu vezu, i onda primeniti opciju close.
Najčešći zadatak je napisati matricu ili zabeležiti podatke u obliku pravougaone mreže
brojeva, sa oznakama vrsta i kolona. Ovo se može odraditi putem funkcije write.table and
89
write. Funkcija write samo ispisuje matricu ili vektor sa određenim brojem kolona (i
transponuje matricu). Funkcija write.table je pogodnija, i ispisuje tabelu podataka (ili
objekte koji se mogu prevesti u tabele podataka) sa oznakama vrsta i kolona.
Brojni su problemi koji se trebaju razmotriti prilikom eksportovanja tabele podataka u tekst fajl.
1. Preciznost
Većina konverzija realnih/kompleksnih brojeva odrađenih ovim funkcijama je u punoj
preciznosti, ali one odrađene pute write-a su regulisane trenutnom postavkom opcija u
prozoru options(digits). Za više kontrola treba koristiti format u okviru tabele
podataka, moguće je sređivati kolonu po kolonu.
2. Linija zaglavlja
R preferira da linija zaglavlja nema ulaz za imena vrsta, tako da fajl izgleda ovako:
dist climb time
Greenmantle 2.5 650 16.083
...
Neki drugi sistemi zahtevaju (moguće je i prazan unos) ulazne podatke za imena vrsta,
što je ono što će write.table obezbediti ako je argument col.names=NA naveden.
Excel je jedan od takvih sistema.
3. Separator
Jedan od uobičajenih separatora u fajlovima je zarez(comma), dok to nije slučaj u
nijednoj oblasti engleskog govornog područja. Takvi fajlovi su poznati kao CSV (comma
separated values) fajlovi, tzv. wrapper funkcija write.csv obezbeđuje odgovarajuće
postavke. U nekim lokalima zarez se koristi kao decimalni separator (podešavanje sa
write.table by dec=”,”) tako da CSV fajlovi koriste tačku-zarez kao separator
polja: koristiti write.csv2 za odgovarajuće postavke. Postoji IETF standard za CSV
datoteke (koji propisuje zareze i CRLF završetak redova, za koje se koristi eol=“\r\n”),
RFC4180 (http://tools.ietf.org/html/rfc4180), ali ono što je bitno u
praktičnom smislu je da datoteka bude čitljiva od strane aplikacije kojoj je namenjena.
Korišćenje tačka-zareza (;) ili tab-a (sep=”\r”) je uglavnom najsigurnija opcija.
4. Podaci koji nedostaju
Prema osnovnim postavkama, nedostajuće vrednosti izlaze kao NA, ali ovo može da se
promeni argumentum na. Takođe NaNs se tretiraju kao NA u write.table, ali ne i u
cat ili write.
5. Navodjenje stringova
Prema osnovnim postavkama stringovi se navode (uključujući nazive vrsta i kolona).
Argument quote kontroliše da li su karkakteri i faktorske promenljive dobro navedene:
neki program, na primer Mondrian, ne prihvataju navedene stringove.
Treba posebno obratiti pažnju ako stingovi već sadrže citate u sebi. Tri korisne forme
90
kodova su:
> df <- data.frame(a = I("a \" quote"))
> write.table(df)
"a"
"1" "a \" quote"
> write.table(df, qmethod = "double")
"a"
"1" "a "" quote"
> write.table(df, quote = FALSE, sep = ",")
a
1,a " quote
6. Kodiranja
Tekstualni fajlovi ne sadrže metapodatke o njihovim kodiranjima , tako da za ne-ASCII
podatke fajl mora da bude usmeren na aplikac ije koje treba da ga pročitaju. Sve ove funkcije
mogu pisati connection koje omogućava da se kodiranje odredi sprecijalno za datoteku, i
write.table ima fileEncoding argument da olakša postupak.
Teži deo posla je znati koju vrstu kodiranja koristiti za fajl. Za korišćenje u Windows-u,
najbolje je koristiti ono što se Windows zove ‘Unicode’, to je “UTF-16LE”. Korišćenje UTF-
8 je dobar način da se naprave prenosivi fajlovi čije se kodiranje neće lako brkati sa nekim
drugim, ali čak i OS X aplikacijama (gde je UTF-8 sistem kodiranja) se može desiti da ih ne
prepoznaju, a Windows aplikacijama se to retko dešava. Očigledno Excel:mac 2004/8
očekuje .csv fajl u “macroman” kodu (kodiranje korišćeno u mnogo ranijim verzijama
Mac OS-a).
Funkcija write.matrix u paketu MASS obezbeđuje specijalizovani interfejs za pisanje
matrica, sa opcijom pisanja istih u blokovima i tako značajno redukujući korišćenje
memorije.
Moguće je koristiti sink za prenos standardnog R izlaza u fajl, i tako uhvatiti izlaz poziva
print. Ovo obično nije najefikasniji put, i options(width) podešavanja će možda morati
da se povećaju.
Funkcija write.foreign u paketu foreign koristi write.table da napravi tekstualni
fajl i takođe ispisuje kodirani fajl koji će učitati ovaj tekstualni fajl u drugi statistički paket.
Trenutno postoji podrška za izvoz u SAS, SPSS i Stata.
XML
91
Kada se čitaju podaci iz tekstualnog fajla, odgvornost je na korisniku da zna i da odredi
konvencije korišćene za kreiranje tog fajla, npr. komentar, da li je naslovna linija prisutna,
separator, predstavljanjenedostajućih vrednosti (i tako dalje). Markup jezik koji se može
koristiti da sed objasni, ne samo sadržaj, već takođe i strukturu sadržaja može učiniti fajl
takvim da sam sebe objašnjava, tako da se ne moraju omogućiti svi podaci o softveru koji
čita podatke.
Extensible Markup Language- šire poznat kao XML- može se koristiti da se obezbedi takva
struktura, ne samo za standardne grupe podataka već i za kompleksnije strukture podataka.
XML postaje izuzetno popularan i prerasta u standard za opšte oznake podataka i razmenu.
Koristi se od strane različitih zajednica da se opišu geografski podaci kao što su mape,
grafički prikazi, proračuni i tako dalje.
XML omogućava način da se naglasi kodiranje fajla, npr.
<?xml version="1.0" encoding="UTF-8"?>
XML paket omogućava opšte objekte za čitanje i pisanje XML dokumenata u R-u. Opis
objekata koji se nalaze u XML izlazi iz okvira ovog dokumenta: pogledati web-stranu paketa
na http://www.omegahat.org/RSXML za detalje i primere. Paket StatDataML na CRAN-u
je jedan od primera pravljena XML-a.
NB: XSML je dostupan kao binarni paket za Windows, naravno iz `CRAN extras`
spremišta.
92
2 Tabelarni prikaz podataka
U prethodnom poglavlju videli smo brojne varijacije za formate tabelarnih tekst fajlova, gde
su podaci prikazani u pravougaonoj mreži ,eventualno sa nazivima vrsta i kolona. U ovom
poglavlju razmatramo unosšenje ovakvih fajlova u R.
2.1 Varijacije za read.table
Funkcija read.table je najpogodniji način za učitavanje pravougaone mreže podataka.
Zbog velikog broja mogućnosti , postoji još nekoliko funkcija koje pozivaju read.table ali
menjaju grupu osnovnih postavki.
Međutim, treba biti na oprezu , jer je funkcija read. table nepogodan način za učitavanje
izuzetno velikih brojnih matrica.
Neki od problema koji se moraju razmotriti su:
1. Kodiranje
Ako fajl sadrži non-ASCII polje karaktera, treba se osigurati da su učitani u ispravnom
kodu. Ovo je uglavnom problem sa učitavanjem Latin-1 fajlova u UTF-8 lokalu, što se
može uraditi na sledeći način:
read.table("file.dat",
fileEncoding="latin1")
Primetimo da će ovo raditi u bilo kom lokalu koji može da prikaže Latin-1 stringove, ali
ne i u mnogim grčkim/ruskim/kineskim/japanskim… lokalima.
2. Linija zaglavlja
Predlažemo da naglasite header argument eksplicitno. Po pravilu linija zaglavlja ima
mogućnost unosa samo za nazive kolona, ali ne i za nazive vrsta, tako da je za jedno polje
kraće od preostalih redova. (Ako R ovo zapazi, postaviće header=TRUE.) Ako ste
suočeni sa fajlom koji ima liniju zaglavlja za nazive vrsta, učitajte ga ovako:
read.table("file.dat", header = TRUE,
row.names = 1)
Nazivi kolonama se mogu dodeliti eksplicitno putem col. names.
3. Separator
Klasičnim posmatranjem fajla se može odrediti koji separator polja treba koristiti, ali kod
fajlova sa praznim prostorom kao separatorom postoji mogućnost izbora između osnovne
postavke sep=”” koji koristi bilo koji prazan prostor (space, tab ili newline) kao
separator, sep=”” i sep=”\t”.Primetimo da će izbor separatora uticati na unos
93
navedenih stringova.
Za fajlove koji koriste tab-ove kao prazne prostore treba koristiti sep=”\t”
4. Navođenje
Po osnovnim postavkama nizovi karaktera se mogu navoditi sa ‘”’ ili ‘’’, i u oba slučaja
svi karakteri koji se nalaze između znaka navoda se uzimaju kao deo niza karaktera.
Grupa validnih znakova navođenja (što može biti i nijedan) je kontolisana od strane
quote argument. Za sep=”\t” osnovne postavke se menjaju na quote=“”.
Primer navođenja stringova kada separator nije specijalno određen:
’One string isn’’t two’,"one more"
što se može učitati putem
read.table("testfile", sep = ",")
Ovo ne funkcioniše na separatoru osnovnih postavki.