Expandindo o R com as ferramentas do RStudio

Prof. Maurício Garcia de Camargo
camargofurg@gmail.com

Disponível online em
http://www.rpubs.com/camargo

PROGRAMAÇÃO

  • Planilhagem no R
    • dplyr
    • reshape2
  • Gramática dos gráficos
    • ggplot2
  • Documentação e LaTeX
    • markdown
    • knitr
  • Aplicações no browser
    • shiny

R e RStudio

  • RStudio é um IDE (Integrated Development Environment) para a linguagem R.
  • Seus criadores, entretanto, transcenderam a sua funcionalidade desenvolvendo uma série de ferramentas para lidar com planilhas, gráficos e aplicativos de uma forma moderna e rápida
  • Visite http://www.rstudio.com
  • Os pacotes usados nesta apresentação podem ser encontrados em http://www.rstudio.com/products/rpackages/

Preparando o RStudio

  • É necessário instalar todos os pacotes que usaremos:
install.packages(c('reshape2','dplyr','knitr','ggplot2','rmarkdown','shiny'))
  • Programas necessários para criar arquivos em PDF
    • Windows: MikTex
    • Linux: TeX-Live 2013
    • Mac: Mac-TeX

1. Planilhagem com R

  • Os pacotes embutidos no R não trazem facilidades para manipulação de dados.
  • Dois pacotes do RStudio facilitam bastante a seleção e modificação de dados planilhados: reshape2 e dplyr
    • Habilitando os pacotes:
library(reshape2)
library(dplyr)

Exemplo de manipulação de planilhas com reshape2.

Vamos abrir usando o pacote readxl uma planilha de peixes coletados sazonalmente na zona entremarés de 13 pontos distribuídos aos longo da margem norte da Baía da Babitonga - SC.
Parte da planilha é mostrada abaixo. Esta é a planilha longa (6138 Linhas X 12 colunas). Download aqui.

library(readxl)
plan_longa=read_excel('peixes.xls')
print(plan_longa[1:20,1:7])#Mostrando até a linha 20 e coluna 7.
     Estacao Ponto        Familia                  Especie CT   PT Sexo
1     Outono     9      Achiridae         Achirus lineatus 60 5.17    X
2      Verão     8      Achiridae         Achirus lineatus 61 4.52    X
3      Verão     8      Achiridae         Achirus lineatus 55 2.87    X
4    Inverno    11    Engraulidae          Anchoa januaria 80 3.41    F
5    Inverno    11    Engraulidae          Anchoa januaria 79 3.69    F
6    Inverno    11    Engraulidae          Anchoa januaria 78 3.15    M
7  Primavera    13    Engraulidae          Anchoa januaria 76 3.35    M
8  Primavera    13    Engraulidae          Anchoa januaria 77 3.68    F
9  Primavera    13    Engraulidae          Anchoa januaria 75 3.81    F
10   Inverno    11    Engraulidae          Anchoa januaria 80 3.55    F
11   Inverno    11    Engraulidae          Anchoa januaria 77 3.19    F
12     Verão     9 Atherinopsidae Atherinella brasiliensis 73 3.09    X
13     Verão     9 Atherinopsidae Atherinella brasiliensis 60 1.49    X
14   Inverno    11    Engraulidae          Anchoa januaria 71 2.65    F
15   Inverno    11    Engraulidae          Anchoa januaria 83 4.42    F
16   Inverno    11    Engraulidae          Anchoa januaria 79 3.44    F
17   Inverno    11    Engraulidae          Anchoa januaria 59 1.36    F
18   Inverno    11    Engraulidae          Anchoa januaria 75 3.09    M
19   Inverno    11    Engraulidae          Anchoa januaria 79 3.13    F
20   Inverno    11    Engraulidae          Anchoa januaria 76 3.10    F
  • O formato de planilhas dos ictiólogos é sempre longo, contendo um indivíduo por linha.

    • Vamos chamá-lo de Planilha longa.

  • No entanto, os programas de análise estatística em ecologia (e o próprio R) aceitam planilhas no formato largo, contendo as espécies nas colunas.

    • Estas são as Planilhas largas.

Figura

Planilha de biomassa por espécie, consistindo na soma dos pesos dos indivíduos de cada estação e cada ponto, usando a função dcast

library(reshape2)
plan_larga_bio=dcast(plan_longa, Estacao + Ponto ~ Especie,
                   value.var = 'PT',fun.aggregate=sum)
#Soma dos pesos de todos os indivíduos 
print(plan_larga_bio[1:20,1:5])
   Estacao Ponto Achirus lineatus Anchoa januaria Anchoa tricolor
1  Inverno     1                0            0.00           52.48
2  Inverno     2                0            0.00           63.64
3  Inverno     3                0            0.00           12.82
4  Inverno     4                0            0.00            0.00
5  Inverno     5                0            0.00            0.00
6  Inverno     6                0            0.00            0.00
7  Inverno     7                0            0.00            1.44
8  Inverno     8                0            3.02            4.15
9  Inverno     9                0            0.00            0.00
10 Inverno    10                0            0.00            0.00
11 Inverno    11                0           75.46           76.25
12 Inverno    12                0            0.00            6.90
13 Inverno    13                0            2.54            0.63
14  Outono     1                0            0.00           61.55
15  Outono     2                0            0.00           42.63
16  Outono     3                0            0.00            3.37
17  Outono     4                0            0.00            3.25
18  Outono     5                0            0.00            0.00
19  Outono     6                0            0.00            0.56
20  Outono     7                0            0.00            0.00

Transformando a planilha larga de biomassa de volta ao formato longo, usando a função melt. A planilha agora tem 2184 Linhas X 4 Colunas porqu as médias foram preservadas.

temp=melt(plan_larga_bio,id=c('Estacao','Ponto'))
print(temp[1:20,])
   Estacao Ponto         variable value
1  Inverno     1 Achirus lineatus     0
2  Inverno     2 Achirus lineatus     0
3  Inverno     3 Achirus lineatus     0
4  Inverno     4 Achirus lineatus     0
5  Inverno     5 Achirus lineatus     0
6  Inverno     6 Achirus lineatus     0
7  Inverno     7 Achirus lineatus     0
8  Inverno     8 Achirus lineatus     0
9  Inverno     9 Achirus lineatus     0
10 Inverno    10 Achirus lineatus     0
11 Inverno    11 Achirus lineatus     0
12 Inverno    12 Achirus lineatus     0
13 Inverno    13 Achirus lineatus     0
14  Outono     1 Achirus lineatus     0
15  Outono     2 Achirus lineatus     0
16  Outono     3 Achirus lineatus     0
17  Outono     4 Achirus lineatus     0
18  Outono     5 Achirus lineatus     0
19  Outono     6 Achirus lineatus     0
20  Outono     7 Achirus lineatus     0

Planilha de abundância por espécie, consistindo na soma dos pesos dos indivíduos de cada estação e cada ponto. Esta será nossa planilha de trabalho

plan_larga_ab=dcast(plan_longa, Estacao + Ponto ~ Especie,
                   value.var = 'CT',fun.aggregate = length) 
#Pode ser CT ou qualquer variável, pois a função irá apenas contar aquelas maiores do que zero
print(plan_larga_ab[1:20,1:5])
   Estacao Ponto Achirus lineatus Anchoa januaria Anchoa tricolor
1  Inverno     1                0               0              20
2  Inverno     2                0               0              20
3  Inverno     3                0               0               3
4  Inverno     4                0               0               0
5  Inverno     5                0               0               0
6  Inverno     6                0               0               0
7  Inverno     7                0               0               2
8  Inverno     8                0               1               1
9  Inverno     9                0               0               0
10 Inverno    10                0               0               0
11 Inverno    11                0              24              30
12 Inverno    12                0               0               3
13 Inverno    13                0               1               1
14  Outono     1                0               0              60
15  Outono     2                0               0              49
16  Outono     3                0               0              12
17  Outono     4                0               0               7
18  Outono     5                0               0               0
19  Outono     6                0               0               2
20  Outono     7                0               0               0

Selecionando dados com o pacote dplyr

library(dplyr)

Filtrando os dados com a função filter

temp=filter(plan_larga_ab,Estacao=='Inverno')
print(temp[,1:5])
   Estacao Ponto Achirus lineatus Anchoa januaria Anchoa tricolor
1  Inverno     1                0               0              20
2  Inverno     2                0               0              20
3  Inverno     3                0               0               3
4  Inverno     4                0               0               0
5  Inverno     5                0               0               0
6  Inverno     6                0               0               0
7  Inverno     7                0               0               2
8  Inverno     8                0               1               1
9  Inverno     9                0               0               0
10 Inverno    10                0               0               0
11 Inverno    11                0              24              30
12 Inverno    12                0               0               3
13 Inverno    13                0               1               1

Outro exemplo de filtro usando o símbolo de união “&”

temp=filter(plan_larga_ab,Estacao=='Inverno' & Ponto==3)
print(temp[,1:5])
  Estacao Ponto Achirus lineatus Anchoa januaria Anchoa tricolor
1 Inverno     3                0               0               3

Outro exemplo de filtro usando o símbolo de interseção “|”

temp=filter(plan_larga_ab,Ponto==3 | Ponto==4)
print(temp[,1:5])
    Estacao Ponto Achirus lineatus Anchoa januaria Anchoa tricolor
1   Inverno     3                0               0               3
2   Inverno     4                0               0               0
3    Outono     3                0               0              12
4    Outono     4                0               0               7
5 Primavera     3                0               0               0
6 Primavera     4                0               0               0
7     Verão     3                0              38              34
8     Verão     4                0               7               0

É possivel selecionar colunas usando select.


A tabela de fatores é criada (tab_fat)

tab_fat=select(plan_larga_ab,1:2)
print(tab_fat[1:20,])
   Estacao Ponto
1  Inverno     1
2  Inverno     2
3  Inverno     3
4  Inverno     4
5  Inverno     5
6  Inverno     6
7  Inverno     7
8  Inverno     8
9  Inverno     9
10 Inverno    10
11 Inverno    11
12 Inverno    12
13 Inverno    13
14  Outono     1
15  Outono     2
16  Outono     3
17  Outono     4
18  Outono     5
19  Outono     6
20  Outono     7


A tabela de abundância é criada (tab_abu).

Esta será nossa planilha de trabalho

tab_abu=select(plan_larga_ab,3:length(plan_larga_ab))
print(tab_abu[1:20,1:3])
   Achirus lineatus Anchoa januaria Anchoa tricolor
1                 0               0              20
2                 0               0              20
3                 0               0               3
4                 0               0               0
5                 0               0               0
6                 0               0               0
7                 0               0               2
8                 0               1               1
9                 0               0               0
10                0               0               0
11                0              24              30
12                0               0               3
13                0               1               1
14                0               0              60
15                0               0              49
16                0               0              12
17                0               0               7
18                0               0               0
19                0               0               2
20                0               0               0

O pacote vegan tem várias funcionalidades para tratar planilhas multivariadas. O código abaixo abrevia o nome das espécies.

library(vegan)
colnames(tab_abu)#Lista os nomes originais das colunas (espécies)
 [1] "Achirus lineatus"           "Anchoa januaria"           
 [3] "Anchoa tricolor"            "Anchoviella lepidentostole"
 [5] "Astrocopus y-graecum"       "Atherinella brasiliensis"  
 [7] "Bathygobius soporator"      "Caranx hippos"             
 [9] "Centropomus undecimalis"    "Cetengraulis edentulus"    
[11] "Chaetodipterus faber"       "Chilomycterus spinosus"    
[13] "Chloroscombrus chrysurus"   "Citharichthys arenaceus"   
[15] "Citharichthys spilopterus"  "Cosmocampus elucens"       
[17] "Ctenogobius boleosoma"      "Ctenogobius stigmaticus"   
[19] "Cynoscion leiarchus"        "Dactylopterus volitans"    
[21] "Diapterus rhombeus"         "Engraulidae"               
[23] "Etropus crossotus"          "Eucinostomus argenteus"    
[25] "Eucinostomus gula"          "Eucinostomus melanopterus" 
[27] "Eucinostomus sp."           "Fistularia petimba"        
[29] "Genidens barbus"            "Genidens genidens"         
[31] "Harengula clupeola"         "Hyporhamphus unifasciatus" 
[33] "Lagocephalus laevigatus"    "Lycengraulis grossidens"   
[35] "Menticirrhus americanus"    "Menticirrhus littoralis"   
[37] "Microgobius meeki"          "Micropogonias furnieri"    
[39] "Monacanthus ciliatus"       "Mugil curema"              
[41] "Mugil sp. 1"                "Mugil spp."                

Abreviando os nomes científicos

make.cepnames(colnames(tab_abu))#Abrevia os nomes
 [1] "Achiline" "Anchjanu" "Anchtric" "Anchlepi" "Astrgrae" "Athebras"
 [7] "Bathsopo" "Carahipp" "Centunde" "Ceteeden" "Chaefabe" "Chilspin"
[13] "Chlochry" "Citharen" "Cithspil" "Cosmeluc" "Ctenbole" "Ctenstig"
[19] "Cynoleia" "Dactvoli" "Diaprhom" "Engrauld" "Etrocros" "Euciarge"
[25] "Eucigula" "Eucimela" "Eucisp"   "Fistpeti" "Genibarb" "Genigeni"
[31] "Hareclup" "Hypounif" "Lagolaev" "Lycegros" "Mentamer" "Mentlitt"
[37] "Micrmeek" "Micrfurn" "Monacili" "Mugicure" "Mugi1"    "Mugispp" 

Atribuindo os novos nomes abreviados

colnames(tab_abu)=make.cepnames(colnames(tab_abu))

Inspecionando rapidamente um MDS com o vegan

mds=metaMDS(tab_abu,autotransform = T)
Square root transformation
Wisconsin double standardization
Run 0 stress 0.2505835 
Run 1 stress 0.2676047 
Run 2 stress 0.2506182 
... procrustes: rmse 0.002823602  max resid 0.01486818 
Run 3 stress 0.2684197 
Run 4 stress 0.2718905 
Run 5 stress 0.2593415 
Run 6 stress 0.2660068 
Run 7 stress 0.2848678 
Run 8 stress 0.2694131 
Run 9 stress 0.2766321 
Run 10 stress 0.2760403 
Run 11 stress 0.2688347 
Run 12 stress 0.2578929 
Run 13 stress 0.257903 
Run 14 stress 0.2768837 
Run 15 stress 0.2672993 
Run 16 stress 0.2728047 
Run 17 stress 0.2682751 
Run 18 stress 0.250909 
... procrustes: rmse 0.01489691  max resid 0.07276389 
Run 19 stress 0.2788558 
Run 20 stress 0.2976966 

Criando o gráfico do MDS

plot(mds$points,type="n",axes=F)
points(mds$points,pch=16,col=c('blue','yellow','red','black')[factor(tab_fat$Estacao)],cex=2)
box()
legend("topleft",c("Inverno","Verão","Outono","Primavera"),
       pch=16,col=c('blue','yellow','red','black'),cex=1)

plot of chunk unnamed-chunk-15

Muitos índices de diversidade e riqueza podem ser calculados com o vegan.


Vamos criar uma tabela comos índices mais comuns.

tab_div=data.frame(cbind(tab_fat,specnumber(tab_abu),rowSums(tab_abu), diversity(tab_abu,'shannon'),diversity(tab_abu,'simpson')))
colnames(tab_div)=c('Estacao','Ponto','N','S','H','Simp')
tab_div[1:20,]
   Estacao Ponto  N   S         H      Simp
1  Inverno     1  4  81 1.1353567 0.6645328
2  Inverno     2  3  40 0.8556887 0.5450000
3  Inverno     3  8  81 1.4311001 0.7020271
4  Inverno     4  3   3 1.0986123 0.6666667
5  Inverno     5  6  15 1.4878167 0.7111111
6  Inverno     6  7  10 1.8866968 0.8400000
7  Inverno     7  5  39 0.8426927 0.3931624
8  Inverno     8  9  22 1.6786315 0.7272727
9  Inverno     9  2  28 0.5982696 0.4081633
10 Inverno    10  4  27 0.6551416 0.3209877
11 Inverno    11  8  65 1.3032030 0.6442604
12 Inverno    12  6  61 0.7543888 0.3418436
13 Inverno    13 12  41 1.7900982 0.7495538
14  Outono     1 12 211 1.6575405 0.7740617
15  Outono     2  6 163 1.4134722 0.7260341
16  Outono     3  9 132 1.6972614 0.7796143
17  Outono     4  6  63 1.1935179 0.6273621
18  Outono     5  7  62 1.2203487 0.6233091
19  Outono     6  6  25 1.5092037 0.7264000
20  Outono     7 13  28 2.3759290 0.8928571

2. Gramática dos gráficos

ggplot2

  • ggplot2 é um pacote para construções de gráficos baseado no livro “Grammar of graphics (Wilkinson, 2005).
  • A sintaxe inovadora permite tratar independentemente os componentes dos gráficos, como camadas, de modo a permitir a composição de gráficos complexos de uma maneira simples.
  • Por que ggplot?
    • Os componentes do gráficos são definidos pela gramática, tornando a construção de gráficos mais simples
    • Apesar da simplicidade na construção, os gráficos gerados podem ser bastante complexos, com padrão de publicação.

Estrutra básica

  • Especifique os dados e as variáveis dentro da função ggplot
  • Tudo o que vai dentro da função ggplot é uma configuração global do gráfico
  • Depois adicione camadas de objetos gráficos, modelos estatísticos e painéis.
library(ggplot2)
p=ggplot(tab_div,aes(x=S,y=N))
p+geom_point()

plot of chunk unnamed-chunk-17

Terminologia

  • ggplot - A função principal, onde é especificado o conjunto de dados (dataframe) e as variáveis para plotar
  • geoms - objetos geométricos
    • geom_histogram, geom_point, geom_bar,geom_line, etc
  • aes - aesthetics
    • shape, transparência, cor, preenchimento, tipo de linha
  • scales - Define como os dados serão plotados
    • contínuo, discreto, log

Manipulando camadas e aesthetics

A partir deste gráfico de dispersão, vamos colocando camadas no gráfico.

p=ggplot(tab_div,aes(x=S,y=N))
p+geom_point()

plot of chunk unnamed-chunk-18

Manipulando camadas e aesthetics

Aumentado o tamanho dos pontos

p=ggplot(tab_div,aes(x=S,y=N))
p+geom_point(size=5)

plot of chunk unnamed-chunk-19

Manipulando camadas e aesthetics

Adicionando cores correspondentes às estações do ano

p=ggplot(tab_div,
         aes(x=S,y=N,color=Estacao))
p+geom_point(size=5)

plot of chunk unnamed-chunk-20

Manipulando camadas e aesthetics

Adicionando diferentes tipos de pontos correspondentes às estações do ano

p=ggplot(tab_div,aes(x=S,y=N))
p+geom_point(aes(shape=Estacao),
             size=5)

plot of chunk unnamed-chunk-21

Exemplo simples com uma camada: histograma de distribuição de abundância

p=ggplot(tab_div,aes(x=S)) 
p+geom_histogram()

plot of chunk unnamed-chunk-22

Exemplo mais complexo com duas camadas

p=ggplot(tab_div,aes(x=S)) 
p+geom_histogram(aes(y=..density..),binwidth=20,col='black',fill='white') +
geom_density()

plot of chunk unnamed-chunk-23

Boxplot com grupos

p=ggplot(tab_div,aes(x=Estacao, y=S)) 
p+geom_boxplot()

plot of chunk unnamed-chunk-24

Gráfico de linhas

Usando dplyr para filtrar só os dados do verão

verao=filter(tab_div,
Estacao=='Inverno')
p=ggplot(tab_div,aes(x=Ponto,y=S))
p+geom_line()

plot of chunk unnamed-chunk-25

Gráfico de linhas

Linhas para todas as estações

p=ggplot(tab_div,aes(x=Ponto,y=S,
color=Estacao))
p+geom_line()

plot of chunk unnamed-chunk-26

Gráfico de linhas

Faceting para plotar gráficos separados para cada estação

p=ggplot(tab_div,aes(x=Ponto,y=S,
color=Estacao))
p+geom_line()+facet_grid(Estacao~.)

plot of chunk unnamed-chunk-27

3. Documentação e LaTeX