Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducao Ao R PDF
Introducao Ao R PDF
Conhecendo a frmula voc pode criar sua prpria funo que calcula a mdia. Note que
voc pode inserir comentrios dentro da funo para depois lembrar o que fez:
> media<-function(dados){ #funo chamada media
+ n<-length(dados) ## n o nmero de observaes
+ med<-sum(dados)/n ## calcula a mdia
+ return(med) # return que retorna os resultados calculados
+ } # Fim da funo
Vamos usar a funo criada (media) para calcular a mdia dos valores abaixo:
> valores<-c(21, 23, 25, 19, 10,1 ,30, 20, 14, 13)
> mdia(valores)
Use a funo do R mean() para verificar se o clculo foi feito corretamente.
O comando for
O comando for usado para fazer loopings, e funciona da seguinte maneira:
"for(i in 1:n){comandos}"
Isso quer dizer que: para cada valor i o R vai calcular os comandos que esto entre as
chaves {comandos}. O "i in 1:n" indica que os valores de i sero i = 1 at 1 = n. Ou
seja, na primeira rodada do for o i ser igual a 1, na segunda i = 2, e assim por diante at i
= n. Para salvar os resultados que sero calculados no for precisamos criar um objeto vazio
que receber os valores calculados. Criamos este objeto vazio assim:
> resu<-numeric(0)
33
Agora vamos usar o for para elevar i valores ao quadrado:
> for(i in 1:5){ ## o i ser i = 1; i = 2; i = 3; i = 4; i = 5
+ resu[i]<-i^2 ## Na primeira rodada o i = 1, ento ser 1
2
+ } # Fim do for (i)
> resu ## Para ver os resultados
Antes de continuar, vamos fazer uma espcie de "filminho" mostrando o que o for faz:
Primeiro vamos fazer um grfico com limites xlim =0:10 e ylim=0:10.
> plot(0:10,0:10, type="n")
Agora vamos usar o for para inserir textos no grfico a cada passo do for:
> for(i in 1:9){
+ text(i,i, paste("Passo", i))
+ }
O R fez tudo muito rpido, de forma que no conseguimos ver os passos que ele deu.
Vamos fazer novamente, mas agora inserindo uma funo que retarde o R em 1 segundo. Ou
seja, cada passo ir demorar 1 segundo.
> plot(0:10,0:10, type="n")
> for(i in 1:9){
+ text(i,i, paste("Passo", i))
+ Sys.sleep(1) ## retarda os passos em 1 segundo
+ }
Entendeu o que est sendo feito? No primeiro passo do for, o i igual a 1, portanto
apareceu o texto "passo 1" na coordenada x=1, y=1 do grfico. No segundo passo o i igual a
2 e aparece o texto "passo 2" na coordenada x=2, y=2, e assim por diante.
O for um comando bastante utilizado em diversas funes e na simulao de dados.
Fique atento ao uso do "for" nas funes seguintes e pergunte caso no tenha entendido.
A seqncia de Fibonacci uma seqncia famosa na matemtica (Braun & Murdoch
2007). Os dois primeiros nmeros da seqncia so [1, 1]. Os nmeros subseqentes so
compostos pela soma dos dois nmeros anteriores. Assim, o terceiro nmero da seqncia de
Fibonacci 1+1=2, o quarto 1+2=3, e assim por diante. Vamos usar a funo for para
descobrir os 12 primeiros nmeros da seqncia de Fibonacci (Este exemplo foi retirado e
adaptado de: Braun & Murdoch 2007 pp, 48).
> Fibonacci<-numeric(0)
> Fibonacci[c(1,2)]<-1 # o 1 e 2 valores da seqncia devem ser = 1
> for (i in 3:12){ # 3 a 12 porque j temos os dois primeiros nmeros [1,1]
+ Fibonacci[i]<-Fibonacci[i-2]+Fibonacci[i-1]
+ }
34
> Fibonacci
Exerccios: Modifique o cdigo para gerar a seqncia de Fibonacci de forma que:
a) mude os dois primeiros elementos da seqncia para 2 e 2
b) mude os dois primeiros elementos da seqncia para 3 e 2
c) modifique o cdigo para que os valores sejam compostos pela diferena entre os dois
valores anteriores.
d) modifique o cdigo para que os valores sejam compostos pela diferena entre os dois
valores imediatamente anteriores somada ao terceiro valor imediatamente anterior. Faa
inicialmente com que a seqncia Fibonacci comece com 3 valores [1,1,1].
Agora vamos usar o for para fazer uma funo mais complexa, que calcula o ndice de
diversidade de Shannon. A frmula do ndice de Shannon :
=
onde P
i
o valor i em proporo e ln o logaritmo natural de i.
> shannon<-function(dados){ #Criamos a funo shannon
+ prop<-dados/sum(dados) ## calcula as propores
+ resu<-numeric() # objeto numrico "vazio" que receber os valores do for
+ n<-length(prop)
+ for(i in 1:n){
+ resu[i]<-if(prop[i]>0){prop[i]*log(prop[i])}
+ else{0} # veja abaixo sobre o uso do if e do else
+ } # Fim do for (i)
+ H<- -sum(resu)
+ return(H)
+ } # Fim da funo
Nota: Durante o clculo do ndice de Shannon precisamos pular do calculo quando o
valor de proporo zero, porque log(0) no existe (-inf). Por isso usamos o if e o
else, ou seja, se (if) o valor for maior que zero faa o calculo, se no (else) retorne 0.
> log(0) # veja o resultado do log de zero.
Agora vamos usar a funo shannon para calcular o ndice de Shannon dos dados
apresentados no livro da Anne Magurran pgina 45, tabela 2.1 (Diversidad Ecolgica y su
Medicin, 1988). Os dados so:
> magur<-c(235,218,192,0,20,11,11,8,7,4,3,2,2,1,1)# O valor 0
foi alterado propositalmente, no livro o valor 87.
> shannon(magur)
Esta funo que criamos para calcular o ndice de diversidade de Shannon calcula o
ndice de apenas um local por vez. Agora vamos criar uma funo que calcula o ndice de
35
Shannon de vrios locais ao mesmo tempo. Neste caso teremos que usar o comando for
duas vezes.
> shan<-function(dados){ # nome de shan para diferenciar da funo acima
+ nl<-nrow(dados) # nmero de locais (linhas)
+ nc<-ncol(dados)
+ H<-numeric() # varivel vazia que receber os valores H de cada local
+ for(i in 1:nl){
+ prop<-dados[i,]/sum(dados[i,]) ## dados do local i em proporo
+ resu<-numeric()
+ for(k in 1:nc){
+ resu[k]<-if(prop[1,k]>0){prop[1,k]*log(prop[1,k])}
+ else{0}
+ }# Fim do for (k)
+ H[i]<--sum(resu)
+ } # Fim do for (i)
+ return(H)
+ } # Fim da funo
Vamos calcular o ndice de Shannon dos dados de borrachudos (spp).
> shan(spp)
Na ecologia um dos ndices de similaridade (resemblance measures) utilizado o ndice
de Jaccard:
1, 2 =
+ +
equao 2.10 (Legendre e Legendre 1998, pp 256)
Onde, no caso de uma matriz de espcies: a = nmero de espcies compartilhadas pelos
locais 1 e 2; b = nmero de espcies presentes apenas no local 1; c = nmero de espcies
presentes apenas no local 2. Vamos criar uma funo para calcular o ndice de similaridade
de Jaccard:
> jaccard<-function(dados.spp){
+ # Vamos inserir uma mensagem de erro, caso dados no sejam de presena-ausncia
+ if(any(dados.spp>1))
+ stop("Erro: preciso fornecer uma tabela com dados de
+ presena e ausncia")
+ n<-nrow(dados.spp) # nmero de locais
+ jac<-matrix(NA,n,n) ## Matriz que receber os valores de similaridade
+ colnames(jac)<-rownames(dados.spp) ## Dar os nomes dos locais
36
+ rownames(jac)<-rownames(dados.spp) ## Dar os nomes dos locais
+ for(i in 1:n){
+ for(j in 1:n){
+ # nmero de espcies presentes em ambos locais, i e j ( a )
+ a<-sum(dados.spp[i,]==1 & dados.spp[j,]==1)
+ # nmero de espcies presentes apenas no local i ( b )
+ b<-sum(dados.spp[i,]==1 & dados.spp[j,]==0)
+ # nmero de espcies presentes apenas no local j ( c )
+ c<-sum(dados.spp[j,]==1 & dados.spp[i,]==0)
+ jac[i,j]<- a /(a+b+c) ## Frmula de Jaccard
+ }
+ }
+ return(as.dist(jac))
+ }
> jac<-jaccard(pres.aus) ## os clculos demoram um pouco
> jac
> jac.vegan<-1-vegdist(pres.aus,"jaccard") ## Clculo do Jaccard
no vegan. OBS: O R no calcula similaridades e sim distncias (dissimilaridades), por isso usamos o
1-
> jac.vegan
> cbind(jac,jac.vegan) # coloque os valores lado a lado e compare. Est
correto?
Outro ndice de similaridade muito utilizado em ecologia, mas para dados de abundncia o
ndice de Bray-Curtis:
1, 2 =
1
2
1
+
2
2
onde p
i
o valor i em proporo
Confira o resultado usando a funo diversity do pacote vegan:
> library(vegan)
> diversity(spp,"simpson",MARGIN=1) # O argumento MARGIN indica
se voc quer fazer os clculos por linhas ou por colunas. Use 1 para linhas e 2 para colunas.
2 - Crie uma funo para calcular a distncia (dissimilaridade) de Hellinger dos dados de
abundncia de borrachudos. A frmula :
1, 2 =
1+
2+
2
Equao 7.55 Legendre & Legendre 1998, pp 286
Onde: y
1j
so os valores de abundncia de cada espcie j no local 1; y
2j
so os valores de
abundncia de cada espcie j no local 2; y
1+
a soma total das abundncias do local 1; y
2+
a soma
total das abundncias do local 2.
No se assuste com a frmula, tente dividi-la em partes dentro da funo.
Para calcular a distncia de Hellinger no R e conferir com resultado da sua funo use:
> hel.vegan<-vegdist(decostand(spp,"hellinger"),"euclid")
3 Desafio: Calcule o ndice de Shannon usando apenas 3 linhas de comando e o ndice de
Simpson usando apenas uma linha de comandos.
Diferena entre criar uma funo e escrever um cdigo
Existem milhares de formas de se trabalhar em R. Algumas pessoas preferem escrever
pedaos de cdigos e execut-lo quantas vezes seja necessrio, enquanto outras preferem criar
funes mais automatizadas, mas ambas produzindo o mesmo resultado. Em alguns casos vocs
38
iro se deparar com cdigos e em outros casos com funes. preciso saber diferenciar os dois
tipos, pois seu uso levemente diferente e pode gerar confuses.
Vamos gerar um cdigo que escolhe nmeros para a mega sena e depois vamos criar uma
funo que faz a mesma coisa.
> njogos<-20 # quantos jogos queremos produzir
> numeros<-matrix(NA,6,njogos) # arquivo que ir receber nmeros dos jogos
> for(i in 1:njogos){
+ numeros[,i]<-sample(1:60,6)
+ }
> numeros
Agora, caso voc queira mudar o nmero de jogos (njogos), preciso mudar o valor e rodar o
cdigo todo novamente.
Crie agora 50 jogos.
Vamos transformar nosso cdigo em uma funo e ver o que muda, apesar dos comandos
serem quase os mesmos.
> megasena<-function(njogos){ # cria a funo com nome de megasena
> numeros<-matrix(NA,6,njogos) # cria o arquivo que recebe os jogos
> for(i in 1:njogos){
> numeros[,i]<-sample(1:60,6)
> }
> return(numeros)
> }
> megasena(100)
O interessante em criar uma funo, que aps ela estar funcionando voc precisa mudar
apenas um argumento, que nesse caso o njogos.
> megasena(10)
> megasena(5)
Em geral, muitas pessoas criam um cdigo, conferem se ele est funcionando e depois
transformam o cdigo em uma funo para facilitar o processo de repetio.
39
Criar uma funo para fazer um grfico composto (genrico)
A funo generico foi criada para produzir um grfico que ordena espcies em relao a um
gradiente ambiental. Veja a figura abaixo onde uma comunidade de aves foi ordenada em relao ao
gradiente de altitude. Esta funo ser bastante utilizada no curso de comunidades e no de
estatstica multivariada, portanto importante que entenda como a funo funciona. O cdigo da
funo segue abaixo, bem como comentrios que explicam o que fazer para usar corretamente a
funo.
Abaixo segue o cdigo da funo genrico, voc ir copiar e colar o cdigo no R da parte
indicada abaixo at a parte final indicada no fim da funo. No modifique este cdigo, uma vez que
ele seja colado no R voc no precisar copiar e colar novamente, desde que salve o seu
workspace.
#####################Copie e cole no R daqui! ################################
# Funo para GRFICO COMPOSTO (Genrico)
### Criada por Victor Lemes Landeiro ######
### ltima atualizao em 18-07-2008 ###
generico<-function(tabela,gradiente,at,grad,eixoY,eixoX){ ## Comeo da
funo.
Index
0.0
114.7
Altitude
Ramphastos vitellinus
Lanio fulvus
Bucco capensis
Microbates collaris
Hylophilus ochraceiceps
Terenotriccus erythrurus
Corapipo gutturalis
Lipaugus vociferans
Dendrocolaptes certhia
Deconychura longicauda
Myrmotherula gutturalis
Micrastur gilvicollis
Thamnomanes caesius
Dendrocincla fuliginosa
Galbula albirostris
Mionectes macconnelli
Glyphorynchus spirurus
Dixiphia pipra
Tachyphonus surinamus
Dendrexetastes rufigula
Dendrocincla merula
Phaethornis superciliosus
Turdus albicollis
Pithys albifrons
Formicarius colma
Thalurania furcata
Xiphorhynchus pardalotus
Geotrygon montana
Hylexetastes perrotii
Sclerurus mexicanus
Thamnomanes ardesiacus
Xenops minutus
Frederickena viridis
Percnostola rufifrons
Cyanocompsa cyanoides
Platyrinchus coronatus
Momotus momota
Sclerurus rufigularis
Hypocnemis cantator
Deconychura stictolaema
Myrmotherula menetriesii
Cyphorhinus arada
Hylophylax poecilinotus
Schiffornis turdina
Myrmotherula axillaris
Philydor pyrrhodes
Leucopternis melanops
Myiobius barbatus
Sites
R
e
l
a
t
i
v
e
d
e
n
s
i
t
y
o
f
s
p
e
c
i
e
s
40
#Veja cima que a funo possui 6 argumentos, tabela, gradiente, at, grad, eixoY, eixoX. Abaixo
seguem alguns comentrios e exemplos sobre a funo e seus argumentos.
####### Argumentos #######
# generico<-function(tabela, gradiente ,at,"grad","eixoY","eixoX")
# tabela ### a tabela de espcies, uma data frame ou matriz com os dados das espcies
# gradiente ### arquivo com os valores do gradiente
# at ### usado para alterar a posio do nome das espcies no grfico, comece com o valor 1 e
v aumentando at os nomes ficarem na posio desejada.
# grad #### o texto para a legenda que deseja colocar no grfico mostrando o nome do
gradiente. Esta legenda no pode ser muito longa. Deve vir entre aspas.
# eixoY e eixoX #### So as legendas que deseja colocar nos eixos x e Y. Deve vir entre aspas.
##Para colocar o nome das espcies no local desejado preciso mudar o valor do argumento at
#### Abaixo segue o cdigo da funo.
tabela<-as.matrix(tabela)
gradiente<-as.matrix(gradiente)
media.pond<-colSums(tabela*gradiente[,1])/colSums(tabela)
sub.orden<-tabela[order(gradiente[,1],decreasing=F),] # Ordenar parcelas de
acordo com o gradiente
sub.orde<-sub.orden[,order(media.pond,decreasing=T)] # colocar espcies ordenadas
pela mdia ponderada
dados.pa<-matrix(0,nrow(tabela),ncol(tabela))
dados.pa[tabela>0]<-1
ordenado<-sub.orde[,which(colSums(dados.pa)>0)] ## para deletar possveis colunas
vazias (espcie que no ocorreu)
par(mfrow=c(ncol(ordenado)+1,1),mar=c(0,4,0.2,10),oma=c(3,1,1,6))
layout(matrix(1:(ncol(ordenado)+1)),heights=c(3,rep(1,ncol(ordenado))))
plot(sort(gradiente[,1]),axes=F,ylab="",mfg=c(21,1),lwd=10,las=2,lend="butt
",frame.plot=F,xaxt="n",type="h",col="black",ylim=c(min(gradiente),max(grad
iente)))
axis(side=2,at=c(0,max(gradiente)),las=2)
mtext(grad,4,outer=T,font=2,line=-10,padj=-18.5,las=2)
for(i in 1:ncol(ordenado)){
barplot(ordenado[,i],bty="l",axisnames=F,axes=FALSE,col="black")
#axis(side=2,at=max(ordenado[,i]),las=2)
mtext(colnames(ordenado)[i],3,line=-1.0,adj=0,at=at,cex=.8,font=3)
}
mtext(eixoX,1,outer=T,font=2,line=1.2)
mtext(eixoY,2,font=2,outer=T,line=-2)
}
# Este grfico ser construdo atravs de uma matriz de dados de espcies (Presena e ausncia ou
abundncia) que ser ordenada de acordo com a mdia ponderada, calculada a partir dos dados de
um gradiente ecolgico.
############## At Aqui! ###################################
## Exemplo de como usar a funo genrico##
Depois de copiar e colar a funo voc precisar digitar apenas a linha abaixo para produzir seu
grfico genrico. Vamos usar os dados dos borrachudos para fazer o grfico
> ambi<-simu[,1:6] ## Variveis ambientais
41
> spp<-simu[,7:26] ## Dados das espcies
> altitude<-ambi[,6]
>generico(spp,altitude,1,"Altitude(m)","Densidade
relativa de Simuliidae","Ordenado pela altitude")
Agora basta ir mudando o valor at para que o nome saia na posio desejada.
Em geral, esta funo ir servir para propostas exploratrias, caso queria usar este grfico em
alguma publicao talvez seja necessrio fazer algumas modificaes no cdigo. Uma das restries
que o R permite que sua janela grfica seja dividida em no mximo 50 linhas. Portanto,
impossvel construir esse grfico para ordenar mais de 48 espcies.
42
Referncias
Braun,W.J. & Murdoch,D.J. (2007) A first course in statistical programming with R, -163, Cambridge
University Press, Cambridge.
Chambers,J.M. (2008) Software for data analysis: Programming with R, -498.
Oksanen, J., Kindt, R., Legendre, P., O'Hara, R. B., and Stevens, M. H. H (2007) vegan: Community
Ecology Package. R package version 1.8-8. http://cran.r-project.org/, http://r-forge.r-
project.org/projects/vegan/
R Development Core Team (2008) R: A language and environment for statistical computing. R
Foundation for Statistical Computing, Vienna, Austria. ISBN 3-900051-07-0, http://www.R-
project.org.