##########################################################################################
################################## SOFTWARE R - CAST 1 ###################################
##########################################################################################

# software R volne stazitelny z https://cran.r-project.org/

# Nastaveni pracovniho adresare (kam se budou ukladat data/skripty) 
getwd() # zjistime aktualni nastaveni 
setwd("c:/Users/brozova/Desktop/vyuka/2017/BIMAT/1. cviceni/")# zmenime aktualni nastaveni (nezapomente zamenit lomitka: "\" za "/")

###########################################################################
###############         Nacteni dat a jejich kontrola       ###############
###########################################################################

readLines("Data_pro_R.txt",3) # nacteni prvnich 3 radku textoveho souboru
# prikaz readLines vhodny na zkontrolovani:
# 1) typu oddelovace sloupcu - zde tabulator -> v read.table bude: sep="\t"
# 2) zda jsou v souboru pouzity desetinne carky ci tecky - zde tecky -> v read.table bude: dec="."
# 3) zda ma soubor hlavicku - zde ma soubor hlavicku -> v read.table bude: header=T

kardio <- read.table(file="Data_pro_R.txt", sep="\t", dec=".", header=T) # nacteni dat

dim(kardio)                       # pocet radku a sloupcu datove matice
nrow(kardio)                      # pocet radku datove matice
ncol(kardio)                      # pocet sloupcu datove matice
names(kardio);colnames(kardio)    # nazvy promennych
row.names(kardio)                 # nazvy radku v datove matici
head(kardio)                      # prvnich 10 radku tabulky
tail(kardio)                      # poslednich 10 radku tabulky
str(kardio)                       # sumarni informace o jednotlivych promennych
attach(kardio)                    # na jednotlive promenne v tabulce se nemusime odkazovat napr. pomoci kardio$pohlavi, ale pouze pohlavi
is(kardio);class(kardio)          # typ objektu

# cilene byla u prvniho pacienta nahrazena vyska 150 cm za text "stopadesat"
# promennou R nacte jako factor - ordinalni promennou - nutno prevest na numerickou
kardio$vyska
mean(kardio$vyska)

# jak prevest factor na numeric - spatne! 
kardio$vyska_numeric<-as.numeric(kardio$vyska)
kardio$vyska_numeric
mean(kardio$vyska_numeric)

# jak prevest factor na numeric - spravne! 
kardio$vyska_character_numeric<-as.numeric(as.character(kardio$vyska))
kardio$vyska_character_numeric
kardio$vyska_character_numeric[1]<-150 #doplni puvodni spravnou hodnotu
mean(kardio$vyska_character_numeric)
kardio$vyska<-kardio$vyska_character_numeric #nahradi puvodni promennou novou se spravnymi hodnotami
mean(kardio$vyska)

# cyklus nalezne vsechny promenne ulozene jako factor a prevede je na textovy retezec
for (i in 1:ncol(kardio)) {
  if (is.factor(kardio[,i])) {
    kardio[,i]<-as.character(kardio[,i])
  }
}
str(kardio) # kontrola - factor byl nahrazen za character (chr)

data.entry(kardio)                # zobrazeni datove tabulky; hodnoty je mozne editovat, ale nedoporucuje se
class(kardio)                     # objekt kardio je prikazem data.entry zmenen na "list"
kardio <- as.data.frame(kardio)   # zmenime zpet na "data.frame", aby se s daty dalo dále pracovat
str(kardio) 			    # prikaz as.data.frame zmenil typ character opet na typ factor

###########################################################################
###############   Vyhledavani funkci a napoveda k funkcim   ###############
###########################################################################

# vyhledavani funkci - 2 ekvivaletni zpusoby:
help.search("read")
??read

# napoveda k funkcim - 2 ekvivaletni zpusoby:
help(read.table)
?read.table

## Ukol 1: Pomoci napovedy zjistete, jak je mozne vypsat prvnich 20 radku tabulky.


###########################################################################
###############                  Indexovani                 ###############
###########################################################################

# vypsani hodnot veku u vsech pacientu (nasledujici 3 prikazy jsou ekvivalentni):
kardio$vek 
kardio[,"vek"]
kardio[,2]

# vypsani hodnot veku u prvnich 10 pacientu (nasledujici 3 prikazy jsou ekvivalentni):
kardio$vek[1:10]
kardio[1:10,"vek"]
kardio[1:10,2]

# vyber vsech sloupcu krome prvniho:
dim(kardio)
names(kardio)
kardio.pom <- kardio[,-1]
dim(kardio.pom)
names(kardio.pom)

# vyber vsech sloupcu krome druheho a pateho
kardio.pom <- kardio[,-c(2,5)]
dim(kardio.pom)
names(kardio.pom)

# vytvoreni nove datove tabulky, kde budou pouze zeny (nasledujici 2 prikazy jsou ekvivalentni):
kardio.zeny <- kardio[which(kardio$pohlavi_rek=="Z"),]
kardio.zeny <- subset(kardio,pohlavi_rek=="Z")
dim(kardio.zeny)

## Ukol 2:
# 1. Vytvorte datovou tabulku, ktera bude obsahovat pouze muze. Kolik ma tato nova tabulka radku (tzn. kolik je muzu v souboru)?
# 2. Vytvorte datovou tabulku, ktera bude obsahovat nekuraky (nekuraci jsou oznaceni hodnotou "2"). Kolik ma tato nova tabulka radku?
# 3. Vytvorte datovou tabulku, ktera bude obsahovat parametry: id, vek, pohlavi_rek
# 4. Vypiste hodnoty vahy u 50. az 70. pacienta.
# 5. Vypiste hodnoty pohlavi u 5., 12. a 40. pacienta (pouzijte promennou pohlavi_rek).
# 6. vypiste hodnoty vysky u kazdeho 10. pacienta (napoveda: vyuzijte funkce "seq").

###########################################################################
###############        Pridani a odstraneni promenne        ###############
###########################################################################

# pridani promenne (nasledujici 2 prikazy jsou ekvivalentni):
kardio$log.vaha <- log(kardio$vaha)
kardio <- transform (kardio, log.vaha=log(vaha))
dim(kardio)
names(kardio)

# odstraneni promenne (nasledujici 2 prikazy jsou ekvivalentni): 
kardio$log.vaha <- NULL      
kardio <- kardio [,-ncol(kardio)]      
dim(kardio)
names(kardio)

## Ukol 3: 
# 1. Pridejte do datove tabulky promennou se zlogaritmovanou vyskou.
# 2. Pridejte do datove tabulky promennou s vyskou v metrech.

###########################################################################
#########      Sumarizace promennych - prvni pohled na data       #########
###########################################################################

# sumarizace kategorialnich promennych:
summary(kardio$pohlavi)           # je patrne, ze u jedne zeny je misto "Z" zadano "F" - vytvorila jsem proto novou promennou "pohlavi_rek", ktera obsahuje jen "Z" a "M" (pozdeji si ukazeme, jak promennou "pohlavi_rek" vytvorit)
summary(kardio$pohlavi_rek)
levels(kardio$pohlavi_rek)        # vypise jen kategorie

# sumarizace spojitych promennych:
summary(kardio$vek)               # je patrne, ze funkce summary pozna typ promenne a podle toho vypise vysledek sumarizace
summary(kardio$vek_chybny)        # co je na promenne vek_chybny spatne? Je tam odlehla hodnota - vsimnete si, ze median zustava stejny, ale prumer se hodne zmeni

# bez ohledu na typ promennych lze aplikovat na cely datovy soubor:
summary(kardio)

## Ukol 4: Sumarizujte vysku.

###########################################################################
#############       Vizualizace promennych pomoci grafu       #############
###########################################################################

# zapnuti nahravani historie vykreslenych grafu: kliknout na graficke okno -> History -> Recoding (pomoci Page Up/Down preskakuje mezi grafy))

############# vizualizace kategorialnich promennych:

# kolacovy graf
pie(summary(kardio$pohlavi_rek))  
pie(summary(kardio$pohlavi),clockwise=T,init.angle=90)

# sloupcovy graf
kardio$vzdelani<-factor(kardio$vzdelani,levels=c("zakladni","stredoskolske","vysokoskolske"))# prekodovani, aby sly kategorie logicky za sebou
barplot(summary(kardio$vzdelani),xlab="Vzdelani",ylab="Pocet pacientu",ylim=c(0,60)) 

############# vizualizace spojitych promennych:

boxplot(kardio$vaha)              		# krabicovy graf
boxplot(kardio$vek_chybny)        		# je patrne, ze je tu odlehla hodnota
boxplot(kardio$vaha~kardio$pohlavi_rek)   # krabicovy graf vahy podle pohlavi

hist(kardio$vaha)                 		# histogram (pocet sloupcu je vypocitan pomoci Sturgesova pravidla)
hist(log(kardio$vaha))            		# histogram pro zlogaritmovanou vahu
hist(kardio$vek_chybny)

# vykresleni histogramu s krivkou hustoty normalniho rozdeleni a jeho ulozeni:
windows() # otevre nove graficke okno

x <- kardio$vyska
h<-hist(x, breaks=10, col="yellow", xlab="vyska",
        main="Histogram s krivkou hustoty normalniho rozdeleni")# vykresli hostogramu
xfit<-seq(min(x),max(x),length=40)
yfit<-dnorm(xfit,mean=mean(x),sd=sd(x))
yfit <- yfit*diff(h$mids[1:2])*length(x)
lines(xfit, yfit, col="blue", lwd=2) # prolozi gaussovu krivku

savePlot("Graf_01", type="jpg", device = dev.cur(),restoreConsole = TRUE)# ulozi graf
dev.off() # zavre okno

## Ukol 5
# 1. Vykreslete krabicovy graf veku podle pohlavi.
# 2. Vykreslete kolacovy graf pro pohlavi, kde zeny budou mit cervenou barvu a muzi modrou barvu.
# 3. Vykreslete kolacovy graf pro koureni (napoveda: numerickou promennou je nutne prevest na faktor pomoci funkce factor
# s parametry levels=c(0,1,2),labels=c("nekurak","prilezitostny kurak","kurak") ).


###########################################################################
#############              Rekodovani promennych              #############
###########################################################################

# vytvoreni nove promenne "pohlavi_rek2", ktera bude obsahovat pouze hodnoty "F" a "M":
summary(kardio$pohlavi)
kardio$pohlavi_rek2 <- kardio$pohlavi # rekodovani nove promenne
kardio$pohlavi_rek2[which(kardio$pohlavi=="F")] <- "Z" 
table(kardio$pohlavi_rek2) # overeni, ze promenna pohlavi_rek2 obsahuje pouze hodnoty "Z" a "M"

# vytvoreni kategorii ze spojite promenne:
kardio$vek.2kat <- kardio$vek>=50 # vytvoreni dvou kategorii: 0(FALSE)...<50, 1(TRUE)...>=50
table(kardio$vek.2kat) #overeni
kardio$vek.3kat <- 1+(kardio$vek>=30)+(kardio$vek>=50) # vytvoreni trech kategorii: 1...<30, 2...30-50, 3...>=50 
table(kardio$vek.3kat) #overeni

# slouceni kategorii u kategorialni promenne:
install.packages("car")
library(car) 

table(kardio$cel_chol_norma,useNA="ifany") # 0...pod normou, 1...v norme, 2...nad normou, <NA>...chybejici hodnota
kardio$cel.chol.mimo.normu <- recode(kardio$cel_chol_norma,'c(0,2)=1;1=0;else=99') # 0...v norme, 1...mimo normu, 99...chybejici hodnoty
table(kardio$cel.chol.mimo.normu)

## Ukol 6. 
# 1. Vykreslete histogram vahy a navrhnete nejlepsi rozdeleni vahy do trech skupin.
# 2. Rekodujte promennou "pohlavi" tak, aby muzi meli hodnotu 1 a zeny hodnotu 0.
# 3. Rekodujte promennou "koureni", ktera obsahuje kategorie 0..nekurak, 1..prilezitostny kurak, 2..kurak tak, aby nova promenna obsahovala dve kategorie: 1..kurak x 0..nekurak.

###########################################################################
#####################        Popisne statistiky       #####################
###########################################################################

############### Popisna statistika kategorialnich promennych ##############

# frekvencni tabulka pro jednu promennou:
table(kardio$pohlavi_rek,useNA="ifany") # frekvencni tabulka - pocty
prop.table(table(kardio$pohlavi_rek))   # frekvencni tabulka - procenta

# kontingencni tabulka pro dve promenne:
kt <- table(kardio$pohlavi_rek,kardio$koureni,useNA="ifany") # pohlavi: M..muz,Z..zena; koureni:0..nekurak,1..prilezitostny kurak,2..kurak 
kt
addmargins(kt)                    # pridani souctu radku a sloupcu

# kontingencni tabulka procent:
kt.procenta <- prop.table(kt)     # kontingencni tabulka procent (procenta z celkoveho poctu)
addmargins(kt.procenta)
kt.procenta <- prop.table(kt,1)   # kontingencni tabulka procent (radkova procenta)
addmargins(kt.procenta)
kt.procenta <- prop.table(kt,2)   # kontingencni tabulka procent (sloupcova procenta)
addmargins(kt.procenta)

cbind(kt,kt.procenta) # slouceni absolutnich hodnot se sloupcovami procenty
write.table(cbind(kt,kt.procenta),file="Tab1.csv",sep=";",row.names=T) # ulozeni tabulky do textoveho souboru
# Pozor! Pri otevreni souboru v Excelu je horni radek o jednu bunku posunuty! 

## Ukol 7.  
#Sumarizujte vysku podle pohlavi (vysku vhodne kategorizujte: 1...<170, 2...170-180, 3...>=180). Dale vytvorte kontingencni tabulku 
#procent, z niz bude patrne, zda se v jednotlivych vyskovych kategoriich zeny a muzi lisi.



############### Popisna statistika spojitych promennych ###################

# popisna statistika jedne promenne:
summary(kardio$vek)
summary(kardio$vek_chybny)          # pokud je v souboru odlehla hodnota, prumer je touto odlehlou hodnotou ovlivneny (je to videt ze srovnani sumarizace promennych vek a vek_chybny)

# smerodatna odchylka:
sd(kardio$vek)
sd(kardio$vek_chybny)               # pokud je v souboru odlehla hodnota, i smerodatna odchylka je touto odlehlou hodnotou ovlivnena

# popisna statistika spojite promenne podle kategorialni promenne:
summary(kardio$vek[kardio$pohlavi=="M"])
summary(kardio$vek[kardio$pohlavi=="Z"])

# popisna statistika spojite promenne podle kategorialni promenne v jednom vystupu:
aggregate(kardio$vek ~ kardio$pohlavi_rek, FUN = function(x) c(M=mean(x),Med=median(x), SD=sd(x)))

# vytvareni hezcich tabulek:
install.packages("Epi")
library(Epi)
pp<-stat.table(pohlavi_rek,contents=list(count(vek),mean(vek),median(vek),min(vek),max(vek)),data=kardio) # N, prumer, median, minimum a maximum veku podle pohlavi
pp

# uprava popisku sloupcu, aby tabulka vypadala lepe:
pp<-stat.table(index=list("Pohlavi"=pohlavi_rek),contents=list(N=count(vek),"Prumer"=mean(vek),"Median"=median(vek),"Minimum"=min(vek),"Maximum"=max(vek)),data=kardio)
pp

# ulozeni tabulky do promenne, prevod na typ "data frame" a ulozeni do textoveho souboru:
tab1 <- stat.table(index=list("Pohlavi"=pohlavi_rek),contents=list(N=count(vek),"Prumer"=mean(vek),"Median"=median(vek),"Minimum"=min(vek),"Maximum"=max(vek)),data=kardio) # ulozeni do promenne tab1
tab1 <- as.data.frame(t(tab1))    # prevod na typ "data frame"; je nutne tab1 transponovat pomoci t()
tab1[,2]<-round(tab1[,2],1)       # zaokrouhleni prumeru na jedno desetinne misto
write.table(tab1,file="Tab2.csv",sep=";",row.names=TRUE) # ulozeni tabulky do textoveho souboru
# Pozor! Pri otevreni souboru v Excelu je horni radek o jednu bunku posunuty!


#seznam funkci pro popisnou statistiku:
x <- kardio$vek
length(x)                         # pocet prvku promenne x
mean(x)                           # prumer
median(x)                         # median
min(x)                            # minimum
max(x)                            # maximum
range(x)                          # rozsah hodnot promenne x
c(min(x),max(x))                  # stejny vysledek jako range(x)
var(x)                            # rozptyl
sd(x)                             # smerodatna odchylka
quantile(x,0.25)                  # 1. kvartil (tzn. 25. percentil)
quantile(x,0.5)                   # 2. kvartil (tzn. 50. percentil) - totez co median(x) 
quantile(x,0.75)                  # 3. kvartil (tzn. 75. percentil)
sum(x)                            # suma hodnot x
prod(x)                           # soucin hodnot x

# POZOR! Funkci musime pomoci na.rm=T rici, aby byly chybejici hodnoty vynechany z hodnoceni, jinak se statistika nespocita

x <- kardio$hdl_cholesterol
mean(x) # prumer se nespocita, protoze promenna "hdl_cholesterol" obsahuje alespon jednu hodnotu NA
mean(kardio$hdl_cholesterol,na.rm=T) 

