* [[bie5782:02_tutoriais:tutorial3:start|Tutorial]]
* [[bie5782:01_curso_atual:exercicios3| Exercícios]]
* [[bie5782:03_apostila:04-dados| Apostila]]
====== 3. Tutoriais de Leitura e Manipulacão de dados no R ======
===== Vetores como estrutura básica de dados =====
Nos tutoriais anteriores, nós usamos o objeto que é a estrutura básica dos objetos de dados, a classe de objetos vetores.
Crie um vetor de dados numéricos, chamado "num", que seja uma sequência de valores de 0 a 15 divididos em 7 valores equidistantes.
num <- seq(0,15, len=7)
Agora vamos olhar os valores do objeto criado, em seguida elevar cada valor ao quadrado, atribuindo o resultado ao objeto "num2". Em seguida tire a raiz-quadrada desse vetor.
num
length(num)
class(num)
num2<-num^2
num2
sqrt(num2)
num
Agora vamos extrair apena o quinto elemento e em seguida substituir esse elemento pela palavra "quinto_elemento". Em seguida vamos repetir as operações anteriores:
num[5]
num[5]<- "quinto_elemento"
num
num[-5]
length(num)
class(num)
num^2
sqrt(num^2)
O que aconteceu aqui? Por que não conseguimos mais operar o vetor "num"? Vamos agora voltar o vetor para sua forma original e operar novamente:
num[5]<- 10
num
num^2
sqrt(num^2)
Por que ainda não conseguimos? Vamos investigar o vetor e ajustá-lo.
length(num)
class(num)
num <- as.numeric(num)
sqrt(num^2)
A raiz de um valor elevado ao quadrado é o próprio valor? O que aconteceria se o vetor fosse de números negativos? Veja a discussão sobre função quadrática e raiz quadrada como [[http://en.wikipedia.org/wiki/Inverse_function|funções inversas nesse link]]
===== Leitura de Dados =====
Salve o arquivo de dados de [[:dados:dados-caixeta|levantamento de espécies em caixeitais]] no seu diretório de trabalho e crie um objeto com seu conteúdo em sua área de trabalho do R. Usaremos este conjunto de dados em todos os tutoriais da unidade, exceto o último.
**Obs.**: Para salvar, clique com o botão direito do mouse e selecione "salvar linque" LOL.
Depois de efetuar a leitura **sempre verifique a estrutura dos dados antes de continuar suas análises**.
caixeta = read.table("caixeta.csv", header=T, sep=",", as.is=T)
class(caixeta)
dim(caixeta)
names(caixeta)
str(caixeta)
head(caixeta)
Transforme a coluna ''especie'' em fator, em um vetor separado. Isso ajuda na manipulação de dados, já que o vetor é correspondente à coluna, mas é de uma classe diferente.
spp=factor(caixeta$especie)
spp
Verifique o resultado dos comandos abaixo
unique(spp)
unique(caixeta$especie)
===== Tabelas e Matrizes =====
Prosseguindo com o mesmo conjunto de dados do tutorial anterior:
Contando spp por local e selecionando uma localidade
str(caixeta)
caixeta.local = table(caixeta$especie, caixeta$local)
str(caixeta.local)
class(caixeta.local)
dimnames(caixeta.local)
caixeta.local[,"chauas"]
Transformando um objeto de outra classe em matriz
caixeta.mat=matrix(caixeta.local,ncol=3)
colnames(caixeta.mat)<-colnames(caixeta.local)
rownames(caixeta.mat)<-rownames(caixeta.local)
caixeta.mat
str(caixeta.mat)
Faz diferença??
table(caixeta.local==caixeta.mat)
===== Totais Marginais =====
Número de espécies por local
caixeta.vf=caixeta.mat>0
caixeta.vf
riqueza=apply(caixeta.vf,2,sum)
riqueza
===== Indexação e Manipulação =====
chauas = caixeta.mat[,"chauas"]
which(chauas>0)
chauas.bin <- chauas
chauas.bin[which(chauas>0)]<-1
chauas.bin
Selecionando colunas, linhas e valores do objeto caixeta, baseado em critérios de algum estado de um fator (espécie, local).
str(caixeta)
nome.spp <- unique(caixeta$especie)
nome.local <- unique(caixeta$local)
caixeta[caixeta$especie==nome.spp[1],]
caixeta[caixeta$local==nome.local[2],]
caixeta[caixeta$especie==nome.spp[1] & caixeta$local==nome.local[2],]
**Qual o erro? **
Tente esse comando:
caixeta[caixeta$especie==nome.spp[1] & caixeta$local==nome.local[1],]
===== Usando matrizes para simular =====
Se tomamos uma amostra ao acaso com reposição((ou uma amostra muito pequena em relação ao tamanho da população, pois se aproxima de uma amostra com reposição)) de uma população estatística e medimos algum atributo dos elementos desta amostra, podemos estimar a variância desta medida na população com :
$$s^2 = \frac{\sum_{i=1}^n (x_i-\bar{x})^2}{n-1}$$
**Onde**
* $s^2$ é o estimador da variância
* $x_i$ é cada uma das medidas, tomadas do elemento $i=1$ ao $n$-ésimo
* $\bar{x}= \frac{1}{n}\sum_{i=1}^n x_i$ é a média das medidas da amostra
* $n$ é o número de elementos na amostra (tamanho amostral)
O denominador $n-1$ é necessário para que o estimador não seja enviesado. O que aconteceria se usássemos o tamanho da amostra $n$ e não $n-1$ como denominador?
Vamos investigar isto com uma simulação, sorteando amostras de uma população com uma variância conhecida, e calculamos a variância de cada uma delas pelos dois métodos. Um estimador sem viés em média tem o valor do que ele estima, que é parâmetro da população que ele estima. Portanto, basta comparar as médias das variâncias calculadas das duas maneiras para avaliar se há viés.
Usaremos as funções de construção de matrizes e de cálculos de funções marginais (''apply'') para realizar estas simulações.
Para calcular a variância amostral definida pela expressão acima temos a função ''var'' do R. Vamos agora criar uma função para calcular a variância sem a correção de viés $$n-1$$, ou seja:
$$s^2 = \frac{\sum_{i=1}^n (x_i-\bar{x})^2}{n}$$
Para isto copie e cole o seguinte comando no R ((Você irá entender este comando na [[bie5782:03_apostila:programar_ale|unidade sobre criação de funções]]. Por ora basta aceitar que criamos uma função que calcula a variância sem a correção de viés. Como trata-se apenas de aceitar, pode copiar e colar o comando. Mas em geral digite os comandos dos tutoriais)):
var.2=function(x)(var(x)*(length(x)-1))/length(x)
Agora vamos criar mil amostras de tamanho 10, tomadas de uma população com distribuição normal de média igual a um e variância igual a quatro. O primeiro passo é gerar dez mil valores sorteados desta distribuição normal:
valores = rnorm(10000, mean=1, sd=2)
Agora vamos distribuir estes valores em uma matriz com 1000 colunas. Como são 10.000 valores, cada coluna terá 10 linhas, e representará uma das 1000 amostras de tamanho 10.
valores.m = matrix(valores,ncol=1000)
Agora vamos usar a função ''apply'' para calcular as variâncias de cada coluna desta matriz, usando as duas funções
##Estimador com correção
variancias1 = apply(valores.m, 2, var)
## Estimador sem correção
variancias2 = apply(valores.m, 2, var.2)
Por fim calculamos as médias dos dois conjuntos de 1000 variâncias. O estimador sem viés terá uma média que converge ao valor da variância na população, que é 4:
mean(variancias1)
mean(variancias2)
===== Operações Matriciais =====
{{:bie5782:02_tutoriais:tutorial3:matrizestruturada.jpeg?400 |}}As matrizes de transição são uma maneira conveniente de modelar o crescimento de uma população dividida em faixas etárias, ou estágios de desenvolvimento ((para saber mais veja a [[http://ecologia.ib.usp.br/bie312/doku.php?id=mod1:mat_apoio:roteiros#i_dinamica_de_populacoes_de_plantas|Página da disciplina de Ecologia Vegetal]] )).
Uma forma de representar essas populações que apresentam estágios diferentes é com diagramas mostrando as transições e permanências entre estados.
Uma forma compacta de representar matematicamente essas transições e permanência é utilizando a forma de matriz, que nesse caso se chama **//matriz de transição//**, como na figura abaixo:
{{:bie5782:02_tutoriais:tutorial3:matrizestruturada1.jpeg?150|}}
Para uma população de //Coryphanta robinsorum// (Cactaceae) no deserto do Arizona, dividida em três estágios, a matriz de transição foi:
0,43 0 0,56
0,33 0,61 0
0 0,30 0,96
Os elementos da matriz são a probabilidades de transição, num intervalo de tempo, do estágio correspondente ao número da coluna para o estágio correspondente ao número da linha. Por exemplo, a chance de um indivíduo passar do estágio 1 (plântula) para o 2 (jovem) é 0,33, e de permanecer em 1 é de 0,43.
Crie um objeto da classe matriz com esses valores. Isso nos permitirá realizar operações matriciais para prever o estado da população.
mat.trans <- matrix(c(0.43,0.33,0,0,0.61,0.3,0.56,0,0.96),3,3)
mat.trans
Agora crie um vetor com as abundâncias iniciais de indivíduos em cada classe. Vamos começar com 50 plântulas , 25 jovens e 10 adultos.
pop.inicio <- c(50,25,10)
names(pop.inicio)<-c("plântula", "jovem", "adulto")
pop.inicio
Para calcular o número de indivíduos em cada estágio após um intervalo de tempo, basta multiplicar a matriz de transição pelas abundâncias dos indivíduos em cada estágio. Usamos o operador de multiplicação matricial ''%*%'' para isso. Qual será o número de plantas em cada estágio após três intervalos?
pop.1 <- mat.trans%*%pop.inicio
pop.1
pop.2 <- mat.trans%*%pop.1
pop.2
pop.3 <- mat.trans%*%pop.2
pop.3
Vamos agora armazenar a trajetória do tamanho dos estágios na população em um data frame:
pop <- data.frame(t0=pop.inicio, t1=pop.1, t2=pop.2, t3=pop.3)
pop
Por fim, vamos olhar esses dados em um gráfico. O código abaixo vai ser abordado na aula de gráficos, por enquanto apenas copie e cole as linhas no console do R:
matplot(x=0:3, t(pop), type="l", xlab="tempo", ylab="numero de indivíduos")
legend("topright", legend=names(pop.inicio), bty="n", lty=1:3, col=1:3)
**Opcional**: a multiplicação de matrizes usados neste tipo de modelo de dinâmica populacional estruturada. Com um pouco mais álgebra linear você pode obter muito mais informações. Por exemplo, a taxa de crescimento geométrico da população é o primeiro autovalor da matriz de transição, que pode ser calculado com a função ''eigen''((consulte a ajuda para interpretar o resultados dessa função)). Se a taxa é maior que um a população está crescendo. É o caso dessa população?
eigen(mat.trans)