====== Leandro Tavares Vieira ====== {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:eu-cnpq4.jpg|}} Leandro Tavares Vieira is a graduate student in the Ecology Graduate Program of the University of Campinas, Brazil, and has research interest in plant community ecology, currently investigating geographic patterns of woody species of northeastern Brazilian Cerrado. ===== Meus Exercícios ===== Exercício 01 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrov_ex1_f.r|LeandroVieira_Ex01_F}} Exercício 02 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrov_ex02_f.r|LeandroVieira_Ex02_F}} Exercício 03 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrov_ex03_f.r|LeandroVieira_Ex03_F}} Exercício 04 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrovieira_ex04_f.r|LeandroVieira_Ex04_F}} Exercício 05 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrov_ex05_f.r|LeandroVieira_Ex05_F}} Exercício 06 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrovieira_ex06_f.r|LeandroVieira_Ex06_F}} Exercício 07 parcial {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandro_vieira_ex07_p.r|LeandroVieira_Ex07_P}} Exercício 08 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrovieira_ex08_f.r|LeandroVieira_Ex08_F}} Exercício 09 {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:leandrovieira_ex09_f.r|LeandroVieira_Ex09_F}} ===== Proposta de Trabalho Final ===== ==== Principal ==== === Análise Espacial de Superfícies === Amostras contêm valores representativos do fenômeno estudado ((Pouco informativo! O que significa "valores representativos", "fenomeno estudos": precisas ser mais preciso!)), usualmente obtidos de levantamento de campo que apresentam consistência de metodologia e unidade. Esses dados levantados estão disponíveis na forma de amostras pontuais e para utilizá-los de maneira efetiva necessitamos de um procedimento de interpolação para gerar sua representação no espaço onde não há informação. Para gerar superfícies que aproximem o fenômeno estudo de forma realista, é necessário modelar sua variabilidade espacial (Camargo et al. 2004). Os modelos que objetivam criar superfícies com base em procedimentos de interpolação podem ter três grandes abordagens: Modelos determinísticos de efeitos locais, de efeitos globais e de efeitos globais e locais (Krigagem) (Camargo et al. 2004). A idéia inicial da proposta é criar uma função ou um conjunto de funções que contemplem estas três abordagens. Porém isso pode ser uma tarefa extremamente difícil dando margem para a execução de apenas uma das abordagens e sem a construção de gráficos de superfície. Camargo, E. C. G, Druck, S. & Câmara, G. (2004). Análise Espacial de Superfícies. in: Análise Espacial de Dados Geográficos. Embrapa Cerrados, Planaltina, DF. ==== Plano B ==== Criar uma função que calcule todos os parâmetros fitossociológicos (freqüência, abundância, área basal, etc.) realizados com o método de parcelas. Os parâmetros poderiam sair por espécie, por família e por parcela. ==== Comentário ==== A primeira proposta parece mais sedutora, pois pode prover instrumento interessante para análise espacial. Entretanto, fica difícil avaliá-la porque faltam elementos: 1. qual a informação de entrada? ; 2. qual o objeto de saída?; 3. Quais cálculos serão efetuados no processo? Fica difícil avaliar a viabilidade da proposta sem esses elementos. De qq forma é necessário que tenha algum treinamento prévio nos métodos de interpolação. Aqui o problema é que antes de construir uma função precisamos definir exatamente qual o resultado que será produzido e estrutura dos dado de entrada, ou seja qual o procedimento de manipulação dos dados. Nesse sentido, o plano B, apesar de mais simples em sua apresentação, parece mais concreto pois deixa claro quais parâmetros que serão calculados. Defina bem aqui como será a estrutura de entrada de dados. ==== Contexto==== A avaliação da primeira proposta realmente ficou difícil por falta de elementos, e era exatamente esse elementos que eu estava buscando. Quando escrevi a proposta não sabia de fato como era o procedimento das análises espaciais, só sabia que a entrada era uma data.frame X,Y, e Z, cujo resultado era um gráfico de superfície com valores interpolados, o que eu conseguia com softwares como o Geostatistics Sciences Plus. Foi uma proposta audaciosa pois não tenho o treinamento prévio dos métodos de interpolação, bem observado pelos professores, mas insisti nesta proposta pois o plano B era desafiador apenas na linguagem R pois os cálculos dos parâmetros fitossociológicos não são enigmas nenhum. Como a beleza do R é ter uma melhor compreensão do que estamos fazendo, e não ficar preso aos pacotes estatísticos, me mantive no plano A. O resultado final foi realmente a compreensão de todas as etapas para a construção de um gráfico de superfícies por krigagem por exemplo, porém, empaquei justamente na interpolação, e dado o espaço de tempo, me ative na primeira etapa. O que eu fiz então foi um programa que faz um Semivariograma para qualquer tipo de dado espacial cuja entrada seja por X, Y, Z. A próxima etapa seria ajustar o semivariograma à modelos teóricos como gaussiano, exponencial, esférico etc, e de acordo com o modelo ajustado, interpolar para áreas não amostradas. Meu maior problema foi entender a matemática de estimar os valores de acordo com os modelos que achei um pouco complicado, pelo menos pelos livros que eu tenho, e nem tanto para transformar para a linguagem R. Bom, é isso, não consegui fazer tudo o que eu queria, mas atingi meus objetivos de compreender a análise espacial e "falar" a linguagem R. Muito obrigado por tudo. ===== Página de Ajuda ===== semivariance{} package:nenhum R Documentation Semivâriancia para dados espaciais Description: Retorna um gráfico da Semivariância em função das Classes de Distâncias. A função também retorna os limites superiores das classes de distância, o número de pares de observações para cada classe e os valores de semivariância. Usage: semivariance (x, nclasse=0, equal.obs=F, n.obs=0, width.class=0) Arguments: x: data.frame ou Matriz. Valores das coordenadas espaciais e a amostra, em ordem X, Y, e Z nclass numérico. Determina o número de classes de distância. No padrão “0” fica determinado pelo produto da raiz quadrada do número de observações de Z. equal.obs lógico. Se as classes de distância conterão iguais números de pares de observações. n.obs numérico. Determina o número de pares de observações por classe de distância. No padrão “0”, o tamanho é definido de acordo com os argumentos anteriores. width.class numérico. Determina o tamanho das classes de distância. No padrão “0”, o tamanho é definido de acordo com os argumentos anteriores. Details: O cálculo da semivariância para análise de estrutura espacial é utilizado para dados ambientais que não apresentam distribuição normal, pois o cálculo é baseado nos desvios entre as sucessivas classes de distância. Outra característica importante é a não necessidade de média e variância constante. Os valores de semivariância são plotados contra classes de distância ou “lag”, o que é chamado de Semivariograma. As classes de distância pode ser construída de acordo com o pesquisador tanto em número de classes, número de pares de observações por classe e o tamanho (distância) das classes. Quando selecionado o tamanho das classes, não é possível determinar o número de classes nem o número de pares de observações para cada classe. O semivariograma tem duas grandes aplicações, reconhecimento de estrutura espacial e interpolação ótima. No reconhecimento de estrutura espacial, três características do semivariograma são importantes. A semivariância cresce gradualmente até atingir um ponto, chamado de “amplitude” ou “alcance”. O alcance é a distância onde as observações são espacialmente dependentes. O “patamar” é o valor da semivariância correspondente ao alcance, onde as observações, teoricamente, possuem variância constante portanto espacialmente independentes. E o “efeito pepita” que é o valor da semivariância para a distância zero e representa a variabilidade ao acaso. Para interpolações, o semivariograma precisa ser ajustado de acordo com modelos teóricos como o modelo esférico, modelo linear, modelo exponencial, e modelo gaussiano. De acordo com o modelo, valores para locais não amostrados podem ser estimados. Value: semivariance retorna uma lista contendo: os limites superiores das classes de distância, o número de pares de observações por classe de distância, a semivariância por classe de distância, um grágico, chamado de semivariograma. Note: O objeto de entrada tem que estar na ordem X, Y, Z. Quando definido o argumento "n.obs", os outros argumentos são invalidados. Quando definido o argumento "width.class", os outros argumentos são invalidados. Warning: O semivariograma é definido de acordo com as classes de distância. Cabe ao pesquisador definir como será esta classe de distância. Author(s): Leandro Tavares Vieira (vieiralt@yahoo.com.br) References: Jongman, R.H.G, ter Braak, C.J.F & van Tongeren, O.F.R. (1995). Data Analysis in Community and Landscape Ecology. Cambridge University Press. Camargo, E. C. G, Druck, S. & Câmara, G. (2004). Análise Espacial de Superfícies. in: Análise Espacial de Dados Geográficos. Embrapa Cerrados, Planaltina, DF. See Also: Os pacotes spatstat e spatial. Examples: Ex.1: X <- c(200,348,200,232,233,209,178,331,323,168,302,212,256,122,214,317,305,72,307,149,196,286, 331,181,192,219,95,306,251,95,173,142,326,44,47,332,264,67,101,65,85,132,87,232,158,180,271, 186,273,84) Y <- c(123,100,284,208,160,238,36,86,241,244,259,138,128,82,273,161,200,158,230,213,88,190, 100,152,103,199,198,119,169,134,65,82,178,213,228,73,289,235,114,94,223,204,168,275,38,135, 258,168,272,124) Z <- c(102.01,4.04,1108.22,662.03,82.45,898.80,0.00,0.00,669.77,942.49,560.27,53.29,5.29, 18.49,1036.20,164.87,340.03,277.22,481.36,617.52,9.92,226.20,4.62,344.10,46.92,572.64,376.36, 23.33,107.12,100.00,3.06,51.84,283.59,451.56,475.24,0.03,594.87,571.21,33.64,20.25,552.25, 333.06,257.60,881.50,0.30,226.50,658.95,464.40,494.62,108.16) data.frame(X,Y,Z) -> slope semivariance(slope, width.class=50) semivariance(slope, 15, T) semivariance(slope, 18) semivariance(slope, n.obs=800) Ex.2 rep(seq(10,100, by=10), each=10) -> X rep(seq(10,100, by=10), time=10) -> Y c(rep(1:8, each=12), 9,9,9,9) -> Z data.frame(X,Y,Z) -> ha plot(Y~X, data=ha, pch=0, cex=5, main="Um Hectare") unique(X) -> x; unique(Y) -> y matrix(NA, ncol=x, nrow=y) -> mat colnames(mat) <- x ; rownames(mat) <- y Z -> mat[] library(lattice) image(mat) wireframe(mat, shade=TRUE, aspect=c(40/65,0.4), light.source = c(10,0,10)) semivariance(ha) semivariance(ha, 13, T) semivariance(ha, n.obs=350) semivariance(ha, width.class=25) ===== Código da Função ===== semivariance <- function(x, nclasse=0, equal.obs=F, n.obs=0, width.class=0) { colnames(x) <- c("X", "Y", "Z") ##### Criando objetos base x[,c(1,2)] ->xy dist(xy, diag=F, upper=F) ->dxy dist(x[,3])-> zdist # isso é a diferença dos valores de Z para todos os pares de pontos diff(range(dxy)) -> ampli zvalue <- list() as.numeric(zdist) -> vetzdist as.numeric(dxy) -> vetdxy data.frame(vetzdist,vetdxy) -> datadists order(datadists$vetdxy) -> orddxy orddxy -> datadists[,3] datadists[orddxy,] -> matord ##### Definindo as classes if(nclasse==0) { round(sqrt(length(x[,1])))-> numclass # Definido o número de classes baseado na raiz do número de observações. Isso pode ser alterado de acordo com o pesquisador } else { numclass <- nclasse } if(equal.obs==F) { 1 + numclass -> numclasse (ampli/numclass) -> sizeclass classes <- rep(NA, numclasse) names(classes) <- paste("classe", 1:numclasse) for(i in 2:numclasse) { dados <- (min(dxy)+ sizeclass*(i-1)) classes[i] <- dados } classes[1] <- 0 round(classes, digits=2) -> classes tamanho <- rep(0, numclass) for(i in 1:(length(classes)-1)) { which(dxy<=classes[i+1] & dxy> classes[i]) -> conta sum(conta !=0) -> soma soma -> tamanho[i] } tamanho[1:length(classes)-1] -> tamanho ### Semivariância for(i in 1:(length(classes)-1)) { zdist[which(dxy<=classes[(i+1)] & dxy>classes[i])] -> zvalue[[i]] } Semivariancia <- rep(NA, time=(length(classes)-1)) for(i in 1:length(Semivariancia)) { sum(zvalue[[i]]^2)/(2*(length(zvalue[[i]]))) -> Semivariancia[i] } } else { round(length(dxy)/numclass) -> pares matrix(sort(dxy), ncol=numclass, nrow=pares)-> dataclass ifelse((length(dataclass) - length(dxy))==0, dataclass , dataclass[(length(dxy)+1): length(dataclass)] <- rep(NA, (length(dataclass) - length(dxy)))) classes <- rep(NA, (numclass+1)) names(classes) <- paste("classe", 1:(numclass+1)) round(apply(dataclass, 2, max, na.rm=T),digits=2) -> classes[2:(numclass+1)] classes[1] <- 0 tamanho <- rep(pares, numclass) tamanho[numclass] <- pares - (length(dataclass) - length(dxy)) ### Semivariância matrix(matord$vetzdist, ncol=numclass, nrow=pares)-> dataequal ifelse((length(dataequal) - length(dxy))==0, dataequal , dataequal[(length(dxy)+1): length(dataclass)] <- rep(NA, (length(dataclass) - length(dxy)))) if((length(dataequal) - length(dxy))!=0) { cat("\n\tO número de pares de observações por classe de distância não é múltiplo do número de pares de observações total.\n\tProblema corrigido. Repare na última classe\n") } Semivariancia <- rep(NA, time=(length(classes)-1)) dataequal^2 -> dataequal2 apply(dataequal2, 2, sum, na.rm=T) -> sumequal for(i in 1:numclass) { sumequal[i]/(2*(tamanho[i])) -> Semivariancia[i] } } if(n.obs==0) { #nada } else { n.obs ->nobs matrix(sort(dxy), nrow=nobs)-> matobs ifelse((length(matobs) - length(dxy))==0, matobs , matobs[(length(dxy)+1):length(matobs)] <- rep(NA, (length(matobs) - length(dxy)))) dim(matobs) -> dmatobs dmatobs[2] -> numclass classes <- rep(NA, (numclass+1)) names(classes) <- paste("classe", 1:(numclass+1)) round(apply(matobs, 2, max, na.rm=T),digits=2) -> classes[2:(numclass+1)] classes[1] <- 0 tamanho <- rep(nobs, numclass) tamanho[numclass] <- nobs - (length(matobs) - length(dxy)) cat("\n\tSelecionado o número de observações por classe de distância. Argumentos nclass, equal.obs e width.class não são válidos.\n\n") if((length(matobs) - length(dxy))!=0) { cat("\n\tO número de pares de observações por classe de distância escolhido não é múltiplo do número de pares de observações total.\n\tProblema corrigido. Repare na última classe\n") } ####Semivariância matrix(matord$vetzdist, ncol=numclass, nrow=nobs)-> dataobs ifelse((length(dataobs) - length(dxy))==0, dataobs , dataobs[(length(dxy)+1):length(dataobs)] <- rep(NA, (length(dataobs) - length(dxy)))) Semivariancia <- rep(NA, time=(length(classes)-1)) dataobs^2 -> dataobs2 apply(dataobs2, 2, sum, na.rm=T) -> sumobs for(i in 1:numclass) { sumobs[i]/(2*(tamanho[i])) -> Semivariancia[i] } } if(width.class==0) { #nada } else { width.class -> sizeclass ceiling(max(dxy)/sizeclass) -> numclass # É incompatível com o argumento nclass e com equal.obs 1 + numclass -> numclasse classes <- rep(NA, numclasse) names(classes) <- paste("classe", 1:numclasse) for(i in 2:numclasse) { dados <- (sizeclass*(i-1)) classes[i] <- dados } classes[1] <- 0 round(classes, digits=2) -> classes tamanho <- rep(NA, numclass) for(i in 1:length(classes)) { which(dxy<=classes[i+1] & dxy> classes[i]) -> conta sum(conta !=0) -> soma soma -> tamanho[i] } tamanho[1:length(classes)-1] -> tamanho cat("\n\tSelecionado o tamanho das classes. Argumentos nclass, equal.obs e n.obs não são válidos\n\n") ##### Semivariância for(i in 1:(length(classes)-1)) { zdist[which(dxy=classes[i])] -> zvalue[[i]] } Semivariancia <- rep(NA, time=(length(classes)-1)) for(i in 1:length(Semivariancia)) { sum(zvalue[[i]]^2)/(2*(length(zvalue[[i]]))) -> Semivariancia[i] } } ######## round(Semivariancia, digits=2) -> Semivariancia round(classes[2:length(classes)], digits=2) -> DistanceClass names(DistanceClass) <- paste("Classe", 1:(length(classes)-1)) plot(Semivariancia~DistanceClass, pch=16, cex=1.3, col="red", main="Semivariograma", xlab="Classes de Distância", ylab="Semivariância", cex.axis=1.1, font.lab=2, font.main=3, cex.lab=1.2, cex.main=1.5) -> Gráfico for(i in 1:length(DistanceClass)) { segments(DistanceClass[i],Semivariancia[i], DistanceClass[i+1],Semivariancia[i+1], col="red") } for(i in 1:length(DistanceClass)) { segments(DistanceClass[i],-10, DistanceClass[i],Semivariancia[i], col="lightgray", lty=5) } list(DistanceClass, tamanho, Semivariancia, Gráfico) -> lista names(lista) <- c("\n\tClasses de Distância", "\tNúmero de Pares de Observações por Classe de Distância", "\tSemivariância", "\tGráfico") return(lista) } ===== Arquivo da Função ===== {{:bie5782:01_curso_atual:alunos:trabalho_final:vieiralt:semivariance.r|Função da Semivariância}}