Статистички софтвер 1: Увод у R

Стефан Малбашић, Математички факултет, Универзитет у Београду

Обавезе:

  • писмени део испита састоји се од 3 теста (10+15+15 поена), по један након сваке од тематских целина, при чему је могуће надокнадити један, два или целокупно градиво обухваћено тестовима у испитном року Јануар 1,
  • семинарски рад који вреди 60 поена.

Литература:

  • W. N. Venables, D. M. Smith, An Introduction to R.
  • A Krause, M. Olson, The basics of S-PLUS, Springer, New York, 2005.
  • Peter Dalgaard, Introductory Statistics with R, Springer - Verlag, New York, 2002.
  • John M.Chambers, Software for Data Analysis: Programming with R, Springer - Verlag, New York, 2008.

Додатна литерaтура

R и RStudio

Основне функције

Рачунање израза:

4+4
(2*2)+1
5/0

Елементарне функције: exp(), cos(), sin(), tan(), log(), log10(), sqrt(),...

Аритметички оператори: +,-,*,/,...

Логички оператори: <=, >=, ==, !=, <, >, &, |, !,...

Ако нас занима више о некој функцији:

help(cos) # ili 
?cos
example(exp)

Пречица за покретање линије кода (за окружење RStudio): Ctrl+Enter

Све од знака # до краја реда је коментар.

Променљиве

Подаци се у R чувају у променљивим. Приликом декларације променљиве не наводимо тип променљиве, већ јој само додељујемо вредност. Име променљиве може да садржи слова, бројеве и тачку, али је битно да почиње словом. R је case sensitive програмски језик, дакле X!=x.

  • Основни типови података су: numerical, character, logical, вектори, матрице, фактори, базе података.
  • Специјални типови података су: missing values, NULL, NaN, - / + Inf

Оператор доделе у R-у је <- или ->, али може да се користи и оператор =.

x <- 9
9 -> x
assign("x", 9)

Нумеричке променљиве

Променљиве којима додељујемо неке нумеричке вредности. Нумеричке вредности су подразумевано типа double.

x <- 3 # isto sto i 3 -> x
x # ispisivanje vrednosti
## [1] 3

Овако декларисану променљиву можемо користити и различитим изразима:

x+x
x+3
exp(x^2)

Променњиве типа character

Променњиве типа character су променљиве које садрже неке стрингове.

x <- "promenljiva" 
x
## [1] "promenljiva"

Логичке променњиве

Променљиве логичког типа могу да имају вредности TRUE или FALSE (или краће исто што и T или F, редом).

temp <- TRUE 
temp #ili
## [1] TRUE
temp <- T 
temp
## [1] TRUE

Логичке променњљиве се добијају и као резултат релацијских израза:

3 < 4
3 != 3
x < -(2<4) & (3==3)
## [1] FALSE
x
## [1] "promenljiva"

Провера типа података

is.numeric(x)
is.character(x)
is.logical(x)

Вектори

  • начин представљања низова у R-у
  • индексирање почиње од 1

Начини задавања вектора:

  1. функција COMBINE
v <- c(10.4, 5.6, 3.1, 6.4, 21.7)
# c(10.4, 5.6, 3.1, 6.4, 21.7) -> v
# assign("v", c(10.4, 5.6, 3.1, 6.4, 21.7))
v
## [1] 10.4  5.6  3.1  6.4 21.7
  1. задавањем почетног и крајњег елемента низа
v <- 1:30
v
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
## [26] 26 27 28 29 30
  1. функција SEQUENCE

Задајемо почетни и крајњи елемент вектора ако желиммо да се сваки следећи елемент увећа за 1.

v <- seq(from = 5, to = 25) 
# v<-seq(5, 25)
v
##  [1]  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25

Ако желимо да корак буде различит од 1, наводимо корак као трећи аргумент функције seq(). За многе функције постоје опциони аргументи који ако се експлицитно не наведу у позиву функције, узимају неку default вредност. Овде је та вредност 1.

v1 <- seq(from = 5, to = 25, by = 5)
v1
## [1]  5 10 15 20 25
v2 <- seq(0, 1, 0.1)
v2
##  [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
v3 <- seq(length = 51, from = -5, by = 0.2)
v3
##  [1] -5.0 -4.8 -4.6 -4.4 -4.2 -4.0 -3.8 -3.6 -3.4 -3.2 -3.0 -2.8 -2.6 -2.4 -2.2
## [16] -2.0 -1.8 -1.6 -1.4 -1.2 -1.0 -0.8 -0.6 -0.4 -0.2  0.0  0.2  0.4  0.6  0.8
## [31]  1.0  1.2  1.4  1.6  1.8  2.0  2.2  2.4  2.6  2.8  3.0  3.2  3.4  3.6  3.8
## [46]  4.0  4.2  4.4  4.6  4.8  5.0

Ако желимо опадајући низ, ставимо да корак буде негативан.

v <- seq(10, 1, -1)
v
##  [1] 10  9  8  7  6  5  4  3  2  1

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

v[1]

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

v[2]<-27
v
##  [1] 10 27  8  7  6  5  4  3  2  1

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

v[length(v)+1] <- 0
v
##  [1] 10 27  8  7  6  5  4  3  2  1  0

Издвајање подвектора

Подвектор можемо издвојити навођењем индекса елемената које желимо да издвојимо.

v[1:3]
## [1] 10 27  8
v[c(1,3)] # Podvektor koji sadrzi prvi i treci element
## [1] 10  8

Фукнције скалара примењене на векторе

  • делују на сваки елемент вектора посебно
exp(v)
##  [1] 2.202647e+04 5.320482e+11 2.980958e+03 1.096633e+03 4.034288e+02
##  [6] 1.484132e+02 5.459815e+01 2.008554e+01 7.389056e+00 2.718282e+00
## [11] 1.000000e+00
v+1
##  [1] 11 28  9  8  7  6  5  4  3  2  1
v/2
##  [1]  5.0 13.5  4.0  3.5  3.0  2.5  2.0  1.5  1.0  0.5  0.0

НАПОМЕНА: оператор : има већи приоритет од аритметичких операција

n <- 10
v1 <- 1:n-1
v1
##  [1] 0 1 2 3 4 5 6 7 8 9
v2 <- 1:(n-1)
v2
## [1] 1 2 3 4 5 6 7 8 9

Функције за рад са векторима

length(v)
max(v)
min(v)
range(v)
sort(v)
order(v)
sum(v)
mean(v) # uzoracka sredina
var(v) # popravljena uzoracka disperzija
sd(v) # standardna devijacija

Копија вектора помоћу функције rep() REPLICATE и варијанте ове функције

rep(v)
##  [1] 10 27  8  7  6  5  4  3  2  1  0
rep(v, 5) # novi vektor koji sadrzi 5 nadovezanih kopija pocetnog
##  [1] 10 27  8  7  6  5  4  3  2  1  0 10 27  8  7  6  5  4  3  2  1  0 10 27  8
## [26]  7  6  5  4  3  2  1  0 10 27  8  7  6  5  4  3  2  1  0 10 27  8  7  6  5
## [51]  4  3  2  1  0
# rep(v, times = 5)
rep(v, each = 3) # kopira svaki element 3 puta uzastopno
##  [1] 10 10 10 27 27 27  8  8  8  7  7  7  6  6  6  5  5  5  4  4  4  3  3  3  2
## [26]  2  2  1  1  1  0  0  0
rep(v, length.out = 2) # kopira prva dva elementa
## [1] 10 27

NA вредности - not available

v <- c(1,4,6,NA,23)
sum(v)
## [1] NA

Ако желимо да функција игнорише NA вредности

sum(v, na.rm=T)
## [1] 34

Вектори стрингова

v<-c("aaaa","c","bbb")
sort(v)
## [1] "aaaa" "bbb"  "c"

Логички вектори

  • добијају се као резултат релацијских израза са векторима
v<-c(2,6,3,7,8)
v==1:5 # Poredi svaki element vektora sa odgovarajucim
## [1] FALSE FALSE  TRUE FALSE FALSE
v>3 # Poredi svaki element sa 3
## [1] FALSE  TRUE FALSE  TRUE  TRUE

Операције између два вектора

a<-c(1,2,3,4)
b<-c(2,3,4,5)
r<-a/b
r
## [1] 0.5000000 0.6666667 0.7500000 0.8000000

Графичко приказивање вектора

barplot(v)

  • График зависности вектора
plot(a,b)

plot(b,a)# obrnute ose

Радни простор и резервисање меморије

  • Све текуће променњиве су смештене у workspace-у
ls()
##  [1] "a"    "b"    "n"    "r"    "temp" "v"    "v1"   "v2"   "v3"   "x"
  • Ако желимо да обришемо неку
a <- 3
rm(a)
  • Брисање свих објеката
rm(list=ls())

Матрице

Матрице су дводимензиони вектори. Начини задавања матрица су:

  1. Матрицу правимо од елемената једнодимензионог вектора променом димензија
x <- 1:12
dim(x) <- c(3, 4) # x je sada 2D vektor sa 3 vrste i 4 kolone
x
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
  1. Матрицу формирамо помоћу функције matrix
x<-matrix(1:12, nrow = 3) # nrow = broj vrsta matrice
x
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
x<-matrix(1:12, ncol = 4) # ncol = broj kolona
x
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12

Примећујемо да се при креирању матрице прво попуњава елементима прва колона, па друга, итд. Ако хоћемо да се матрица попуњава по колонама додамо параметар byrow.

x <- matrix(1:12, nrow = 3, byrow = T)
x
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
  1. Матрица се може добити налепљивањем вектора помоћу функција cbind (везује векторе као колоне матрице) и rbind(везује векторе као врсте матрице)
a <- 1:4
a
## [1] 1 2 3 4
b <- 5:8
b
## [1] 5 6 7 8
c <- 9:12
c
## [1]  9 10 11 12
M1 <- cbind(a,b,c)
M1
##      a b  c
## [1,] 1 5  9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
M2 <- cbind(1:4, 5:8, 9:12) # skraceno
M2
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    2    6   10
## [3,]    3    7   11
## [4,]    4    8   12
M3 <- rbind(1:4, 5:8, 9:12)
M3
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12
  • Давање имена колонама и врстама матрице помоћу функција colnames и rownames
rownames(x) <- c('A','B','C')
x
##   [,1] [,2] [,3] [,4]
## A    1    2    3    4
## B    5    6    7    8
## C    9   10   11   12

НАПОМЕНА: У R-у постоји уграђен вектор који садржи слова алфабета.

SLOVA <- LETTERS
SLOVA
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"
slova <- letters
slova
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"

Претходна команда може да изгледа и овако:

rownames(x)<-LETTERS[1:3]
x
##   [,1] [,2] [,3] [,4]
## A    1    2    3    4
## B    5    6    7    8
## C    9   10   11   12

Још неки уграђени вектори за имена врста и колона матрица:

month.name
month.abb
  • Приступање елементима матрице
u <- x[1,2]
u
## A 
## 2
v <- x[3,]
v
## [1]  9 10 11 12
w <- x[,4]
w
##  A  B  C 
##  4  8 12

Операције са матрицама

x<-matrix(c(2, 5, 3, 7, 5, 1, 7, 4, 3), ncol = 3)
t(x) # Transponovana matrica
##      [,1] [,2] [,3]
## [1,]    2    5    3
## [2,]    7    5    1
## [3,]    7    4    3
diag(x) # Samo elementi sa dijagonale
## [1] 2 5 3
det(x) # Determinanta
## [1] -69
solve(x) # Inverzna matrica
##             [,1]       [,2]       [,3]
## [1,] -0.15942029  0.2028986  0.1014493
## [2,]  0.04347826  0.2173913 -0.3913043
## [3,]  0.14492754 -0.2753623  0.3623188
  • Множење матрица
a <- cbind(1:3,4:6,7:9)
b <- cbind(7:9,4:6,1:3)
a*b # Mnozenje elemenata sa istim indeksom
##      [,1] [,2] [,3]
## [1,]    7   16    7
## [2,]   16   25   16
## [3,]   27   36   27
a%*%b # Matricno mnozenje
##      [,1] [,2] [,3]
## [1,]  102   66   30
## [2,]  126   81   36
## [3,]  150   96   42
rowSums(x) # suma po redovima
## [1] 16 14  7
rowMeans(x) # srednja vrednosti po redovima
## [1] 5.333333 4.666667 2.333333
colSums(x) # suma po kolonama
## [1] 10 13 14
colMeans(x) # srednja vrednost po kolonama
## [1] 3.333333 4.333333 4.666667

Фактори

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

  • Пример 1 - пол
pol <- c(0, 0, 1, 0, 1)
fpol <- factor(pol, levels = 0:1) # pol posmatramo kao faktor, cije su moguce vrednosti 0 i 1
fpol
## [1] 0 0 1 0 1
## Levels: 0 1
levels(fpol) <- c("muski", "zenski") # dodeljujemo znacenje levelima faktora
fpol
## [1] muski  muski  zenski muski  zenski
## Levels: muski zenski
levels(fpol)
## [1] "muski"  "zenski"
as.numeric(fpol) #prikazuje kako su leveli kodirani, uvek pocinje od 1 (1,2,..)
## [1] 1 1 2 1 2
  • Пример 2 - степен бола
bol <- c(0, 3, 2, 2, 1) # Pravimo vektor za 5 pacijenata, gde su elementi stepeni bola
fbol <- factor(bol, levels = 0:3) # Pravimo faktor
levels(fbol) <- c("nema", "slab", "umeren", "jak") # Dajemo imena levelima da bismo znali kako da interpretiramo brojeve
fbol
## [1] nema   jak    umeren umeren slab  
## Levels: nema slab umeren jak
as.numeric(fbol) # Dodelio je levelima 1,2,3,4
## [1] 1 4 3 3 2

Ако се изостави параметар levels=..., по default-у се прави фактор од сортираних вредности из вектора. То није увек препоручњиво, на пример ако је вектор стрингова, сортирање је по алфабету.

Листе

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

Пример прављења листе од два вектора.

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[[1]][2]
## [1] 3

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

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
  • Функција која враћа имена елемената
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") # Lista moze sadrzati i druge liste
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)) # Prvo pravimo listu od 2 elementa:
lista
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
lista[[3]] <- "treci" # Dodavanje preko indeksa
# Moguce je dodati novi element i preko imena
lista$cetvrti <- "cet"
lista # Samo cetvrti element liste ima ime i dodat je na kraj liste
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## [[3]]
## [1] "treci"
## 
## $cetvrti
## [1] "cet"
  • Брисање елемената листе
lista[-1] # prikazuje listu bez prvog elementa
## [[1]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## [[2]]
## [1] "treci"
## 
## $cetvrti
## [1] "cet"
lista[lista != "treci"] # prikazuje listu bez elemenata identicnih reci "treci"
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## $cetvrti
## [1] "cet"
lista <- lista[lista != "treci"] # Da sacuvamo izmenu, dodeljujemo listi izmenjenu verziju
lista
## [[1]]
## [1] 1 2 3
## 
## [[2]]
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## 
## $cetvrti
## [1] "cet"