Departamento de Ecologia IB-USP

Mais um pouco sobre manipulação e verificação de dados

Importando dados - matrizes

ilhas <- read.csv2("../data/ilhas.csv",header=T,row.names = 1)
ilhas<-as.matrix(ilhas)
ilhas
##      ilha1 ilha2 ilha3 ilha4 ilha5 ilha6 ilha7 ilha8
## sp1     19     0    13    19    12     0     0    11
## sp2      7     4     0     1     2     6     3     1
## sp3      1     0     0     3     5     0     0     0
## sp4      8    17     8    22    14     7     9     7
## sp5      2     1     0     1     7    12     7     0
## sp6      2     5    18    15    10     0     0     0
## sp7      5     0     8    14     5     7    12     5
## sp8     20     0     0     0     3     5     1     0
## sp9     11     7     0     5     0     9     7     0
## sp10    15    12     0     1     6     8     0     0

Totais marginais em matrizes

Abundância por espécie

rowSums(ilhas) 
##  sp1  sp2  sp3  sp4  sp5  sp6  sp7  sp8  sp9 sp10 
##   74   24    9   92   30   50   56   29   39   42

Abundância por ilha

colSums(ilhas)
## ilha1 ilha2 ilha3 ilha4 ilha5 ilha6 ilha7 ilha8 
##    90    46    47    81    64    54    39    24

Totais marginais: a função apply

Abundância média por espécie

apply(X=ilhas, MARGIN=1, FUN=mean)
##    sp1    sp2    sp3    sp4    sp5    sp6    sp7    sp8    sp9   sp10 
##  9.250  3.000  1.125 11.500  3.750  6.250  7.000  3.625  4.875  5.250

Número de espécies por ilha

ilhas.ocor <- ilhas > 0
apply(ilhas.ocor, 2, sum)
## ilha1 ilha2 ilha3 ilha4 ilha5 ilha6 ilha7 ilha8 
##    10     6     4     9     9     7     6     4

Importando data frame

sps <- read.csv2("../data/sps.csv",header=T, dec=".")
sps
##      sp     cor peso   dieta compr.asa compr.corpo
## 1   sp1   verde   20  frutos       5.7        17.1
## 2   sp2   verde  110 insetos      31.0        93.0
## 3   sp3  marrom   40 insetos      11.0        33.0
## 4   sp4  marrom   15 insetos       4.0        12.0
## 5   sp5  marrom   20  frutos       6.5        19.5
## 6   sp6    azul  200  frutos      29.8        89.4
## 7   sp7 amarelo   30  nectar       8.5        25.5
## 8   sp8 amarelo   10 insetos       2.8         8.4
## 9   sp9 amarelo   25   fruto       7.3        21.9
## 10 sp10 amarelo   15 insetos       3.2         9.6

Estrutura dados

str(sps)
## 'data.frame':    10 obs. of  6 variables:
##  $ sp         : Factor w/ 10 levels "sp1","sp10","sp2",..: 1 3 4 5 6 7 8 9 10 2
##  $ cor        : Factor w/ 4 levels "amarelo","azul",..: 4 4 3 3 3 2 1 1 1 1
##  $ peso       : int  20 110 40 15 20 200 30 10 25 15
##  $ dieta      : Factor w/ 4 levels "fruto","frutos",..: 2 3 3 3 2 2 4 3 1 3
##  $ compr.asa  : num  5.7 31 11 4 6.5 29.8 8.5 2.8 7.3 3.2
##  $ compr.corpo: num  17.1 93 33 12 19.5 89.4 25.5 8.4 21.9 9.6

Sumário dados

summary(sps)
##        sp         cor         peso            dieta     compr.asa     
##  sp1    :1   amarelo:4   Min.   : 10.00   fruto  :1   Min.   : 2.800  
##  sp10   :1   azul   :1   1st Qu.: 16.25   frutos :3   1st Qu.: 4.425  
##  sp2    :1   marrom :3   Median : 22.50   insetos:5   Median : 6.900  
##  sp3    :1   verde  :2   Mean   : 48.50   nectar :1   Mean   :10.980  
##  sp4    :1               3rd Qu.: 37.50               3rd Qu.:10.375  
##  sp5    :1               Max.   :200.00               Max.   :31.000  
##  (Other):4                                                            
##   compr.corpo   
##  Min.   : 8.40  
##  1st Qu.:13.28  
##  Median :20.70  
##  Mean   :32.94  
##  3rd Qu.:31.12  
##  Max.   :93.00  
## 

mostrar que o summary é bom para encontrar erros nas tabelas

Consertando erros

sps[ sps$dieta=="fruto" , ]
##    sp     cor peso dieta compr.asa compr.corpo
## 9 sp9 amarelo   25 fruto       7.3        21.9
sps[9,4] <- "frutos"
sps[9,]
##    sp     cor peso  dieta compr.asa compr.corpo
## 9 sp9 amarelo   25 frutos       7.3        21.9

Consertando erros

Mas a variável continua tendo 4 níveis…

sps$dieta
##  [1] frutos  insetos insetos insetos frutos  frutos  nectar  insetos
##  [9] frutos  insetos
## Levels: fruto frutos insetos nectar
sps$dieta<- as.character(sps$dieta)
sps$dieta<- as.factor(sps$dieta)
sps$dieta
##  [1] frutos  insetos insetos insetos frutos  frutos  nectar  insetos
##  [9] frutos  insetos
## Levels: frutos insetos nectar
#ou
sps$dieta <- factor(sps$dieta, 
    levels=c("frutos", "insetos", "nectar" ))

Inserindo variáveis

Abundância total das espécies da planilha ilhas:

rowSums(ilhas)
##  sp1  sp2  sp3  sp4  sp5  sp6  sp7  sp8  sp9 sp10 
##   74   24    9   92   30   50   56   29   39   42
sps$abund.tot <- rowSums(ilhas)
head(sps)
##    sp    cor peso   dieta compr.asa compr.corpo abund.tot
## 1 sp1  verde   20  frutos       5.7        17.1        74
## 2 sp2  verde  110 insetos      31.0        93.0        24
## 3 sp3 marrom   40 insetos      11.0        33.0         9
## 4 sp4 marrom   15 insetos       4.0        12.0        92
## 5 sp5 marrom   20  frutos       6.5        19.5        30
## 6 sp6   azul  200  frutos      29.8        89.4        50

Ordenação de data frames

head(sps, n=3L)
##    sp    cor peso   dieta compr.asa compr.corpo abund.tot
## 1 sp1  verde   20  frutos       5.7        17.1        74
## 2 sp2  verde  110 insetos      31.0        93.0        24
## 3 sp3 marrom   40 insetos      11.0        33.0         9

Ordenando sps por peso:

sps[ order(sps$peso) , ]
##      sp     cor peso   dieta compr.asa compr.corpo abund.tot
## 8   sp8 amarelo   10 insetos       2.8         8.4        29
## 4   sp4  marrom   15 insetos       4.0        12.0        92
## 10 sp10 amarelo   15 insetos       3.2         9.6        42
## 1   sp1   verde   20  frutos       5.7        17.1        74
## 5   sp5  marrom   20  frutos       6.5        19.5        30
## 9   sp9 amarelo   25  frutos       7.3        21.9        39
## 7   sp7 amarelo   30  nectar       8.5        25.5        56
## 3   sp3  marrom   40 insetos      11.0        33.0         9
## 2   sp2   verde  110 insetos      31.0        93.0        24
## 6   sp6    azul  200  frutos      29.8        89.4        50

Estatística descritiva

max(sps$compr.asa)
## [1] 31
min(sps$compr.corpo)
## [1] 8.4
range(sps$peso)
## [1]  10 200
mean(sps$peso)
## [1] 48.5
sd(sps$peso)
## [1] 60.60116
var(sps$peso)
## [1] 3672.5
median(sps$peso)
## [1] 22.5
quantile(sps$peso)
##     0%    25%    50%    75%   100% 
##  10.00  16.25  22.50  37.50 200.00

Quantis

valores <- c(15,5,3,8,10,2,7,11,12)
valores.ord<- valores[order(valores)]
valores.ord
## [1]  2  3  5  7  8 10 11 12 15
valores.ord[5]
## [1] 8
median(valores)
## [1] 8
quantile(valores)
##   0%  25%  50%  75% 100% 
##    2    5    8   11   15

Estatística descritiva: contagens

table(sps$cor)
## 
## amarelo    azul  marrom   verde 
##       4       1       3       2
table(sps$dieta)
## 
##  frutos insetos  nectar 
##       4       5       1
table(sps$cor, sps$dieta)
##          
##           frutos insetos nectar
##   amarelo      1       2      1
##   azul         1       0      0
##   marrom       1       2      0
##   verde        1       1      0

Totais marginais: a função tapply

Comprimento médio do corpo por dieta

tapply(X = sps$compr.corpo, INDEX = sps$dieta, FUN = mean)
##  frutos insetos  nectar 
##  36.975  31.200  25.500

Peso máximo por cor e dieta

tapply(sps$peso, list(sps$cor, sps$dieta), max)
##         frutos insetos nectar
## amarelo     25      15     30
## azul       200      NA     NA
## marrom      20      40     NA
## verde       20     110     NA

aggregate em data frames

abundância média por dieta e cor

aggregate(formula = abund.tot ~ cor + dieta, data = sps, FUN = mean)
##       cor   dieta abund.tot
## 1 amarelo  frutos      39.0
## 2    azul  frutos      50.0
## 3  marrom  frutos      30.0
## 4   verde  frutos      74.0
## 5 amarelo insetos      35.5
## 6  marrom insetos      50.5
## 7   verde insetos      24.0
## 8 amarelo  nectar      56.0

aggregate em data frames

abundância e peso médio por cor e dieta

aggregate(cbind(abund.tot, peso) ~ cor + dieta, sps, mean)
##       cor   dieta abund.tot  peso
## 1 amarelo  frutos      39.0  25.0
## 2    azul  frutos      50.0 200.0
## 3  marrom  frutos      30.0  20.0
## 4   verde  frutos      74.0  20.0
## 5 amarelo insetos      35.5  12.5
## 6  marrom insetos      50.5  27.5
## 7   verde insetos      24.0 110.0
## 8 amarelo  nectar      56.0  30.0

Gráficos no R

Gráficos no R

  • Gráficos exploratórios
    • simples
    • visualisar os dados: relações, padrões, distribuições..
    • encontrar erros e valores atípicos (outliers)
  • Gráficos resultado
    • acabamento bem feito
    • mostra informação mais relevante

O quarteto de Anscombe

##          x1    x2    x3    x4    y1   y2    y3    y4
## 1     10.00 10.00 10.00  8.00  8.04 9.14  7.46  6.58
## 2      8.00  8.00  8.00  8.00  6.95 8.14  6.77  5.76
## 3     13.00 13.00 13.00  8.00  7.58 8.74 12.74  7.71
## 4      9.00  9.00  9.00  8.00  8.81 8.77  7.11  8.84
## 5     11.00 11.00 11.00  8.00  8.33 9.26  7.81  8.47
## 6     14.00 14.00 14.00  8.00  9.96 8.10  8.84  7.04
## 7      6.00  6.00  6.00  8.00  7.24 6.13  6.08  5.25
## 8      4.00  4.00  4.00 19.00  4.26 3.10  5.39 12.50
## 9     12.00 12.00 12.00  8.00 10.84 9.13  8.15  5.56
## 10     7.00  7.00  7.00  8.00  4.82 7.26  6.42  7.91
## 11     5.00  5.00  5.00  8.00  5.68 4.74  5.73  6.89
## media  9.00  9.00  9.00  9.00  7.50 7.50  7.50  7.50
## sd     3.16  3.16  3.16  3.16  1.94 1.94  1.94  1.94

O quarteto de Anscombe

Todos os quatro conjunto de dados são idênticos quando examinado usando estatística básica, mas variam consideravelmente quando graficados

Gráficos exploratórios: Uma variável

Gráficos de barra

Representar as quantitades de alguma variáveis qualitativas (categóricas)
t.dieta <- table(sps$dieta)
barplot(t.dieta, ylab="número de espécies", main="Dieta das espécies")

Gráficos de barra

barplot(t.dieta2, legend=T, col=cores)

barplot(t.dieta2, beside = T, legend=T, col=cores)

Dados dos pardais

ver a abrangência dos dados de acordo com a ordem com que foram coletados. numero da linha de uma observação é plotado contra o valor da observação. É útil para encontrar outliers em uma variável:

head(pardais)
##   Species    Sex Wingcrd Tarsus Head Culmen Nalospi   Wt Observer Age
## 1    SSTS   Male    58.0   21.7 32.7   13.9    10.2 20.3        2   0
## 2    SSTS Female    56.5   21.1 31.4   12.2    10.1 17.4        2   0
## 3    SSTS   Male    59.0   21.0 33.3   13.8    10.0 21.0        2   0
## 4    SSTS   Male    59.0   21.3 32.5   13.2     9.9 21.0        2   0
## 5    SSTS   Male    57.0   21.0 32.5   13.8     9.9 19.8        2   0
## 6    SSTS Female    57.0   20.7 32.5   13.3     9.9 17.5        2   0

Gráficos de pontos: Pesos de pardais

dotchart(pardais$Wt)

Gráficos de pontos condicional

dotchart(pardais$Wt, groups =pardais$Sex, gcolor=c("black","red"))

Histogramas: Peso dos animais

Os histogramas são gráficos que representam a distribuição de frequências dos valores de uma variável quantitativa, servem para vermos a forma da distribuição dos dados.

hist(pardais$Wt)

Histogramas condicionais: lattice

histogram(~Wt|Sex, data= pardais)

Histogramas condicionais: lattice

Boxplots

visualiza o centro e o espalhamento dos dados distribuição minimo, os quartis 25%, 50% (mediana), 75% e o máximo. outliers

boxplot(pardais$Wingcrd)

boxplot(pardais$Tarsus)

Boxplots condicionais

boxplot(Wt~Sex, data=pardais)

Gráficos quantil-quantil

qqnorm(pardais$Culmen)
qqline(pardais$Culmen)

Gráficos quantil-quantil

#simulando dados normais
normais <- rnorm(n=101,mean = 50, sd = 2)
qqnorm(normais)
qqline(normais)

Gráficos: Duas variáveis

Gráficos de dispersão

observar a relação entre duas variáveis contínuas. Ou seja serve para inspecionar visualmente se duas variáveis são associadas.

plot(pardais$Tarsus, pardais$Wingcrd)

Scatterplot condicional

xyplot(Wt~Head|as.factor(Observer), data=pardais)

Scatterplot condicional

Cores diferentes para cada sexo

plot(Wt~Head, data=pardais, col=cores, pch=16)

Pairs - correlações

pairs(pardais[ ,3:5], upper.panel = panel.cor, diag.panel = panel.hist)

Edição de gráficos

Parâmetros gráficos

  • Argumentos de funções gráficas que os modificam
    • na própria função
    • na função par( )

Plot base

plot(riqueza~area)

Aumentando os tamanhos de eixos e pontos

Argumento de par

par(cex=1.5)
plot(riqueza~area)

par(cex=1) # para voltar ao tamanho padrão

Argumento de plot

plot(riqueza~area, cex=1.5)

Para "limpar" os parâmetros de par, ou volta com o valor inicial de par ou fecha o dispositivo gráfico (dev,off)

Mudando a cor e o formato dos pontos do gráfico

plot(riqueza~area, pch=4, col="orangered2")

Mudando a cor e o formato dos pontos do gráfico

par(cex=1.5)
plot(riqueza~area, pch=16, col="deeppink")

Mudando nome de eixos e títulos dos gráficos

plot(riqueza~area, xlab = "Área", ylab="Número de Espécies", 
     main= "relação espécies-área")

Mudando nome de eixos e títulos dos gráficos

# área em metros quadrados
plot(riqueza~area, xlab = expression("Área (m"^2*")"), 
     ylab="Número de Espécies", main= "Borboletas do Parque")

Dois gráficos num mesmo plot

par(mfrow=c(1,2))
plot(riqueza~area, col=cores, pch=16)
boxplot(riqueza~local)

Inserindo mais informações em gráficos

Funções de nivel inferior (low-level plotting commands)

  • lines

  • axis

  • points

  • segments

  • text

  • legend

  • rect

lines()

plot(riqueza~area)
lines(area, riqueza)
lines(lowess(area,riqueza), col="red")

abline()

model <-lm(riqueza~area)
plot(riqueza~area)
abline(model) # reta da regressão

abline()

plot(riqueza~area)
abline(v=mean(area), lty=2, col="darkgreen") # linha vertical
abline(h=mean(riqueza), lty=4, col="purple") # linha

text() e mtext()

plot(riqueza~area)
text(x=10,y=43, "texto aqui")

trocando a legenda do texto

plot(riqueza~area, xlab="")
mtext(side=1, "área do lago", line=3, cex=2)

axis()

Inserindo novo eixo no gráfico
plot(riqueza~area, xaxt="n")
axis(1, at=seq(0,80,20), labels=c("zero", "vinte", "quarenta", "sessenta", "oitenta"))

sobrepondo outro gráfico

Incluir os dados de umidade dos locais no eixo Y2.

sobrepondo outros gráficos

plot(riqueza~area)

par(new=T) # para permitir sobrescrever o gráfico

#plotando a nova variável Y2, mas sem desenhar o eixo
plot(umidade~area, yaxt="n", ylab="",type="l") 

# desenhando o eixo de Y2
axis(4)
mtext("Umidade (%)",4, line = 2)

points

plot(riqueza~area, pch=16, cex=2, col="orange")
points(riq.lago2~area.lago2, pch=16, col="purple", cex=2)

Incluindo legendas

legend("topleft", legend= c("lago 1", "lago 2"), pch=16, col=c("orange", "purple"), bty="n")

Salvando gráficos em arquivos de imagem

Extensões mais comuns:

  • jpeg
  • pdf
  • bmp
  • png

Help em grDevice

Exemplo

jpeg(filename = "figurinha.jpg", width = 480, height = 480)
plot(riqueza~area)
dev.off()

Salvando no Rstudio

Abrir janela de dispositivo no Rstudio

Geralmente usado em gráficos muito grandes

# abrindo uma janela para fazer o gráfico, à parte do Rstudio
x11()
# fazendo o plot
plot(riqueza~area)

# o plot será enviado diretamente para a janela aberta.