Ferramentas do usuário

Ferramentas do site


Barra lateral

CMQ
Centro de Métodos Quantitativos


USP ESALQ
Depto. de Ciências Florestais
ESALQ
UNIVERSIDADE de SÃO PAULO
Av. Pádua Dias, 11
Caixa Postal 09
13418-900 - Piracicaba - SP
BRASIL
biometria:r-tutor:09-solucao

Uso da Linguagem R para Análise de Dados em Ecologia

9. Solução dos Exercícios

São apresentados abaixo os códigos para solução dos exercícios do curso. Lembre-se, entretanto, que, em se tratando de código, sempre é possível mais que um caminho para se chegar ao mesmo fim.

Exercícios 7: Noções de Porgramação em Linguagem S

Freqüência de Espécies

> cax <- read.csv("caixeta.csv",header=T)
> cax$especie[1:5]
[1] Myrcia sulfiflora      Myrcia sulfiflora      Syagrus romanzoffianus
[4] Tabebuia cassinoides   indet.1
43 Levels: Alchornea triplinervia Andira fraxinifolia ... Tibouchina nutticeps
>
> class( table( cax$especie ) )
[1] "table"
> attributes( table( cax$especie ) )
$dim
[1] 43

$dimnames
$dimnames[[1]]
 [1] "Alchornea triplinervia"    "Andira fraxinifolia"
 [3] "bombacaceae"               "Cabralea canjerana"
 [5] "Callophyllum brasiliensis" "Calophyllum brasiliensis"
 [7] "Cecropia sp"               "Coussapoa macrocarpa"
 [9] "Coussapoa micropoda"       "Cryptocaria moschata"
[11] "Cyathea sp"                "eugenia3"
[13] "Eugenia oblongata"         "fabaceae1"
[15] "Ficus sp"                  "Gomidesia sp"
[17] "Ilex durosa"               "Ilex sp"
[19] "indet.1"                   "indet.2"
[21] "indet.3"                   "Inga sp"
[23] "Jacaranda puberula"        "jussara"
[25] "Matayba sp"                "Mela 1"
[27] "Mela 2"                    "Myrcia sulfiflora"
[29] "myrtaceae1"                "myrtaceae2"
[31] "Myrtaceae 3"               "myrtaceae4"
[33] "Pera glabrata"             "Persea sp"
[35] "Pisonia sp"                "Psidium sp"
[37] "Simplocos sp"              "Solanum sp1"
[39] "Solanum sp2"               "Syagrus romanzoffianus"
[41] "Tabebuia 1"                "Tabebuia cassinoides"
[43] "Tibouchina nutticeps"


$class
[1] "table"

>

A função 'table' produz um objeto da classe 'table'. No exemplo acima, o resultado é uma tabela unidimensional, pois apenas uma variável foi dada como argumento.

O objeto da classe 'table' tem como atributos:

  • 'dim' que indica as dimensões da tabela;
  • 'dimnames' que indica os nomes associados às freqüências em cada dimensão da tabela.

As tabelas podem ser multidimensionais:

> x = round(runif(100) * 10)
> y = round(runif(100) * 10)
> x = round(runif(100) * 10)
> z = round(runif(100) * 10)
> tab3 <- table(x, y, z)
> class(tab3)
[1] "table"
> attributes(tab3)
$dim
[1] 11 11 11

$dimnames
$dimnames$x
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

$dimnames$y
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

$dimnames$z
 [1] "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"


$class
[1] "table"

>                            

Classe da Classe

A maneira mais direta é testar o que acontece quando fazemos o comando 'class( class(x) )':

> x = 1:10
> class(x)
[1] "integer"
> class( class(x) )
[1] "character"
>
> y = c("manão","laranja","uva")
> class( y )
[1] "character"
> class( class( y ) )
[1] "character"
>
> z = 3 >= 1:10
> class( z )
[1] "logical"
> class( class( z ) )
[1] "character"
>  

Note que a classe que a função 'class' retorna é sempre 'character', pois trata-se de um nome (palavra), quer seja, o nome da classe do objeto argumento.

Logaritmo na Base 2

#
# Função redundante com a função log2
#
logdois <- function(x) log(x, base=2)

Somatorio dos n Primeiros Números Naturais

#
# Versão mais direta da somatório (força bruta)
#
soma.n <-function(x) sum(1:x)
#
# Versão de Frederich Gauss (com 12 anos de idade)
#
soma.gauss <-function(x) x*(x+1)/2

Índices de Dispersão I

#
# Razao da Variancia Media
#
varmed <- function(x)
{
        var(x) / mean(x)
}
#
# Coeficiente de Green
#
green <- function(x)
{
        vm <- varmed(x)
        (vm - 1) / (sum(x) - 1)
}
#
# Índice de Morisita
#
morisita <- function(x)
{
        n <- length(x)
        yu <- sum(x^2) - sum(x)
        yd <- (sum(x))^2 - sum(x)
        n * yu / yd
}

Gráfico de Whittake

#
# Gráfico de Whittaker
#
whittaker <- function(sp)
{
        abund <- sort(table(sp), decreasing=TRUE)
        n <- length(abund)
        plot(1:n, abund,
                type="l",
                xlab="Rank de Abundância das Espécies",
                ylab="Abundância",
                log="y",
                las = 1
        )
}

Editando Funções Externamente

> # Para saber qual é o editor padrão do R:
> getOption( "editor" )
[1] "vi"
>
> # Para mudar o editor padrão do R:
> options( editor = "gedit" )
>
> # Agora basta evocar a função 'edit'
> # para editar um arquivo externo usar o argumento 'file'
> edit( file="minhas-funcoes.R" )
NULL
>   

Ao finalizar a edição externa do aquivo 'minhas-funcoes.R', o R automoaticamente lê o arquivo usando o comando 'source'.

Índices de Diversidade de Espécies

#
# Índice de diversidade de Shannon
#
shannon <- function(sp)
{
        densi <- table( sp )
        p <- densi / sum(densi)
        shannon <- - sum( p * log(p) )
        shannon
}
#
# Índice de Diversidade de Simpson
#
simpson <- function(sp)
{
        densi <- table( sp )
        p <- densi / sum(densi)
        simpson <-  sum( p^2 )
        simpson
}

Loop para Representar o TCL

Em termos simples, o Teorema Central do Limite (TCL) mostra que independentemente da distribuição de uma variável aleatória, digamos X, a média amostral de X tenderá à distribuição Normal à medida que o tamanho da amostra tende ao infinito. A distribuição da média amostra terá a mesma média de X, mas a variância será a variância de X dividida pelo tamanho do amostra.

Como exemplo, assuma que X tem distribuição exponencial com média 1. Vamos simular 1000 amostras de tamanhos n1=10, n2=100 e n3=1000

> # Gera 1000 amostras aleatórias da exponencial com tamanhos  10, 100 e 1000
> x1 = matrix( rexp(10 * 1000), ncol=1000 )
> x2 = matrix( rexp(100 * 1000), ncol=1000 )
> x3 = matrix( rexp(1000 * 1000), ncol=1000 )
>
> # Calcula as médias das 1000 amostras aleatórias dos vários tamanhos
> m1 = apply(x1, 2, mean)
> m2 = apply(x2, 2, mean)
> m3 = apply(x3, 2, mean)
>
> # Gráfico com as densidades dos três tamanhos de amostra
> plot( density(m3) , col="blue" , xlim=c(0,3))
> lines( density(m2) , col="red" )
> lines( density(m1) , col="darkgreen" )

Tabela de Fitossociologia

fitosoc <- function(df)
{
#  O argumento 'df' é um data.frame que contém as variáveis:
#       'sp' - espécie
#       'dap' - diâmetro das árvores
#       'parcela' - parcela
#
#  Extrair as variáveis do data.frame
       sp <- df[,"sp"]
       dap <- df[,"dap"]
       parcela <- df[,"parcela"]

# Calcular a Densidade
       densi <- aggregate( sp,  list(especie=sp), function(x) length(x) )
       names(densi)[2] <- "densidade"
        densi$densidade.r <- densi$densidade / sum(densi$densidade) * 100

# Calcular a Dominancia
        domi <- aggregate( (pi/40000)*dap^2, list(especie=sp), sum)
       names(domi)[2] <- "dominancia"
       domi$dominancia.r <- domi$dominancia / sum(domi$dominancia) * 100

# Calcular a Frequencia
       freq <- aggregate( parcela, list(especie=sp), function(x){length(unique(x))})
       names(freq)[2] <- "frequencia"
       freq$frequencia.r <- freq$frequencia / sum( freq$frequencia) * 100

# Juntar os cálculos
       out <- cbind( densi, domi[,-1], freq[,-1] )
       out$ivi <- out$densidade.r + out$dominancia.r + out$frequencia.r
       out <- out[ order(out$ivi, decreasing=TRUE), ]

       out
}
biometria/r-tutor/09-solucao.txt · Última modificação: 2015/08/10 20:48 (edição externa)