Departamento de Ecologia IB-USP

Objetivos do curso

  • Introduzir o R como linguagem para análises de dados voltados para consultoria ambiental.

  • Revisar conceitos de estatística e as análises mais comuns na área ambiental.

  • Ao final, cada um deverá ser capaz de criar o próprio código para análises de seus dados.

  • Esse curso NÃO pretende:
    • substituir uma disciplina de estatística básica
    • aprofundar-se na programação em R ou outras ferramentas computacionais.

Programação do curso

Aula 1

  • Introdução ao R
  • Leitura e manipulação de dados

Aula 2

  • Análises exploratórias
    • estatística descritiva
    • gráficos exploratórios
  • Criação e edição de gráfico
    • parâmetros gráficos

Aula 3

  • Inferência estatística
  • Modelos lineares
    • Regressão linear simples e múltipla
    • Análise de variância e covariância
  • Modelos lineares generalizados

Aula 4

  • Análises de composição e diversidade em comunidades
    • índices de diversidade, curva do coletor
    • rarefação, estimadores de riqueza
  • Análises multivariadas:
    • PCA e NMDS

Organização do curso

Tempo, o maior problema!!

roteiros mais extensos e com conteúdo mais denso, PRECISAM ser feitos!
não desistir! prestar atenção ao código, deixar ele limpo.
fazendo as aulas e resolvendo problemas na hora

Aula 1

Apresentação

“Uma das coisas mais importantes que você pode fazer é dedicar um tempo para aprender uma linguagem de programação de verdade.

Aprender a programar é como aprender outro idioma: exige tempo e treinamento, e não há resultados práticos imediatos…


quem já conhece/domina alguma linguagem de programação?
lembrar que vamos errar bastante, e que vamos começar do mais básico

Apresentação

… mas se você supera essa primeira subida íngreme da curva de aprendizado, os ganhos são enormes.

Programar não vai apenas livrar você da camisa de força dos pacotes estatísticos, mas também irá aguçar suas habilidades analíticas e ampliar os horizontes de modelagem ecológica e estatística.”

Gotelli & Ellison, 2004. Principios de Estatística em Ecologia. Sunderland, Sinauer.

falar da minha experiência, dificuldade de aprendizado, e as coisas que faço até hoje, como sempre olhar o help e coódigos dos scripts antigos

O que é o R?

  • ambiente e linguagem de programação

"A chave para entender o R é que trata-se de uma linguagem. Uma linguagem para manipular objetos." Bill Venables

"A pergunta certa sobre uma análise em R não é se é possível fazê-la, e sim como fazê-la." Paulo Justiniano Ribeiro

  • linguagem de programação voltada para manipulação, análise e edição gráfica de dados
  • também chamado de programa

Filosofia do R: O código é tudo!

  • Programar com dados, os SEUS dados!

  • Reprodutibilidade

  • Software livre e colaborativo

  • comunidade ativa, muitos pacotes sobre tudo!

há diferentes maneira de fazer a mesma coisa no R

enviar dados e script em relatórios

Uma questão de costume

assim com é com outros programas, usar o R requer costume

vantagem do R é que você mantém o caminho de tudo que fez - refazer análises!

Let´s !

cada vez mais, mais pessoas usam e buscam aprender o R

comunidade muito ativa, grande documentação online

Instalação

Estrutura básica da linguagem R

Primeira coisa a ser feita: NÃO ENTRAR EM PÂNICO!

R no Windows

  • Interface gráfica Rgui
    • editor de texto
    • console
  • Simples, porém pouco prática

Rstudio IDE

problema com instalação?
precisa intalar o R e depois usar o Rstudio
tornar esse programa como padrão para arquivos .R

Configurações Rstudio

abrir o Rstudio e ir mostrando as coisas, as janelas, as facilidades. como criar um novo script

control + R ou control + ENTER - mandar do script para o console

  • Interface mais amigável

  • Visão geral: os 4 painéis

  • Global Options:
    • encoding: UTF-8
    • soft-wrap code

O R como calculadora

2+5           #Soma
## [1] 7
30*7          #Multiplicação
## [1] 210
10/2          #Divisão
## [1] 5
10^2          #Potência
## [1] 100
log(100,10)   #Log na base 10
## [1] 2
exp(1)        # n. euler elevado a 1
## [1] 2.718282
round(1.987645,2) #arredondamento
## [1] 1.99
abs(-1)       #número absoluto
## [1] 1

Precedência de operações e parênteses

2*4^3-1
## [1] 127
2*4^(3-1)
## [1] 32
(2*4)^3-1
## [1] 511
(2*4)^(3-1)
## [1] 64

importância do parênteses!

sempre haverá uma hora que nos esqueceremos dele!

Como criar um objeto

Objeto <- expressão

conta <- 10+2  # Criando
conta          # "Chamando"
## [1] 12
conta*10   # x 10
## [1] 120
conta      # ?
## [1] 12
conta2 <- conta*10   # novo
conta2   #Agora sim salvou a operação
## [1] 120

Fazendo operações com objetos

a <- sqrt(4)
a
## [1] 2
b <- 5
b
## [1] 5
a*b
## [1] 10
d <- c(2,4,6)
d
## [1] 2 4 6
d*b
## [1] 10 20 30

explicar o qué é concatenar

Funções!

função(argumento1=valor1, argumento2=valor2, …)

plot(x=area, y=riqueza, log="xy")

plot(area, riqueza)

log(x=100, base=10)

log(100,10)

Obtendo ajuda!

#Abrindo página geral
help.start()

#Busca de termos no help
help.search("linear regression")
??"linear regression"

#Ajuda para funções específicas
help(mean)
?mean

#Argumentos da função
args(mean)

#Exemplo da função
example(mean)

mostrar no Rstudio onde fica o help, os locais de busca…
também que quando se dá tab ele tenta completar a funcao e ja mostra o basico do help e argumentos –>

Instalando pacotes

  • Diretamente pelo console
install.packages("vegan")
  • Carregando o pacote instalado*
library(vegan)
  • Pelo Rstudio

RBASE + pacotes

instala 1 x
carrega toda vez
library no início do script

Linguagem orientada a objeto

area <- c(100, 235, 449, 98, 147, 214, 346, 89)
riqueza <- c(56, 62 ,70, 33, 49, 67, 71, 45)

summary(area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    89.0    99.5   180.5   209.8   262.8   449.0
summary(riqueza)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   33.00   48.00   59.00   56.62   67.75   71.00

Como o R funciona?

Os objetos criados são mantidos na memória, até que sejam salvos.

Por default, todos os objetos são salvos em um único arquivo oculto no diretório de trabalho, chamado .RData.

Ao sair do programa, o R perguntas se deve salvar as alterações.

Como trabalhar com o R?

Separe cada projeto em um diretório (pasta)
- coloque os arquivos de dados
- inicie o R daquele diretório

Salve seus comandos em um arquivo
- salve o código (scritp) das análises no mesmo diretório.
- o arquivo será um arquivo texto com extensão .R ou .r

fazer um exemplo de criar uma pasta e um projeto dentro dela

Qual o diretório de trabalho atual?

getwd()

Mudando o diretório de trabalho

setwd( "/Users/melinatarituba/git-meme/consultR_curso")

No Rstudio*…

ir pro rstudio e mostrar como faz pra mudar o diretorio pelo menu e pela aba de files (more), como faz pra mandar um script pro console, ctrl+r

ls e rm: listar e remover objetos

ls()

[1] "area" "objeto" "riqueza"

rm(objeto)

ls()

[1] "area" "riqueza"

No Rstudio…

Classes de objetos

class(area)
## [1] "numeric"
x <- c("TRUE","FALSE","TRUE","TRUE")
class(x)
## [1] "character"
x<- as.logical(x)
class(x)
## [1] "logical"

Classe fatores

sexo <- rep(c("F","M"),each=9)
sexo
##  [1] "F" "F" "F" "F" "F" "F" "F" "F" "F" "M" "M" "M" "M" "M" "M" "M" "M"
## [18] "M"
class(sexo)
## [1] "character"
sexo <- as.factor(sexo) # mudando a classe
sexo
##  [1] F F F F F F F F F M M M M M M M M M
## Levels: F M

Níveis de um fator

levels(sexo)
## [1] "F" "M"

Contagem de observações

table(sexo)
## sexo
## F M 
## 9 9

Operações com um vetor

Todas as operações aplicadas a um vetor são aplicadas a cada um de seus elementos

a <- seq(from=0,to=8,by=2)
a
## [1] 0 2 4 6 8
2*a
## [1]  0  4  8 12 16
sqrt(a)
## [1] 0.000000 1.414214 2.000000 2.449490 2.828427

Operações entre vetores

Pareando os elementos

a
## [1] 0 2 4 6 8
b
## [1]  1 15 18  3  6
a+b
## [1]  1 17 22  9 14
a^(1/b)
## [1] 0.000000 1.047294 1.080060 1.817121 1.414214

Comprimento de vetores

length(a)
## [1] 5
length(b)
## [1] 5
length(a)/length(b)
## [1] 1

Funções estatísticas

sum(a)
## [1] 20
mean(a)
## [1] 4
var(a)
## [1] 10
min(a)
## [1] 0
max(a)
## [1] 8

Estas funções operam sobre TODO o vetor, e não elemento a elemento.

Funções estatísticas

a
## [1] 0 2 4 6 8
summary(a)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       2       4       4       6       8

Leitura e Manipulação de Dados

Importando dados

Salvar planilha excel como arquivos .txt ou .csv

avisar que existem alguns pacotes que importam xls xlsx

Leitura de arquivos texto

# arquivo txt com separação tabular
trapa <- read.table(file="../data/trapalhoes.txt", header=T, sep="\n")

#arquivo csv com separação por , ou ;
trapa <- read.table(file="../data/trapalhoes.csv", header=T, sep=";")
trapa
##   codinome nascimento estado vivo altura
## 1     didi       1936     CE    s   1.68
## 2     dede       1936     RJ    s   1.79
## 3   mussum       1941     RJ    n   1.81
## 4 zacarias       1934     MG    n   1.61
class(trapa); dim(trapa)
## [1] "data.frame"
## [1] 4 5

Leitura de dados

Cuidado com separador decimal!

read.table(..., dec = ".") 
read.table(..., dec=",")

Tipos de separador de colunas

read.table(..., sep=";") #csv Brasil
read.table(..., sep="\n") #tabulação
read.table(..., sep=",") #csv internacional

falar da vantagem em modificar o separador de decimal no computador

lembrar de sempre usar o HELP da função read.table, há vários argumentos importantes

SEMPRE verifique sua tabela depois de importar

Onde está o erro?

trapa2<-  read.table(file="../data/trapalhoes.csv", header=T, sep=",")
trapa2
##   codinome.nascimento.estado.vivo.altura
## 1                    didi;1936;CE;s;1.68
## 2                    dede;1936;RJ;s;1.79
## 3                  mussum;1941;RJ;n;1.81
## 4                zacarias;1934;MG;n;1.61
dim(trapa2)
## [1] 4 1

Vendo a estrutura dos dados importados

dim(trapa)
## [1] 4 5
colnames(trapa)
## [1] "codinome"   "nascimento" "estado"     "vivo"       "altura"
rownames(trapa)
## [1] "1" "2" "3" "4"
str(trapa)
## 'data.frame':    4 obs. of  5 variables:
##  $ codinome  : Factor w/ 4 levels "dede","didi",..: 2 1 3 4
##  $ nascimento: int  1936 1936 1941 1934
##  $ estado    : Factor w/ 3 levels "CE","MG","RJ": 1 3 3 2
##  $ vivo      : Factor w/ 2 levels "n","s": 2 2 1 1
##  $ altura    : num  1.68 1.79 1.81 1.61

Colunas com caracteres foram convertidas para factor

Vendo a estrutura dos dados importados

summary(trapa)
##      codinome   nascimento   estado vivo      altura     
##  dede    :1   Min.   :1934   CE:1   n:2   Min.   :1.610  
##  didi    :1   1st Qu.:1936   MG:1   s:2   1st Qu.:1.663  
##  mussum  :1   Median :1936   RJ:2         Median :1.735  
##  zacarias:1   Mean   :1937                Mean   :1.722  
##               3rd Qu.:1937                3rd Qu.:1.795  
##               Max.   :1941                Max.   :1.810

Olhando a tabela de dados

head(trapa, n=2L)
##   codinome nascimento estado vivo altura
## 1     didi       1936     CE    s   1.68
## 2     dede       1936     RJ    s   1.79
tail(trapa, n=2L)
##   codinome nascimento estado vivo altura
## 3   mussum       1941     RJ    n   1.81
## 4 zacarias       1934     MG    n   1.61

Olhando a tabela de dados no Rstudio

Selecionando colunas no data frame $

trapa$codinome
## [1] didi     dede     mussum   zacarias
## Levels: dede didi mussum zacarias
trapa$altura
## [1] 1.68 1.79 1.81 1.61
trapa$estado
## [1] CE RJ RJ MG
## Levels: CE MG RJ

Criando nova coluna

Uso do $ para criar nova coluna

trapa$idade <- 2016 - trapa$nas
trapa
##   codinome nascimento estado vivo altura idade
## 1     didi       1936     CE    s   1.68    80
## 2     dede       1936     RJ    s   1.79    80
## 3   mussum       1941     RJ    n   1.81    75
## 4 zacarias       1934     MG    n   1.61    82

Cuidado para não escolher um nome de coluna já existente!

Criando uma nova coluna a partir de outra

Criando uma coluna do logarítmo de uma variável

trapa$log.alt <- log(trapa$alt)
trapa
##   codinome nascimento estado vivo altura idade   log.alt
## 1     didi       1936     CE    s   1.68    80 0.5187938
## 2     dede       1936     RJ    s   1.79    80 0.5822156
## 3   mussum       1941     RJ    n   1.81    75 0.5933268
## 4 zacarias       1934     MG    n   1.61    82 0.4762342

Substituindo valores nas colunas

trapa$vivo
## [1] s s n n
## Levels: n s
trapa$vivo <- c("TRUE","TRUE", "FALSE", "FALSE")
trapa
##   codinome nascimento estado  vivo altura idade   log.alt
## 1     didi       1936     CE  TRUE   1.68    80 0.5187938
## 2     dede       1936     RJ  TRUE   1.79    80 0.5822156
## 3   mussum       1941     RJ FALSE   1.81    75 0.5933268
## 4 zacarias       1934     MG FALSE   1.61    82 0.4762342

Operações com vetores lógicos e indexação

Operações com vetores lógicos

">" maior que

"<" menor que

"==" igual a

"!=" diferente de

"&" e

"|" ou

Operações com vetores lógicos

altura; sexo
## [1] 1.85 1.78 1.92 1.63 1.81 1.55
## [1] "M" "M" "M" "F" "F" "F"
altura > 1.80
## [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE
machos.altos <- altura > 1.80 & sexo =="M"
machos.altos
## [1]  TRUE FALSE  TRUE FALSE FALSE FALSE
lembrar que o == são 2 e não 1

Operações com vetores lógicos

notas
##  [1]  6.0  5.1  6.8  2.8  6.1  9.0  4.3 10.4  6.0  7.9  8.9  6.8  9.8  4.6
## [15] 11.3  8.0  6.7  4.5

Quantos aprovados?

notas >= 5
##  [1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
## [12]  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE
sum(notas >= 5)
## [1] 14

Vetores lógicos em matrizes

ilhas
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1      4      2      4      4      3      1      4      4
## sp 2      4      0      1      3      4      3      3      1
## sp 3      2      4      5      6      0      2      0      1
## sp 4      5      0      5      0      5      4      2      3
## sp 5      4      0      0      6      0      6      2      3
ilhas.vf = ilhas > 0  ; ilhas.vf
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 2   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 3   TRUE   TRUE   TRUE   TRUE  FALSE   TRUE  FALSE   TRUE
## sp 4   TRUE  FALSE   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE
## sp 5   TRUE  FALSE  FALSE   TRUE  FALSE   TRUE   TRUE   TRUE

Extraindo informação da matriz

ilhas.vf
##      ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8
## sp 1   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 2   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE   TRUE   TRUE
## sp 3   TRUE   TRUE   TRUE   TRUE  FALSE   TRUE  FALSE   TRUE
## sp 4   TRUE  FALSE   TRUE  FALSE   TRUE   TRUE   TRUE   TRUE
## sp 5   TRUE  FALSE  FALSE   TRUE  FALSE   TRUE   TRUE   TRUE

Quantas espécies por ilha?

apply(X=ilhas.vf, MARGIN=2,FUN=sum )
## ilha 1 ilha 2 ilha 3 ilha 4 ilha 5 ilha 6 ilha 7 ilha 8 
##      5      2      4      4      3      5      4      5

Extraindo informação da matriz

Quantas ilhas por espécie?

apply(X=ilhas.vf, MARGIN=1,FUN=sum )
## sp 1 sp 2 sp 3 sp 4 sp 5 
##    8    7    6    6    5

Indexação de vetores usando [ ] para isolar elementos

a
## [1] 0 2 4 6 8
a[1]
## [1] 0
a[5]
## [1] 8
a[1:2]
## [1] 0 2
a[c(1,3,5)]
## [1] 0 4 8

Indexação [linha,coluna] em data frames

dat
##   sexo altura peso
## 1    M   1.85   80
## 2    M   1.78  100
## 3    M   1.92  115
## 4    F   1.63   70
## 5    F   1.81   65
## 6    F   1.55   50
dat[1,]
##   sexo altura peso
## 1    M   1.85   80
dat[,2]
## [1] 1.85 1.78 1.92 1.63 1.81 1.55
dat[1,1]
## [1] M
## Levels: F M
dat[3,3]
## [1] 115

A mesma lógica se aplica em matrizes!

Indexação operações lógicas em data frames

dat
##   sexo altura peso
## 1    M   1.85   80
## 2    M   1.78  100
## 3    M   1.92  115
## 4    F   1.63   70
## 5    F   1.81   65
## 6    F   1.55   50
dat$peso
## [1]  80 100 115  70  65  50
dat$peso[dat$sexo == "M"]
## [1]  80 100 115
dat$peso[dat$sexo == "M" & dat$altura > 1.80]
## [1]  80 115

ficar um tempo nessa, mostrar o script e os resultados de novo no R, ter certeza que aprenderam

Exportando dados write.table()

write.table(trapa,"trapa.csv")

write.csv(trapa,"trapa.csv")

Erros mais comuns no R

  • Nomes de objetos e funções errados
dadoz
ls()
## [1] "dados"
dados
## [1] 23 10 45

Um erro comum

Funções também são objetos, se você digita uma função sem os parênteses, o R vai exibir o conteúdo da função

help
## function (topic, package = NULL, lib.loc = NULL, verbose = getOption("verbose"), 
##     try.all.packages = getOption("help.try.all.packages"), help_type = getOption("help_type")) 
## {
##     types <- c("text", "html", "pdf")
##     if (!missing(package)) 
##         if (is.name(y <- substitute(package))) 
##             package <- as.character(y)
##     if (missing(topic)) {
##         if (!is.null(package)) {
##             help_type <- if (!length(help_type)) 
##                 "text"
##             else match.arg(tolower(help_type), types)
##             if (interactive() && help_type == "html") {
##                 port <- tools::startDynamicHelp(NA)
##                 if (port <= 0L) 
##                   return(library(help = package, lib.loc = lib.loc, 
##                     character.only = TRUE))
##                 browser <- if (.Platform$GUI == "AQUA") {
##                   get("aqua.browser", envir = as.environment("tools:RGUI"))
##                 }
##                 else getOption("browser")
##                 browseURL(paste0("http://127.0.0.1:", port, "/library/", 
##                   package, "/html/00Index.html"), browser)
##                 return(invisible())
##             }
##             else return(library(help = package, lib.loc = lib.loc, 
##                 character.only = TRUE))
##         }
##         if (!is.null(lib.loc)) 
##             return(library(lib.loc = lib.loc))
##         topic <- "help"
##         package <- "utils"
##         lib.loc <- .Library
##     }
##     ischar <- tryCatch(is.character(topic) && length(topic) == 
##         1L, error = identity)
##     if (inherits(ischar, "error")) 
##         ischar <- FALSE
##     if (!ischar) {
##         reserved <- c("TRUE", "FALSE", "NULL", "Inf", "NaN", 
##             "NA", "NA_integer_", "NA_real_", "NA_complex_", "NA_character_")
##         stopic <- deparse(substitute(topic))
##         if (!is.name(substitute(topic)) && !stopic %in% reserved) 
##             stop("'topic' should be a name, length-one character vector or reserved word")
##         topic <- stopic
##     }
##     help_type <- if (!length(help_type)) 
##         "text"
##     else match.arg(tolower(help_type), types)
##     paths <- index.search(topic, find.package(if (is.null(package)) 
##         loadedNamespaces()
##     else package, lib.loc, verbose = verbose))
##     tried_all_packages <- FALSE
##     if (!length(paths) && is.logical(try.all.packages) && !is.na(try.all.packages) && 
##         try.all.packages && is.null(package) && is.null(lib.loc)) {
##         for (lib in .libPaths()) {
##             packages <- .packages(TRUE, lib)
##             packages <- packages[is.na(match(packages, .packages()))]
##             paths <- c(paths, index.search(topic, file.path(lib, 
##                 packages)))
##         }
##         paths <- paths[nzchar(paths)]
##         tried_all_packages <- TRUE
##     }
##     paths <- unique(paths)
##     attributes(paths) <- list(call = match.call(), topic = topic, 
##         tried_all_packages = tried_all_packages, type = help_type)
##     class(paths) <- "help_files_with_topic"
##     paths
## }
## <bytecode: 0x7f9af2310aa8>
## <environment: namespace:utils>

Fechar parênteses

  • Feche os parênteses ou
  • Aperte ESC
plot(dados$cor,dados$peso

Símbolos inesperados

  • Esqueceu a vírgula separando os argumentos?
  • Colocou espaço entre os nomes de um objeto?
plot(dadoscor dados$peso)

aula pratica
aula.pratica

Como lidar com os erros?

  • Leia atentamente as mensagens de erro

  • Acostume-se com as mensagens mais comuns

  • Se não entender, use o google!

  • Perceba a diferença entre mensagem de erro e warning()

Os 10 mandamentos do R


1º Usarás o R em tuas análises e manipulação de teus dados
2º Nunca digitarás o código no console;
3º Salvarás seus scripts e não se preocuparás com o .RData;
4º Sempre concatenarás;
5º Jamais esquecerás dos parênteses das funções;
6º Conferirás o diretório de trabalho e os dados antes de enlouqueceres;
7º Usarás o help antes de perguntares e não culparás o R por teus erros;
8º Não esmorecerás e jamais amaldiçoarás o R por tuas faltas de vírgulas;
9º Lembrarás das aspas dos caracteres;
10º Não cobiçarás e aperfeiçoarás os códigos alheios e nunca ocultarás o código e a autoria original;

Alexandre Adalardo

mostrar os livros
falar das referências e locais de estudo no tutorial!