**[[.:00-inicio|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
}