Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
| 02_tutoriais:tutorial8:start [2020/10/04 12:56] – [Testando a função] adalardo | 02_tutoriais:tutorial8:start [2024/09/13 19:05] (atual) – edição externa 127.0.0.1 | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | <WRAP tabs> | ||
| + | * [[02_tutoriais: | ||
| + | * [[01_curso_atual: | ||
| + | * [[03_apostila: | ||
| + | </ | ||
| + | ====== 9. Criando Funções Básicas ====== | ||
| + | |||
| + | |||
| + | ===== Nossos Personagens ===== | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | **__Pink & Cerebro__** | ||
| + | |||
| + | {{youtube> | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | //Pinky and the Brain//, no Brasil, **Pinky e o Cérebro**, são personagens de uma série | ||
| + | |||
| + | Cada episódio é caracterizado, | ||
| + | |||
| + | |||
| + | O paralelo entre os personagens e os usuários do **R** , é que estamos em uma constante transformação entre PINK e Cérebro, tentando vencer nossa ignorância. A resposta do nosso // | ||
| + | **// A mesma coisa que fazemos todas as noites, Pink... | ||
| + | |||
| + | |||
| + | |||
| + | O //PINK// que habita dentro de nós | ||
| + | |||
| + | |||
| + | {{ : | ||
| + | |||
| + | |||
| + | ===== Classe Function ===== | ||
| + | |||
| + | Um objeto de função é uma classe especial de objetos no R que encapsulam algum tarefa. A função '' | ||
| + | |||
| + | |||
| + | ===== FAZENDO VERSÕES PIORADAS DE FUNÇÕES EXISTENTES!!!! ===== | ||
| + | |||
| + | Vamos construir algumas funções simples. A primeira é uma função que calcula a média de um conjunto de valores. | ||
| + | A primeira etapa é definir qual o tipo de objetos que a função irá manipular e designar um nome a esse objeto como um argumento. No caso da média podemos definir esse objeto como um vetor numérico '' | ||
| + | No nosso caso: | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | **Pseudocodigo '' | ||
| + | - recebe um vetor '' | ||
| + | - soma os valores do vetor no objeto '' | ||
| + | - guarda o tamanho do vetor '' | ||
| + | - divide '' | ||
| + | - retorna o objeto '' | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Depois de definir o que a função conterá, precisamos abrir um bloco de código para conter as linhas de comando que definem o algoritmo com as chaves '' | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | media < | ||
| + | { | ||
| + | soma <- sum(x) | ||
| + | nobs <- length(x) | ||
| + | media <- soma/nobs | ||
| + | return(media) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <WRAP center round tip 60%> | ||
| + | Note que a função nada mais é do que um conjunto de linhas de comando concatenadas para executar uma tarefa. A princípio quem usa as funções básicas do R já está qualificado a fazer funções mais complexas a partir delas. | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Testando a função ===== | ||
| + | |||
| + | Para testar a função que acabamos de fazer, utilizamos ela da mesma maneira que as outras funções que usamos até agora. Com a diferença que esta não tem a documentação que as funções de pacotes precisam ter para poderem ser disponibilizadas no repositório do R. Rode os códigos abaixo para ver a sua função em atividade: | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | ls() | ||
| + | class(media) | ||
| + | media | ||
| + | media() | ||
| + | help(media) | ||
| + | dados <- rnorm(20, 2, 1) | ||
| + | media(dados) | ||
| + | dados1 <- rnorm(200, 2, 1) | ||
| + | media(dados1) | ||
| + | dados2 <- (rnorm(10000, | ||
| + | media(dados2) | ||
| + | sd(dados) | ||
| + | dados3 <- rnorm(20, 2, 0.01) | ||
| + | media(dados3) | ||
| + | dados4 <- rnorm(200, | ||
| + | media(dados4) | ||
| + | dados[2] <- NA | ||
| + | dados | ||
| + | media(dados) | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Uma função mais elaborada ===== | ||
| + | A função padrão do R ('' | ||
| + | Vamos construir uma função que diferente da função padrão, calcule a média na presença de '' | ||
| + | Note que é uma função com dois argumentos, que permite ao usuário tomar a decisão de remover ou não '' | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | media <- function(x, rmNA = TRUE) | ||
| + | { | ||
| + | if(rmNA == TRUE) | ||
| + | { | ||
| + | dados <- (na.omit(x)) | ||
| + | n.NA <- length(x) - length(dados) | ||
| + | cat(" | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | dados <- x | ||
| + | } | ||
| + | soma <- sum(dados) | ||
| + | nobs <- length(dados) | ||
| + | media <- soma/nobs | ||
| + | return(media) | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | **Calcular a média do vetor dados** | ||
| + | |||
| + | media(dados) | ||
| + | |||
| + | |||
| + | ===== Função para calcular variância ===== | ||
| + | <code rsplus> | ||
| + | var.curso <- function(x) | ||
| + | { | ||
| + | media < | ||
| + | dados <- na.omit(x) | ||
| + | disvquad <- (dados - media)^2 | ||
| + | var.curso <- sum(disvquad)/ | ||
| + | return(var.curso) | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Calcular a variância de dados e comparando com a função do R! | ||
| + | |||
| + | |||
| + | var.curso(dados) | ||
| + | var(dados) ### dica: veja o help dessa função " | ||
| + | var(dados, na.rm = TRUE) | ||
| + | var(dados, | ||
| + | |||
| + | ===== Função para calcular o Índice de Dispersão ===== | ||
| + | |||
| + | Os índices de dispersão nos ajudam a avaliar se contagens por amostras estão distribuídas de modo aleatório, agregado ou uniforme. | ||
| + | Veja o material de aula para entender como a relação variância por média pode dar uma idéia do tipo de distribuição espacial, quando temos contagens de indivíduos em várias parcelas de igual tamanho. | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | ID.curso <- function(x) | ||
| + | { | ||
| + | id <- var.curso(x)/ | ||
| + | return(id) | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Simulando dados com parâmetros conhecidos ===== | ||
| + | |||
| + | Tomando dados simulados de contagem de uma espécie em uma amostra de 20 parcelas de 20x20m, | ||
| + | podemos verificar o padrão de dispersão dessa espécie, utilizando o Índice de Dispersão (razão variância / média) | ||
| + | |||
| + | Vamos simular dados com diferentes características conhecidas: | ||
| + | |||
| + | |||
| + | |||
| + | * Simulando Aleatório | ||
| + | <code rsplus> | ||
| + | aleat <- rpois(200, 2) | ||
| + | aleat | ||
| + | </ | ||
| + | * Uniforme | ||
| + | <code rsplus> | ||
| + | unif <- runif(200, 0, 4) | ||
| + | unif | ||
| + | unif <- round(unif, 0) | ||
| + | unif | ||
| + | </ | ||
| + | * Agregado | ||
| + | <code rsplus> | ||
| + | agreg <- round(c(runif(100, | ||
| + | agreg | ||
| + | </ | ||
| + | |||
| + | | ||
| + | Calcular o coeficiente de dispersão | ||
| + | |||
| + | <code rsplus> | ||
| + | ID.curso(aleat) | ||
| + | |||
| + | ID.curso(unif) | ||
| + | |||
| + | ID.curso(agreg) | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | Quando o valor é próximo a 1 a distribuição é considerada aleatória. Isto quer dizer que que a ocorrência de cada indivíduo na parcela é indendente da ocorrência das demais. Neste caso, o número de indivíduos por parcela é descrito por uma variável Poisson, que tem exatamente a média igual à variância. | ||
| + | Podemos então fazer um teste de hipótese simulando uma distribuição Poisson com a mesma média dos dados. | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Função para criar o teste de hipótese do ID ===== | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | test.ID <- function(x, nsim=1000) | ||
| + | { | ||
| + | ID.curso <- function(x){var(x)/ | ||
| + | dados <- na.omit(x) | ||
| + | ndados <- length(dados) | ||
| + | med <- mean(dados) | ||
| + | id <- var(dados)/ | ||
| + | simula.aleat <- rpois(length(dados)*nsim, | ||
| + | sim.dados <- matrix(simula.aleat, | ||
| + | sim.ID <- apply(sim.dados, | ||
| + | quant.ID <- quantile(sim.ID, | ||
| + | | ||
| + | { | ||
| + | cat(" | ||
| + | } | ||
| + | if(id < quant.ID[1]) | ||
| + | { | ||
| + | cat(" | ||
| + | } | ||
| + | if(id> | ||
| + | { | ||
| + | cat(" | ||
| + | } | ||
| + | | ||
| + | | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Testanto os dados simulados | ||
| + | |||
| + | test.ID(aleat) | ||
| + | test.ID(agreg) | ||
| + | test.ID(unif) | ||
| + | |||
| + | |||
| + | ===== Outra função ===== | ||
| + | eda.shape | ||
| + | <code rsplus> | ||
| + | eda.shape <- function(x) | ||
| + | { | ||
| + | x11() | ||
| + | par(mfrow = c(2,2)) ## muda o dispositivo gráfico para 2x2 | ||
| + | hist(x) | ||
| + | boxplot(x) | ||
| + | iqd <- summary(x)[5] - summary(x)[2] | ||
| + | plot(density(x, | ||
| + | qqnorm(x) | ||
| + | qqline(x) | ||
| + | par(mfrow=c(1, | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | Criando um vetor de dados com 20 valores simulando a densidade de árvores por parcelas | ||
| + | |||
| + | <code rsplus> | ||
| + | set.seed(22) ## estabelece uma semente aleatória | ||
| + | dados.pois20< | ||
| + | sum(dados.pois20) ## a somatória aqui sempre dará 131, somente porque a semente é a mesma | ||
| + | set.seed(22) | ||
| + | dados.norm20< | ||
| + | sum (dados.norm20) | ||
| + | |||
| + | ###aplicar eda.shape para dados.dens | ||
| + | |||
| + | eda.shape(dados.pois20) | ||
| + | |||
| + | eda.shape(dados.norm20) | ||
| + | |||
| + | ### | ||
| + | |||
| + | eda.shape(rpois(500, | ||
| + | |||
| + | eda.shape(rnorm(500, | ||
| + | </ | ||
| + | |||
| + | ===== Modificando uma função ===== | ||
| + | |||
| + | <code rsplus> | ||
| + | eda.shape1 <- function(x) | ||
| + | { | ||
| + | x11() | ||
| + | par(mfrow = c(2,2)) | ||
| + | hist(x, | ||
| + | boxplot(x, main=" | ||
| + | iqd <- summary(x)[5] - summary(x)[2] | ||
| + | plot(density(x, | ||
| + | qqnorm(x, | ||
| + | qqline(x) | ||
| + | par(mfrow=c(1, | ||
| + | |||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Executando a função modificada ==== | ||
| + | |||
| + | eda.shape1(rnorm(500, | ||
| + | |||
| + | ===== Fazendo ciclos de operações ===== | ||
| + | |||
| + | Um outro instrumento importante para programar em R é o loop ou ciclos. | ||
| + | Ele permite a aplicação de uma função ou tarefa a uma sequência pré determinada de dados. Ou seja, repete a mesma sequência de comandos um número determinado de vezes. | ||
| + | |||
| + | |||
| + | Simulando dados de novo! | ||
| + | |||
| + | <code rsplus> | ||
| + | x1 <- rpois(20, 1) | ||
| + | x2 <- rpois(20, 2) | ||
| + | x3 <- rpois(20, 3) | ||
| + | x4 <- rpois(20, 1) | ||
| + | sp.oc <- matrix(c(x1, | ||
| + | colnames(sp.oc) <- c(" | ||
| + | rownames(sp.oc) <- paste(" | ||
| + | str(sp.oc) | ||
| + | dim(sp.oc) | ||
| + | head(sp.oc) | ||
| + | </ | ||
| + | |||
| + | Uma função para contar espécies por parcelas. | ||
| + | Mais uma vez uma função já existente em versão piorada!! | ||
| + | |||
| + | <code rsplus> | ||
| + | n.spp < | ||
| + | { | ||
| + | nplot <- dim(dados)[2] | ||
| + | resultados <- rep(0, | ||
| + | names(resultados) <- paste(" | ||
| + | dados[dados> | ||
| + | for(i in 1: | ||
| + | { | ||
| + | cont.sp <- sum(dados[, | ||
| + | resultados[i] <- cont.sp | ||
| + | } | ||
| + | return(resultados) | ||
| + | } | ||
| + | |||
| + | |||
| + | ##### Aplicando a função | ||
| + | |||
| + | n.spp(sp.oc) | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | <WRAP center round tip 80%> | ||
| + | Uma dica para entender qualquer função é rodar cada uma das linhas separadamente no console do R, na mesma sequência que aparecem e verificar os objetos intermediários criados. Quando chegar a um ciclo, pule a linha do //for()// e rode as linhas subsequentes, | ||
| + | </ | ||
| + | |||
| + | | ||
| + | |||
| + | ===== Mais função!! SIMILARIDADE ===== | ||
| + | |||
| + | <code rsplus> | ||
| + | sim< | ||
| + | { | ||
| + | nplot <- dim(dados)[2] | ||
| + | similar <- matrix(1, | ||
| + | rownames(similar) <- paste(" | ||
| + | colnames(similar) <- paste(" | ||
| + | dados[dados> | ||
| + | for(i in 1:nplot-1) | ||
| + | { | ||
| + | m=i+1 | ||
| + | for(m in m:nplot) | ||
| + | { | ||
| + | co.oc <- sum(dados[, | ||
| + | total.sp <- sum(dados[, | ||
| + | similar[i, | ||
| + | similar[m, | ||
| + | } | ||
| + | |||
| + | } | ||
| + | return(similar) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Aplicando a função SIM ==== | ||
| + | |||
| + | <code rsplus> | ||
| + | sim(sp.oc) | ||
| + | |||
| + | debug(sim) | ||
| + | sim(sp.oc) | ||
| + | undebug(sim) | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | **MUITO BEM VC. JÁ ESTÁ SE TRANSFORMANDO, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | //Agora faça os [[01_curso_atual: | ||
| + | |||