II део

\(\color{firebrick}{\text{1. ФАКТОРИ}}\)

Фактри се користе када податке желимо да сврстамо у категорије.

Пример 1: мушки и женски пол

Најчешеће се описују бројевима (нпр. 0 за мушки, 1 за женски). Сваки фактор има неколико категорија односно нивоа (level). На примеру пола, нивои су мушки и женски и описани су бројевима 0 и 1, па када у подацима видимо 0 односно 1, знамо на који пол се податак односи.

pol<-c(0,0,1,0,1)
fpol<-factor(pol,levels=0:1) #команда којом кажемо да пол посматрамо како фактор, чије су могуће нумеричке вредности  0 и 1
fpol
## [1] 0 0 1 0 1
## Levels: 0 1
levels(fpol)<-c("muski","zenski") #додељујемо значење нивоима фактора
#поновно исписивање вектора fpol:
fpol
## [1] muski  muski  zenski muski  zenski
## Levels: muski zenski
levels(fpol)
## [1] "muski"  "zenski"
#ф-ја as.numeric приказује како су нивои кодирани, увек почиње од 1 (1,2,..):
as.numeric(fpol)
## [1] 1 1 2 1 2

Пример 2: степен бола

#вектор за 5 пацијената, где су елементи степени бола
bol<-c(0,3,2,2,1)
#ово хоћемо да третирамо као променљиву са категоријама, па правимо фактор

fbol<-factor(bol,levels=0:3)
#додајмо имена нивоима да бисмо знали како да интерпретирамо бројеве
levels(fbol)<-c("nema","slab","umeren","jak")
fbol
## [1] nema   jak    umeren umeren slab  
## Levels: nema slab umeren jak
as.numeric(fbol) #доделио је нивоима 1,2,3,4
## [1] 1 4 3 3 2

\(\color{firebrick}{\text{2. ЛИСТЕ}}\)

Листа представља колекцију објеката скупљених у један сложен објакат.

Пример прављења листе од два вектора: ф-јa кoја креира је LIST:

v1<-c(4,3,2,1)
v2<-c(5,6,7,8)
lista<-list(v1,v2)
lista
## [[1]]
## [1] 4 3 2 1
## 
## [[2]]
## [1] 5 6 7 8

Приступање елементима листе

lista[[1]]
## [1] 4 3 2 1

Ако приликом прављења листе елементима доделимо имена, можемо позивати елементе преко њихових имена и знака $

lista<-list(prvi=v1,drugi=v2)
lista[[1]]
## [1] 4 3 2 1
#даће исто што и:
lista[["prvi"]]
## [1] 4 3 2 1
#и исто што и:
lista$prvi
## [1] 4 3 2 1

Ф-ja која враћа имена елемената:

names(lista)
## [1] "prvi"  "drugi"

Елементи листе не морају бити објекти истог типа!

lista<-list(2,1.4,"string",c(1,3,4),2:12,matrix(1:12,nrow=2))
lista
## [[1]]
## [1] 2
## 
## [[2]]
## [1] 1.4
## 
## [[3]]
## [1] "string"
## 
## [[4]]
## [1] 1 3 4
## 
## [[5]]
##  [1]  2  3  4  5  6  7  8  9 10 11 12
## 
## [[6]]
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12

Листа може да садржи и друге листе.

nova.lista<-list(lista,12,"rec")
nova.lista
## [[1]]
## [[1]][[1]]
## [1] 2
## 
## [[1]][[2]]
## [1] 1.4
## 
## [[1]][[3]]
## [1] "string"
## 
## [[1]][[4]]
## [1] 1 3 4
## 
## [[1]][[5]]
##  [1]  2  3  4  5  6  7  8  9 10 11 12
## 
## [[1]][[6]]
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    3    5    7    9   11
## [2,]    2    4    6    8   10   12
## 
## 
## [[2]]
## [1] 12
## 
## [[3]]
## [1] "rec"

Додавање елемената на крај листе

lista<-list(1:3,matrix(1:4,ncol=2)) #правимо листу од два елемента
lista
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
#додавање преко индекса
lista[[3]]<-"treci"

Могуће је додавати нови елемент и преко имена:

lista$cetvrti<-"cet"
lista #сада само четврти елемент листе има име и додат је на крај
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## [[3]]
## [1] "treci"
## 
## $cetvrti
## [1] "cet"

Брисање елемената:

lista[-1] #приказује листу без првог елемента
## [[1]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## [[2]]
## [1] "treci"
## 
## $cetvrti
## [1] "cet"

Брисање елемената, преко услова:

lista[lista!="treci"] #приказује листу без елемената идентички једнаких речи "treci"
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## $cetvrti
## [1] "cet"

Уколико желимо да сачувамо измену, додељујемо листи измењену верзију:

lista<-lista[lista!="treci"]
lista
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## $cetvrti
## [1] "cet"

\(\color{firebrick}{\text{3. DATA FRAMES - базе података }}\)

(data matrix, data set - матрица података)

База података је листа вектора исте дужине, тако да су елементи са истим индексом повезани. Личи на матрицу, где су у једној врсти нпр. подаци о једном елементу узорка (субјекту у експерименту).

Имена врста су јединствена (по томе се разликују елементи).

Креирање базе података из постојећих података, нпр. вектора:

brojevi<-1:12
slova<-letters[1:12]
#креира се ф-јом  DATA.FRAME:
d<-data.frame(brojevi,slova)
d
##    brojevi slova
## 1        1     a
## 2        2     b
## 3        3     c
## 4        4     d
## 5        5     e
## 6        6     f
## 7        7     g
## 8        8     h
## 9        9     i
## 10      10     j
## 11      11     k
## 12      12     l

Приступање елементима преко $:

d$brojevi
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
d$slova
##  [1] a b c d e f g h i j k l
## Levels: a b c d e f g h i j k l

Колонама можемо доделити имена различита од почетних при креирању базе, на пример:

d<-data.frame(br=brojevi,sl=slova)
d
##    br sl
## 1   1  a
## 2   2  b
## 3   3  c
## 4   4  d
## 5   5  e
## 6   6  f
## 7   7  g
## 8   8  h
## 9   9  i
## 10 10  j
## 11 11  k
## 12 12  l

Имена се могу и наканадно изменити:

names(d)<-c("kol1","kol2")
d
##    kol1 kol2
## 1     1    a
## 2     2    b
## 3     3    c
## 4     4    d
## 5     5    e
## 6     6    f
## 7     7    g
## 8     8    h
## 9     9    i
## 10   10    j
## 11   11    k
## 12   12    l
d$kol1
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
d$kol2
##  [1] a b c d e f g h i j k l
## Levels: a b c d e f g h i j k l

Коришћењем функције attach, елементима можемо да приступамо без навођења имена базе.

attach(d)
kol1
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12
kol2
##  [1] a b c d e f g h i j k l
## Levels: a b c d e f g h i j k l
#уколико већ имамо променљиву kol1 нпр, ван базе, онда ће се при позиву  kol1 исписати она (masking)
kol1<-"kolona"
kol1
## [1] "kolona"
#за поништавање ф-је ATTACH користи се ф-ја DETACH:
detach(d)

Индескирање базе података

Још један начин издвајања података из базе је преко матричне нотације d[i,j]:

d
##    kol1 kol2
## 1     1    a
## 2     2    b
## 3     3    c
## 4     4    d
## 5     5    e
## 6     6    f
## 7     7    g
## 8     8    h
## 9     9    i
## 10   10    j
## 11   11    k
## 12   12    l
d[1,2]
## [1] a
## Levels: a b c d e f g h i j k l
d[1,] #враћа прву врсту
##   kol1 kol2
## 1    1    a
d[1] #враћа базу података која садржи прву колону d
##    kol1
## 1     1
## 2     2
## 3     3
## 4     4
## 5     5
## 6     6
## 7     7
## 8     8
## 9     9
## 10   10
## 11   11
## 12   12
d[,1] #враћа саму ту колону
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12

Условна селекција у бази података

d[d$kol1<5,]
##   kol1 kol2
## 1    1    a
## 2    2    b
## 3    3    c
## 4    4    d

Додавање вектора у базу података

Користићемо ургађену базу SLEEP.

data(sleep) #учитава базу у текући session у R-у
sleep #исписује
##    extra group ID
## 1    0.7     1  1
## 2   -1.6     1  2
## 3   -0.2     1  3
## 4   -1.2     1  4
## 5   -0.1     1  5
## 6    3.4     1  6
## 7    3.7     1  7
## 8    0.8     1  8
## 9    0.0     1  9
## 10   2.0     1 10
## 11   1.9     2  1
## 12   0.8     2  2
## 13   1.1     2  3
## 14   0.1     2  4
## 15  -0.1     2  5
## 16   4.4     2  6
## 17   5.5     2  7
## 18   1.6     2  8
## 19   4.6     2  9
## 20   3.4     2 10
#додајемо колону бројева 20,19,18,...1:
cbind(sleep,seq(20,1,-1))
##    extra group ID seq(20, 1, -1)
## 1    0.7     1  1             20
## 2   -1.6     1  2             19
## 3   -0.2     1  3             18
## 4   -1.2     1  4             17
## 5   -0.1     1  5             16
## 6    3.4     1  6             15
## 7    3.7     1  7             14
## 8    0.8     1  8             13
## 9    0.0     1  9             12
## 10   2.0     1 10             11
## 11   1.9     2  1             10
## 12   0.8     2  2              9
## 13   1.1     2  3              8
## 14   0.1     2  4              7
## 15  -0.1     2  5              6
## 16   4.4     2  6              5
## 17   5.5     2  7              4
## 18   1.6     2  8              3
## 19   4.6     2  9              2
## 20   3.4     2 10              1
#исто тако можемо додати и врсту:
rbind(sleep,c(2.0,1,1))
##    extra group ID
## 1    0.7     1  1
## 2   -1.6     1  2
## 3   -0.2     1  3
## 4   -1.2     1  4
## 5   -0.1     1  5
## 6    3.4     1  6
## 7    3.7     1  7
## 8    0.8     1  8
## 9    0.0     1  9
## 10   2.0     1 10
## 11   1.9     2  1
## 12   0.8     2  2
## 13   1.1     2  3
## 14   0.1     2  4
## 15  -0.1     2  5
## 16   4.4     2  6
## 17   5.5     2  7
## 18   1.6     2  8
## 19   4.6     2  9
## 20   3.4     2 10
## 21   2.0     1  1

За приказ уопштених података о бази користи се функција SUMMARY.

data(InsectSprays)
summary(InsectSprays) 
##      count       spray 
##  Min.   : 0.00   A:12  
##  1st Qu.: 3.00   B:12  
##  Median : 7.00   C:12  
##  Mean   : 9.50   D:12  
##  3rd Qu.:14.25   E:12  
##  Max.   :26.00   F:12

За веће базе, могу се користити функције head и tail, за приказ првих, односно последњих шест редова:

head(InsectSprays)
##   count spray
## 1    10     A
## 2     7     A
## 3    20     A
## 4    14     A
## 5    14     A
## 6    12     A
tail(InsectSprays)
##    count spray
## 67    13     F
## 68    10     F
## 69    26     F
## 70    26     F
## 71    24     F
## 72    13     F

Ако желимо да издвојимо неки подскуп, можемо користити ф-jу SUBSET:

subset(InsectSprays,spray=="A")
##    count spray
## 1     10     A
## 2      7     A
## 3     20     A
## 4     14     A
## 5     14     A
## 6     12     A
## 7     10     A
## 8     23     A
## 9     17     A
## 10    20     A
## 11    14     A
## 12    13     A

Ако желимо да трансформишемо неку од колона, можемо користити ф-ју TRANSFORM:

transform(sleep,abs.extra=abs(extra))
##    extra group ID abs.extra
## 1    0.7     1  1       0.7
## 2   -1.6     1  2       1.6
## 3   -0.2     1  3       0.2
## 4   -1.2     1  4       1.2
## 5   -0.1     1  5       0.1
## 6    3.4     1  6       3.4
## 7    3.7     1  7       3.7
## 8    0.8     1  8       0.8
## 9    0.0     1  9       0.0
## 10   2.0     1 10       2.0
## 11   1.9     2  1       1.9
## 12   0.8     2  2       0.8
## 13   1.1     2  3       1.1
## 14   0.1     2  4       0.1
## 15  -0.1     2  5       0.1
## 16   4.4     2  6       4.4
## 17   5.5     2  7       5.5
## 18   1.6     2  8       1.6
## 19   4.6     2  9       4.6
## 20   3.4     2 10       3.4

За сортирање базе података користи се функција order(), именовањем једног или више поља на основу којих би требало извршити сортирање.

data(trees)
d <- trees
d[order(d$Height, d$Girth),]
##    Girth Height Volume
## 3    8.8     63   10.2
## 20  13.8     64   24.9
## 2    8.6     65   10.3
## 7   11.0     66   15.6
## 14  11.7     69   21.3
## 1    8.3     70   10.3
## 19  13.7     71   25.7
## 4   10.5     72   16.4
## 24  16.0     72   38.3
## 16  12.9     74   22.2
## 23  14.5     74   36.3
## 8   11.0     75   18.2
## 10  11.2     75   19.9
## 15  12.0     75   19.1
## 12  11.4     76   21.0
## 13  11.4     76   21.4
## 25  16.3     77   42.6
## 21  14.0     78   34.5
## 11  11.3     79   24.2
## 9   11.1     80   22.6
## 22  14.2     80   31.7
## 28  17.9     80   58.3
## 29  18.0     80   51.5
## 30  18.0     80   51.0
## 5   10.7     81   18.8
## 26  17.3     81   55.4
## 27  17.5     82   55.7
## 6   10.8     83   19.7
## 17  12.9     85   33.8
## 18  13.3     86   27.4
## 31  20.6     87   77.0

Сортирање на основу већег броја критеријума врши се прослеђивањем вишеструких аргумената функцији order(). Друга променљива се користи када се о уређењу не може одлучити на основу прве променљиве. Сортирање се по default-у врши у растућем поретку. Поредак сортирања може се променити, тј. може се вршити сортирање у опадајућем поретку, додавањем знака минус испред променљиве.

d[order(d$Height, -d$Girth),]
##    Girth Height Volume
## 3    8.8     63   10.2
## 20  13.8     64   24.9
## 2    8.6     65   10.3
## 7   11.0     66   15.6
## 14  11.7     69   21.3
## 1    8.3     70   10.3
## 19  13.7     71   25.7
## 24  16.0     72   38.3
## 4   10.5     72   16.4
## 23  14.5     74   36.3
## 16  12.9     74   22.2
## 15  12.0     75   19.1
## 10  11.2     75   19.9
## 8   11.0     75   18.2
## 12  11.4     76   21.0
## 13  11.4     76   21.4
## 25  16.3     77   42.6
## 21  14.0     78   34.5
## 11  11.3     79   24.2
## 29  18.0     80   51.5
## 30  18.0     80   51.0
## 28  17.9     80   58.3
## 22  14.2     80   31.7
## 9   11.1     80   22.6
## 26  17.3     81   55.4
## 5   10.7     81   18.8
## 27  17.5     82   55.7
## 6   10.8     83   19.7
## 17  12.9     85   33.8
## 18  13.3     86   27.4
## 31  20.6     87   77.0

\(\color{firebrick}{\text{3.1. Учитавање података}}\)

Табеларни подаци у текстуалном документу се могу учитати као база података помоћу функциjе read.table(“putanja/ime_fajla.txt”,header=T). Аргумент header=T означава да прву врсту не пoсматра као податке већ као header.

Уколико су подаци у CSV документу, односно Excel-у, користи се функција read.csv(), односно read.xls().


\(\color{firebrick}{\text{4. ТАБЕЛЕ}}\)

Код експерименталних података често се поjављуjу категоричке променљиве, коjе указуjу на неку потподелу података у групе. Њих у R-у означавамо као факторе (factors). Исправност многих анализа у R-у зависи од коректног препознавања фактора, нпр. функциjа table() ради само са категоричким променљивим.

table(trees$Height) #добија се табела са бројевима дрвећа у узорку одговарајуће висине
## 
## 63 64 65 66 69 70 71 72 74 75 76 77 78 79 80 81 82 83 85 86 87 
##  1  1  1  1  1  1  1  2  2  3  2  1  1  1  5  2  1  1  1  1  1

\(\color{firebrick}{\text{5.1. Графички приказ података}}\)

Графичке могућности су важна и изузетно разноврсна компонента R-овог окружења. Обезбеђене су функциjе за генерисање различитих статистичких графика од података, као и флексибилно окружење за модификовање детаља на графицима.


\(\color{firebrick}{\text{5.1.1. The pie chart}}\)

share = c(.2090,.1980,.1210,.0930,.3780)
names(share)<-("brand"=c("Samsung","Apple","Huawei","Xiaomi","Other"))
share
## Samsung   Apple  Huawei  Xiaomi   Other 
##   0.209   0.198   0.121   0.093   0.378
pie(share, main="")

pie(share, col = rainbow(5), clockwise = TRUE, main = "pitica")

library(plotrix)
pie3D(share, explode = 0.2, main = "3D pitica", labels= names(share), labelcex = 1)


\(\color{firebrick}{\text{5.1.2. The bar chart}}\)

VADeaths
##       Rural Male Rural Female Urban Male Urban Female
## 50-54       11.7          8.7       15.4          8.4
## 55-59       18.1         11.7       24.3         13.6
## 60-64       26.9         20.3       37.0         19.3
## 65-69       41.0         30.9       54.6         35.1
## 70-74       66.0         54.3       71.1         50.0
barplot(VADeaths)

barplot(t(VADeaths), col=rainbow(10))


\(\color{firebrick}{\text{5.1.3. Функциjа plot()}}\)

Ако су x и y вектори, plot(x, y) за резултат има тачкасти график (scatterplot) y-а у зависности од x-а. Исти учинак може се произвести прослеђивањем само jедног аргумента xy функциjи plot(), коjи jе, у том случаjу, листа са два вектора или матрица са две колоне.

plot(cbind(trees$Girth, trees$Height), xlab="Obim", ylab="Visina")

Ако jе x временска сериjа (time series), резултат jе граф временске сериjе; ако jе x нумерички вектор на излазу се добиjа график вредности тог вектора у зависности од индекса у вектору.

data(AirPassengers)
AP<-AirPassengers
plot(AP, xlab="vreme", ylab="Broj putnika na letovima (u hiljadama)")

За генериcање distribution plots променљивих у бази:

plot(trees)

а може се користити и функција pairs()

pairs(trees, col=rainbow(3))


\(\color{firebrick}{\text{5.1.4. Хистограм}}\)

Хистограм jе наjjедноставниjа непараметарска “оцена” густине расподеле. Функциjа hist(x), где jе x нумерички вектор jе наредба за исцртавање хистограма. То jе посебна врста графика са bar-овима, коjа се користи за приказ расподеле фреквенциjа низа (непрекидних) нумеричких вредности.

Од опционалних аргумената важно jе издвоjити:

  • nclass постављањем на одређену вредност корисник може да препоручи жељени (разуман) броj bar-ова;

  • breaks (breaks= “Sturges” / breaks=“Scott” / breaks=“Freedman-Diaconis”) могу се тачно задати броj bar-ова, односно граничне тачке bar-ова;

  • prob=T вредности на y-оси представљаjу релативне, а не апсолутне фреквенциjе.

hist(airquality$Ozone)

 hist(airquality$Ozone, breaks=15, prob=T, ylim=c(0, 0.025), ylab="Relativna frekvencija")

mean.ozone <- mean(airquality$Ozone, na.rm=T)
sd.ozone <- sd(airquality$Ozone, na.rm=T)
hist(airquality$Ozone, breaks=15, prob=T, ylim=c(0, 0.025), xlab="Ozone", ylab="Gustina", main="Histogram sa grafikom gustine normalne raspodele")
curve(dnorm(x, mean=mean.ozone, sd=sd.ozone), add=T)