520 likes | 713 Views
Analýza dat v R. Eva Budinská Ivana Ihnatov á 3-5. máj 201 3 Brno. História R. V yvinutý v 90 - tych rokoch ako variant S-plus R obert om Gentleman om a R oss om Ihak om Od 1997: medzinárodný R-core team ~15 ľudí & tisíce výskumníkov prispievajúcich vlastnými knižnicami.
E N D
Analýza dat v R Eva Budinská Ivana Ihnatová 3-5. máj 2013 Brno
História R • Vyvinutý v 90-tychrokochako variant S-plus Robertom Gentlemanom a RossomIhakom • Od 1997: medzinárodný R-core team ~15 ľudí & tisícevýskumníkov prispievajúcich vlastnými knižnicami
Čo je R • Je to nástroj pre analýzu dát a programovací jazyk • R ako nástroj pre analýzu dát a štatistiku: • Klasické operátory (+ - <- * %*% …) pre prácu s maticami • Integrované veľké množstvo základných i pokročilých funkcií pre štatistickú analýzu • Nástroje pre tvorbu veľkého množstva grafov v publikovateľnej podobe • R ako programovací jazyk • Je to zmes rôznych typov jazykov prispôsobená pre analýzu dát • imperatívnych – iteratívne konštrukcie (for, if...) - C, Pascal... • funkcionálnych – obsahuje lambda funkcie a správu listov – LISP • objektovo orientovaných – obsahuje koncept objektu, polymorfizmy) – Python, C++ • Väčšina funkcií je napísaná priamo v R • Možnosť začlenenia procedúr napísaných v C, C+, alebo FORTRAN • Systémové príkazy sa volajú priamo z R
Výhody R • Voľne prístupný (www.r-project.org) • Pre všetky platformy (Windows, Unix, MacOS) • Open source – prístup k zdrojovým kódom všetkých funkcií • Široko používaný • Nové metódy implementované často IHNEĎ priamo autormi v R (na rozdiel od SAS, SPSS...) • Knižnice funkcií pre špecializované analýzy • Možnosť písania vlastných funkcií a balíkov
Nevýhody R • Riadkové rozhranie (umožňujúce väčšiu flexibilitu, možné prepojenie s Java a TclTk) • Jazykový prekladač môže byť veľmi pomalý (ale umožňuje používať C/C++ kód) • Neposkytuje prehľad dát v tabuľke (ale prepojenie s Excel/MsOffice) • Nemá profesionálnu komerčnú podporu (ale má podporu v internetovom fóre a priamo od autorov) • Práca s veľkými datasetmi limitovaná RAM • Väčšia možnosť chýb pri úprave dát
R download • Posledná verzia: R-3.0.0 • http://cran.r-project.org • Binary source codes • Windows executables • Compiled RPMs for Linux
Inštalácia R • Binárne (Windows/Linux): Jednokrokový proces • exe, rpm (Red Hat/Mandrake), apt-get (Debian) • Linux, zo zdrojového kódu: $ tar –zxvf “filename.tar.gz” $ cd filename $ ./configure $ make $ make check $ make install
Spustenie R Poklikanie na ikonu $ R Napísaním R do terminála
Ako funguje R • Po spustení sa zobrazí riadkový mód • Začiatok riadku označený >, tu môžeme zadávať príkazy • R pracuje s objektami, ktoré uskladňuje vo svojej pamäti, ktorú dopredu vyčlení z RAM • Funguje pass-by-value (nie pass-by-reference) – ak zadávame premennú do funkcie, neodkazuje sa na ňu, ale jej hodnotu skopíruje
Príkazy v R I. • Základné príkazy sú výrazy alebo priradenia • výraz: 2+3 • priradenie: a=2+3 • Ak je zadaným príkazom výraz, vyhodnotí sa, zobrazí, a jeho hodnota sa vymaže > 2+3 • Priradenie takisto vyhodnotí výraz, ale jeho hodnota sa priradí premennej. Výsledok sa normálne nezobrazí. • Priraďovacie znaky “<-”, „=“ • Priraďovacia funkcia assign() • "x <- 5", "x=5", assign("x", 5)#x sa priradí hodnota 5 > x=2+3 > x<-2+3 ÚLOHA: Ako funguje znak “->”?
Príkazy v R II. • Príkazy sa oddeľujú pomocou;alebo novým riadkom • Ak príkaz nekončí na konci riadku, začiatok každého nasledujúceho riadku bude mať znak + až do konca syntaxu príkazu • Príkazové riadky sú limitované na cca 4095 bytov • Komentáre sa označujú symbolom # (všetko v riadku za týmto symbolom nie je vyhodnotené ako príkaz, ale ako komentár)
Príkazy v R III. • Viac príkazov sa môže dať do zátvoriek{ } , vytvoriactakjeden výraz (používané vo funkciách, cykloch, podmienkach) • Príkazy môžeme spustiť z externého súboru source("skript.R") • Výsledky môžeme ukladať do externého súboru pomocou príkazu sink("vysledky.txt")ukladanie ukončímesink()
R ako programovací jazyk (výrazy) • Funkcia > funkcia(a,b) • Prvky – čísla, znaky; Premenné • Objekty • výsledky funkcie podľa typu objektu • vektor, matica, dátová tabuľka, pole, list • Podmienky, cykly > if(podmienka) {výraz} > for (podmienka) {výraz} • Výrazy môžeme vnárať jeden do druhého premenné názov
R ako programovací jazyk (operátory) • Operátory: jedno-trojznakové funkcie+,-,*,^
Objekty v R I. • R vytvára a manipuluje objekty(premenné, číselné polia, znakové reťazce, funkcie, komplexnejšie štruktúry...) • Objekty sú vždy vytvorené priradením a uložené pod nejakým názvom • Tieto príkazy zobrazia objekty práve uložené v R (workspace) > objects() > ls() • Odstránenie objektov > rm(list=c("objekt1", "objekt2")) > rm("objekt1") > rm(list=ls())# odstráni všetky objekty
Objekty v R II. • Všetky objekty, ktoré vytvoríme môžeme uložiť permanentne do samostatného súboru s príponou „.RData“, ktorý môžeme načítať neskôr . • Uloženie celého prostredia R save.image("MojeR.rdata") • Uloženie objektu vo formáte R save(objekt, file="objekt.RData") • Načítanie objektu/objektov vo formáte R load("objekt.RData") • Na konci každej session sa R spýta, či chceme uložiť svoju prácu. Ak odpovieme áno, všetky objekty sa uložia do súboru s názvom „.RData“ a príkazy do súboru „.RHistory“ – tieto sa automaticky načítajú pri budúcom spustení R
Objekty v R III. • Typy objektov v R: • premenné, reťazce znakov, • vektor, vector() • pole , array() • matica, matrix() • dátová tabuľka, data.frame() • list, list() • funkcia, function(){} ... > is(): zistí typ a atribúty objektu
Objekty v R IV. • Tvorba objektov • priradením hodnoty x = c(1,2,3) • vytvorením prázdneho objektu x = c()#vytvorí prázdny vektor y = list() #vytvorí prázdny list • Názvy objektov • musia sa začínať písmenom!!! • môžu obsahovať písmená, čísla a bodky • pozor, R je Case Sensitive!
Objekty v R V. • Vlastnosti objektov (atribúty) • mód – mode(): numeric, character (string), logical, complex • trieda – class(): numeric, character, logical, factor • length(): počet elementov v objekte • Objekty vyžadujúce elementy rovnakej triedy: • matrix (matica), array (pole) • Objekty umožňujúce kombináciu prvkov rôznych módov • list (zoznam), data frame (dátová tabuľka)
Objekty v R VI. a=c(1,2,3) mojlist =list(raz=c(1,2,3),dva=c("jeden","dva","tri"),tri=TRUE) • Zistenie vlastností objektu: is(a) [1] "numeric" "vector" is.numeric(a) [1] TRUE is.list(a) [1] FALSE (is.vector, is.matrix, is.data.frame, is.character) • Štruktúra typu objektu: summary(mojlist) # názvy, dĺžky, triedy a mód elementov listu str(mojlist)# trochu podrobnejší výpis ako summary
Základné príkazy v R • Spojiť (concatenate) – spojí viacero premenných do vektoru > c() • Adresár v ktorom pracujeme (kde sa nachádzame a ako ho nastaviť) > getwd() # kdesanachádzame > setwd("adresar") # nastavenie novéhoadresára • Zastavenie výpočtu, ukončenie príkazu alebo klávesa Esc vo Windows CTRL+C v UNIX
Nápoveda v R I. • Vyhľadávanie funkcií help.search("čo hľadám") ??"čo hľadám"#vypíšusa všetky funkcie a balíky, ktoré v dokumentácii obsahujú reťazec "čo hľadám„ (Úloha: Nájdite funkciu pre T-test) • Vyhľadanie funkcií s daným výrazom priamo v názve apropos("test") • Nápoveda ku konkrétnej funkcii (operátoru), ktorú už poznáme help(meno_funkcie); help("+") ?meno_funkcie #Každá nápoveda obsahuje i príklady! (Úloha: Zobrazte nápovedu k nájdenej funkcii pre T-test)
Nápoveda v R II. • Zobrazenie nápovedy pre knižnicu help(package=cluster) • Všetky vyššie uvedené funkcie prehľadávajú len nainštalované balíky, je to teda lokálne hľadanie • Ak funkciu nenájdeme, môžeme hľadať online na www.r-seek.org • Manuál R http://cran.r-project.org/doc/manuals/R-intro.html#The-R-environment
Vektor (vector) I. • Vektor:usporiadaná n-tica prvkov • Samostatné číslo je vektor dĺžky 1 • Tvorba vektoru • Za použitia : > 1:4 # vektor čísiel 1,2,3,4 • Za použitia c(): > c() # vytvorenie prázdneho vektoru (spoj "žiadne prvky" do vektoru) > c(1,1,2,2,3,3) # vektor čísiel (spoj tieto prvky do vektoru) • Na prvky vektoru sa odvolávame pomocou [] a[1] – vyberie prvý prvok vektoru ÚLOHA: • Akými spôsobmi vyberiete naraz prvé štyri prvky vektoru? • Akými spôsobmi vyberiete naraz prvý a štvrtý prvok vektoru?
Vektor (vector) II. • Základné funkcie vektoru mode(a)# mód vektoru length(a) # počet objektov vo vektore b = c("a", "b", "c") d = c(T, T, F, F) ÚLOHY: • Zistite akého módu sú vektory b a d • Skúste zjednotiť vektory a a b do premennej s názvom f • Aký mód má teraz premenná f?
Práca s vektormi a = c(1,1,2,2,3,3) a1 = c(2,2,2,1,1,1) a2 = c(1,2) • Spájanie vektorov c(a,a2) cbind(a1,a) # spojí vektory (i matice) ako stĺpce (nutný rovnaký počet riadkov matíc, kratšie vektory sa recyklujú) rbind(a1,a) # spojí vektory (i matice) ako riadky (nutný rovnaký počet stĺpcov matíc, kratšie vektory sa recyklujú) paste(a,b,d) #spája všetko do textu, prvky kratších vektorov sa recyklujú paste(a,b,d,sep="")# sep argument určuje prepojenie prvkov
Práca s numerickými vektormi a = c(1,1,2,2,3,3) a2 = c(1,2) a3 = c(1,2,3,4) • Operátory: +, -,*, /, ^ (mocnina), sqrt()(odmocnina) • Operácie medzi vektormi a + a2 # ekvivalentne pre a*a2, a/a2, a^a2 [1] 2 3 3 4 4 5 # je to isté ako a + c(1,2,1,2,1,2) #(*, /, ^) Pri operáciach dvoch vektorov nerovnakej dĺžky sa kratší opakuje až do dĺžky dlhšieho vektoru Úloha: Zistite čo sa stane, ak a2 v našich rovniciach nahradíme a3?
Práca s vektorom znakov a reťazcom znakov (character, string) I. p= "Moj oblubeny napoj je pivo" # reťazec znakov q = c("Moj" , "oblubeny" , "napoj" , "je" , "vino" ) # vektor znakov • Základné funkcie nchar(p) #počet znakov reťazca [1] 26 nchar(q) [1] 3 8 5 2 4 • Výmena znaku v textovom reťazci sub("pivo" , "vodka" ,p) [1] "Moj oblubeny napoj je vodka" • Spojenie objektov vektoru znakov do jedného reťazca paste(q, collapse=" ") [1] " Moj oblubeny napoj je vino" ÚLOHA: Spojte objektyvektoru znakov q tak aby boli slová oddelené znakom /
Práca s vektorom znakov a reťazcom znakov (character, string) II. p= "Moj oblubeny napoj je pivo" q = c("Moj" , "oblubeny", "napoj" , "je" , "vino" ) r = c("8 jablk" , "10 hrusiek" ) • Rozdelenie textového reťazca na jednotlivé položky strsplit(p, ' ') [[1]] [1] "Moj" "oblubeny" "napoj" "je" "pivo" strsplit(p, '') [[1]] [1] "M" "o" "j" " " "o" "b" "l" "u" "b" "e" "n" "y" " " "n" "a" "p" "o" "j" " " "j" "e" " " "p" "i" "v" "o" Úloha: Zistite typ objektu ktorý je výstupom funkcie strsplit. strsplit(r, ' ') • Časť reťazca substring(p,5,5+8) substring(q,1,1) substring(r,3,3+5)
Práca s vektorom znakov a reťazcom znakov (character, string) III. p= "Moj oblubeny napoj je pivo" q = c("Moj" , "oblubeny", "napoj" , "je" , "vino" ) r = c("8 jablk" , "10 hrusiek" ) • Vyhľadávanie v znakovom reťazci regexpr("oblubeny", p) #vráti prvú pozíciu hľadaného podreťazca a jeho dĺžku regexpr("oj", p) regexpr("oj", q) # -1 znamená, že daný reťazec sa nenašiel Úlohy: • Vytvorte z vektorov p,q a r vektor s=c("pivo", "vino", "jablk", "hrusiek") • Nájdite ďalšie vyhľadávacie funkcie reťazca (nápoveda: použite nápovedu k funkcii regexpr)
Práca s logickým vektorom a = c(1,2,3) • Operátory • == , !=, >, < e = a==3 e [1] FALSE FALSE TRUE is(e) [1] logical, vector as.character(e) [1] "FALSE" "FALSE" "TRUE" ÚLOHA: Zjednoťte vektory a,e do premennej g. Čo sa stane? • S logickým vektorom môžeme pracovať ako s vektorom numerickým: FALSE je ekvivalentné 0, TRUE je ekvivalentné 1 e+2 [1] 2 2 3
Zoznam (list) I. • Zoznam (list):lineárna dátová štruktúra, zoradené objekty rôznych typov a veľkostí film <- list(meno="bond, james bond",vek=40,zenaty=F, herci=c("Sean Connery", "George Lazenby", "Roger Moore", "Timothy Dalton", "Pierce Brosnan", "Daniel Craig")) • Elementy listu sú prístupné pomocou ich indexu [[i]] alebo názvu $názov: names(film) [1] "meno" "vek" "zenaty" "herci" film$meno [1] "bond, james bond" film$vek [1] 40 film[[3]] [1] FALSE
Zoznam (list) II. unlist(film) # zoradí objekty listu do jedného vektoru meno vek zenaty herci1 "bond, james bond" "40" "FALSE“ "Sean Connery" herci2 herci3 herci4 "George Lazenby" "Roger Moore" "Timothy Dalton" herci5 herci6 "Pierce Brosnan" "Daniel Craig" str(film)
Matica a pole (matrix & array) I. • Pole (array): viacrozmerný vektor • Matica (matrix): dvojrozmerný vektor, obdĺžniková tabuľka objektov rovnakého módu, 2 rozmerné pole • Funkcie a = c(1,1,2,2,3,3) ma = matrix(a,nrow=3,ncol=2) # konvertuje vektor na maticu, pozor, defaultne načíta po stĺpcoch! Úloha: Nájdite argument funkcie matrix, ktorý umožňuje načítanie matice po riadkoch, vytvorte takto z vektoru a maticu ma2 maempty = matrix(NA,nrow=2,ncol=2) #vytvorenie prázdnej matice [,1] [,2] [1,] NA NA [2,] NA NA • Prvky matice – odvolávame sa na ne pomocou [riadok,stĺpec] ma[1,2]; ma[1:2,]; ma[,2]; ma[c(1,3),]
Matica a pole (matrix & array) II. • Maticové funkcie: • Diagonála diag(ma) • Horný a dolný trojuholník upper.tri(ma) lower.tri(ma) • Sumarizačné rowSums(ma) colSums(ma) rowMeans(ma) colMeans(ma) • Operátory: • Transpozícia t(ma) • Násobenie skalárom: ma*2 • Sčítanie a odčítanie ma-ma2 ma+ma2 • Vektorový súčin ma %*% t(ma)
Matica a pole (matrix & array) III. • Vlastnosti matice dim(ma) # rozmery matice [1] 3 2 nrow(ma); ncol(ma) dimnames(ma) # názvy stĺpcov a riadkov matice NULL rownames(ma); colnames(ma) rownames(ma)=c("A","B","C")# priradí názvy riadkov ma [,1] [,2] A 1 2 B 1 3 C 2 3 Úlohy: • Zmeňte názvy stĺpcov matice ma • Aký je iný spôsob definovania názvov stĺpcov a riadkov matice? nápoveda: ešte pri jej tvorbe
Dátová tabuľka I. • Tabuľka; dáta v rámci každého stĺpca sú rovnakej triedy (číslo, znak, logická hodnota), stĺpce môžu byť odlišnej triedy. • Je to typický formát dát s ktorým prichádza výskumník za analytikom vek=c(57,81,45) liecba=c("CHT","ziadna","CHT") umrtie=c(F,T,F) IDpacienta = c("ID01","ID26","ID98") X <-data.frame(vek,liecba,umrtie,row.names=IDpacienta) X vek liecba umrtie ID01 57 CHT FALSE ID26 81 ziadna TRUE ID98 45 CHT FALSE
Dátová tabuľka II. • Riadky dátovej tabuľky sú uložené ako listy, stĺpce ako vektory aj listy! > is(X[1,]) > is(X[,1]) > is(X[1]) !Data frame premieňa automatickyvektorznakovna faktor! > X$liecba [1] CHT ziadna CHT Levels: CHT ziadna > class(X$liecba) > class(liecba) > levels(X$liecba) # vypíše úrovne faktoru > nlevels(X$liecba)# počet úrovní faktoru > as.numeric(liecba) [1] NA NA NA > as.numeric(X$liecba) [1] 1 2 1 POZOR NA TÚTO VLASTNOSŤ PRI SPRACOVÁVANÍ VEĽKÝCH DATOVÝCH SÚBOROV!!!
Zmeny dátových typov a = c(1,1,2,2,3,3) # numeric vector b = c("a" , "b" , "c" ) # character vector d = c(T, T, F, F) # logical vector ma2 # matrix X # data.frame film # list Úloha: Aplikujte na vyššie uvedené premenné nasledujúce funkcie pre zmenu dátového typu a zapíšte svoje pozorovania: • as.numeric() • as.character() • as.factor() • as.list() • as.matrix() • as.data.frame()
Chýbajúce hodnoty • Premenné akéhokoľvek typu môžu obsahovať chýbajúce hodnoty (NA – not available) • Je rozdiel medzi NA a 0, “”, FALSE, NULL • Väčšina operácií v prípade prítomnosti chýbajúcich hodnôt vráti hodnotu NA: NA==2 [1] NA 100+NA [1] NA sum(c(NA, 100)) [1] NA NA | 10 [1] TRUE • Určite nie v prípade, že funkcia má definované ako spracovávať NA hodnoty sum(c(NA, 100), na.rm=T)# atribút na.rm=T znamená, že sa NA hodnoty majú odstrániť (NA remove) [1] 100
Indexovanie I. • Jednotlivé prvky objektov sú prístupné pomocou • [ i ] kde i je index,názov premennej, logický argument • $i kde i je názov premennej • Dátová tabuľka: > X vek liecba umrtie ID01 57 CHT FALSE ID26 81 ziadna TRUE ID98 45 CHT FALSE > X[3, 2] [1] CHT Levels: CHT ziadna > X["ID98", "liecba"] [1] CHT Levels: CHT ziadna > X$vek [1] 57 81 45 > X["ID98",] vek liecba umrtie ID98 45 CHT FALSE
Indexovanie II. • Index ako logický argument: X[X$vek>50,] # zobrazí len riadky (pacientov) s hodnotou veku nad 50 rokov vek liecba umrtie ID01 57 CHT FALSE ID26 81 ziadna TRUE a = c(1,1,2,2,3,3) a[a>2] [1] 3 3 Úloha: Načítajte dátový súbor „states.RData“ a zistite, koľko riadkov má na začiatku názvu „Mi“ a ktoré to sú.
Funkcie I. • Funkciaje skript ktorý spracováva automaticky dáta „vstup”: argumenty funkcie (mnoho) „výstup”: výsledný objekt (jeden) podiel <- function(a,b) { result <- a/b cat("pocitam ako divy","\n") return(result) } • podiel – názov funkcie • a,b – argumenty funkcie • { } – ohraničuje začiatok a koniec funkcie • return() – príkaz, ktorý objekt chceme ako výsledok funkcie podiel(10,2)
Funkcie – úloha 1. • Vytvorte funkciu s názvom operacie, ktorej • vstupné premenné budú vektor číselných hodnôt x a číslo b • výstupom bude list s položkami súčet, rozdiel, podiel, a mocninu x na b • elementy výsledného listu budú mať názvy: sucet, rozdiel, podiel, mocnina • vyskúšajte funkciu pre hodnoty x=c(10, 20, 30), b=4 ** rozšírte funkciu tak, aby b mohol byť vektor čísiel (a príslušné operácie sa vykonali pre všetky hodnoty b)
Vetvenie • if (logická podmienka) { • príkazy • } else { • alternatívne príkazy • } • elseje voliteľný príkaz, POZOR, nenechávať medzeru medzi } a else! • { } nie sú nutné ak použijeme len jeden príkaz • if (logická podmienka) príkaz • Logická podmienka môže nadobúdať tvary: if (a>=0) { } d=TRUE # alebo d=FALSE if(d) { } # nemusíme teda písať if(d==TRUE) • ifelse (logická podmienka, príkaz ak splnená, príkaz ak nesplnená)
Cyklus • V prípade, že potrebujeme zopakovať sériu príkazov mnohokrát for(i in 1:10) { i=i+2 print(i^2) } • Premennú i môžeme počas for cyklu upravovať, cyklus to neovplyvní – Úloha: Overte to pridaním i=i+2 ako posledného príkazu cyklu. Akú hodnotu má i na konci cyklu? Čo by sa stalo ak by ste umiestnili i=i+2 ako prvý príkaz cyklu? i<-1 while(i<=10) { print(i^2) i<-i+1 } • Ďalšie cykly: repeat – break(), next Úloha: Pretvorte vyššie uvedený cyklus na repeat-break cyklus tak aby výstup ostal rovnaký.
Zjednodušenie/zrýchlenie for cyklu ma [,1] [,2] [1,] 1 2 [2,] 1 3 [3,] 2 3 • apply() – aplikuje funkciu na riadky/stĺpce matice apply(ma, 1, mean) # spočíta priemer v riadkoch [1] 1.5 2.0 2.5 apply(ma, 2, mean) # spočíta priemer v stĺpcoch [1] 1.333333 2.666667 • tapply() – aplikuje funkciu na vektor na základe faktoru vektor = ma[,2] skupina = c("A", "A", "B") tapply(vektor,skupina,FUN=function(x) mean(x)) A B 2.5 3.0 Úloha: Spočítajte v jednom príkaze priemer v skupinách A a B pre oba stĺpce matice ma