Ferramentas do usuário

Ferramentas do site


02_tutoriais:tutorial8:start

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
Última revisão Ambos lados da revisão seguinte
02_tutoriais:tutorial8:start [2020/08/20 16:10]
adalardo
02_tutoriais:tutorial8:start [2022/06/26 13:54]
adalardo
Linha 1: Linha 1:
 <WRAP tabs> <WRAP tabs>
-  * [[cursos:​ecor:​02_tutoriais:​tutorial8:​start|Tutorial]] +  * [[02_tutoriais:​tutorial8:​start|Tutorial]] 
-  * [[cursos:​ecor:​01_curso_atual:​exercicios9| Exercícios]] +  * [[01_curso_atual:​exercicios9| Exercícios]] 
-  * [[cursos:​ecor:​03_apostila:​programar_ale| Apostila]]+  * [[03_apostila:​programar_ale| Apostila]]
 </​WRAP>​ </​WRAP>​
-====== 9. Tutoriais de Programação ​======+====== 9. Criando Funções Básicas ​====== 
  
 ===== Nossos Personagens ===== ===== Nossos Personagens =====
-{{:​cursos:​ecor:​02_tutoriais:​tutorial8:​pink_brain.jpg?​300 ​ |  ​}}//Pinky and the Brain//, no Brasil, **Pinky e o Cérebro**, são personagens de uma série ​ animada de televisão norte-americana. São dois ratos brancos de laboratório que utilizam os Laboratórios Acme como base para seus planos mirabolantes para dominar o mundo (sob razão nunca revelada). Pink é um rato totalmente estúpido e ingênuo enquanto o Cérebro é o gênio perverso que comanda os planos de conquista do mundo.+ 
 +<WRAP center round box 60%> 
 +**__Pink & Cerebro__** ​  
 + 
 +{{youtube>​HRQtNBs8BF8}} 
 +</​WRAP>​ 
 + 
 + 
 + 
 +//Pinky and the Brain//, no Brasil, **Pinky e o Cérebro**, são personagens de uma série ​ animada de televisão norte-americana. São dois ratos brancos de laboratório que utilizam os Laboratórios Acme como base para seus planos mirabolantes para dominar o mundo (sob razão nunca revelada). Pink é um rato totalmente estúpido e ingênuo enquanto o Cérebro é o gênio perverso que comanda os planos de conquista do mundo.
  
 Cada episódio é caracterizado,​ tanto no início quanto no final, pela famosa tirada onde Pinky pergunta: "//​Cérebro,​ o que faremos amanhã à noite?//"​ e Cérebro responde: "//A mesma coisa que fazemos todas as noites, Pinky... Tentar conquistar o mundo!//"​ Cada episódio é caracterizado,​ tanto no início quanto no final, pela famosa tirada onde Pinky pergunta: "//​Cérebro,​ o que faremos amanhã à noite?//"​ e Cérebro responde: "//A mesma coisa que fazemos todas as noites, Pinky... Tentar conquistar o mundo!//"​
Linha 20: Linha 30:
  
  
-{{  ​:​cursos:​ecor:​02_tutoriais:​pink.jpg?​200 ​ |  }}+{{  :​02_tutoriais:​pink.jpg?​200 ​ |  }}
  
 +
 +===== Classe Function =====
 +
 +Um objeto de função é uma classe especial de objetos no R que encapsulam algum tarefa. A função ''​function()''​ recebe algumas informações através dos seus argumentos e usa essas informações internamente para a realização do procedimento desejado. ​  O procedimento ou tarefa realizada por uma função é conduzido por um algoritmo, que nada mais é que um sequência de comandos concatenados. Quando o objeto de função é chamado, ele retorna o que os outros objetos retornam no console do R, o que foi atribuído a ele, ou seja essas linhas de comando no formato de texto. Entretanto, quando o objeto da classe ''​function''​ é chamada com os parênteses ''​( )''​ ele realiza a tarefa conduzido pelo conjunto concatenados de comandos que foram atribuídos a ele. Ao final, normalmente,​ a função retorna um **único** objeto que contém o resultado do procedimento. Para o retorno deste objeto, normalmente usamos uma outra função chamada ''​return()''​. ​   ​
  
  
 ===== FAZENDO VERSÕES PIORADAS DE FUNÇÕES EXISTENTES!!!! ===== ===== FAZENDO VERSÕES PIORADAS DE FUNÇÕES EXISTENTES!!!! =====
  
-Uma funções ​muito simples+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 ''​x''​. Em seguida precisamos definir o algoritmo que será executado. Uma forma de fazer isso é através de um pseudocódigo que é a descrição literal do algoritmo.  
 +No nosso caso: 
 + 
 +<WRAP center round box 60%> 
 +**Pseudocodigo ''​media''​ ** 
 +  - recebe um vetor ''​x''​ 
 +  - soma os valores do vetor no objeto ''​soma''​ 
 +  - guarda o tamanho do vetor ''​x''​ em ''​nobs''​ 
 +  - divide ''​soma''​ por ''​nobs''​ e guarda no objeto ''​media''​ 
 +  - retorna o objeto ''​med''​ 
 +</​WRAP>​ 
 +  
 + 
 + 
 +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 ''​{ }''​. Em seguida colocamos as linhas de comando descritas no pseudocodigo e rodamos todo o bloco de código desde a atribuição da função a um nome para construir um objeto da classe ''​function''​ na nossa área de trabalho. ​ Rodo o código abaixo e cheque se houve a construção do objeto ''​media''​ e qual a classe desse objeto: 
  
 <code rsplus> <code rsplus>
 media <​-function(x) media <​-function(x)
  {  {
- soma=sum(x) + soma <- sum(x) 
- nobs=length(x) + nobs <- length(x) 
- media=soma/nobs + med <- soma/nobs 
- return(media)+ return(med)
  }  }
 </​code>​  </​code>​
  
-<box red 50%> +<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 principio ​quem conhece ​as funções básicas do R já está qualificado a fazer funções mais complexas. +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. 
-</box>+ 
 +</WRAP>
  
 ===== Testando a função ===== ===== Testando a função =====
Linha 49: Linha 80:
 media media
 media() media()
-dados=rnorm(20,​2,​1)+dados <- rnorm(20, 2, 1)
 media(dados) media(dados)
-dados1=rnorm(200,​2,​1)+dados1 ​<- rnorm(200, 2, 1)
 media(dados1) media(dados1)
-dados2=(rnorm(10000,​2,​1))+dados2 ​<- (rnorm(10000,​ 2, 1))
 media(dados2) media(dados2)
 sd(dados) sd(dados)
-dados3=rnorm(20,​2,​0.01)+dados3 ​<- rnorm(20, 2, 0.01)
 media(dados3) media(dados3)
-dados4=rnorm(200,​2,​0.01)+dados4 ​<- rnorm(200,​2,​0.01)
 media(dados4) media(dados4)
-dados[2]<​-NA+dados[2] <- NA
 dados dados
 media(dados) media(dados)
Linha 67: Linha 98:
  
 ===== Uma função mais elaborada ===== ===== Uma função mais elaborada =====
-funcão ​padrão do R (//mean()//) não calcula a média quando há //NA//'no vetor de dados, a menos que o usuário utilize ​ o argumento ​//na.rm=TRUE//+função ​padrão do R (''​mean()''​) não calcula a média quando há ''​NA'' ​no vetor de dados, a menos que o usuário utilize ​ o argumento ​''​na.rm = TRUE''​
-Vamos construir uma função que diferente da função padrão, calcule a média na presença de //NA//'s, entretanto lance na tela uma mensagem sobre o número de //NA//'removidos do cálculo.  +Vamos construir uma função que diferente da função padrão, calcule a média na presença de ''​NA'' e imprima ​na tela uma mensagem sobre o número de ''​NA'' ​removidos do cálculo.  
-Note que é uma função com dois argumentos, que permite ao usuário tomar a decisão de remover ou não //NA//'s. Diferente da função ​//mean()// o padrão é invertido, nossa função remove ​//NA//'se nenhum argumento for mencionado. Note que vamos sobrepor o objeto anterior da classe ​//função//, chamado **media**. ​+Note que é uma função com dois argumentos, que permite ao usuário tomar a decisão de remover ou não ''​NA''. Diferente da função ​''​mean()'' ​o padrão é invertido, nossa função remove ​''​NA'' ​se nenhum argumento for mencionado. Note que vamos sobrepor o objeto anterior da classe ​''​função''​, chamado **media**. ​
  
  
 <code rsplus> <code rsplus>
-media<​-function(x,​rmNA=TRUE)  ​+media <- function(x, rmNA = TRUE)  ​
  {  {
- if(rmNA==TRUE)+ if(rmNA == TRUE)
  {  {
- dados=(na.omit(x)) + dados ​<- (na.omit(x)) 
- n.NA=length(x)-length(dados)+ n.NA ​<- length(x) - length(dados)
  cat("​\t",​ n.NA," valores NA excluídos\n"​)  cat("​\t",​ n.NA," valores NA excluídos\n"​)
  }  }
  else  else
  {  {
- dados=x+ dados ​<- x
  }  }
- soma=sum(dados) + soma <- sum(dados) 
- nobs=length(dados) + nobs <- length(dados) 
- media=soma/nobs+ media ​<- soma/nobs
  return(media)  return(media)
  }  }
Linha 100: Linha 131:
 ===== Função para calcular variância ===== ===== Função para calcular variância =====
 <code rsplus> <code rsplus>
-var.curso<​-function(x)+var.curso <- function(x)
  {  {
- media=media(x) + media ​<-media(x) 
- dados=na.omit(x)  + dados ​<- na.omit(x)  
- disvquad=(dados-media)^2 + disvquad ​<- (dados - media)^2 
- var.curso=sum(disvquad)/​(length(dados)-1)+ var.curso ​<- sum(disvquad)/​(length(dados)-1)
  return(var.curso)  return(var.curso)
  }  }
Linha 116: Linha 147:
  
   var.curso(dados)   var.curso(dados)
-  var(dados)###​ dica: veja o help dessa função "​help(var)"​ +  var(dados) ### dica: veja o help dessa função "​help(var)"​ 
-  var(dados,​na.rm=TRUE) +  var(dados, na.rm = TRUE) 
-  var(dados,​na.rm=FALSE)+  var(dados,​na.rm = FALSE)
  
 ===== Função para calcular o Índice de Dispersão ===== ===== Função para calcular o Índice de Dispersão =====
Linha 127: Linha 158:
  
 <code rsplus> <code rsplus>
-ID.curso<​-function(x)+ID.curso <- function(x)
  {  {
- id=var.curso(x)/​media(x)+ id <- var.curso(x)/​media(x)
  return(id)  return(id)
  }  }
Linha 146: Linha 177:
  
   *  Simulando Aleatório   *  Simulando Aleatório
- +<code rsplus> 
-  aleat=rpois(200,​2) +aleat <- rpois(200, 2) 
-  aleat +aleat 
 +</​code>​
   * Uniforme   * Uniforme
- +<code rsplus> 
-  unif=runif(200,​0,​4)+  unif <- runif(200, 0, 4)
   unif   unif
-  unif=round(unif,​0)+  unif <- round(unif, 0)
   unif   unif
 +</​code>​
   * Agregado   * Agregado
- +<code rsplus> 
-  agreg=round(c(runif(100,​0,​1),​runif(100,​5,​10)))+  agreg <- round(c(runif(100,​ 0, 1), runif(100, 5, 10)))
   agreg   agreg
 +</​code>​
  
   ​   ​
Linha 176: Linha 207:
 </​code>​ </​code>​
  
-<box 50red>+ 
 +<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. 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 significância ​simulando uma distribuição Poisson com a mesma média dos dados. +Podemos então fazer um teste de hipótese ​simulando uma distribuição Poisson com a mesma média dos dados. 
-</box>+ 
 +</WRAP>
  
-===== Função para criar o teste de signficância ​do ID =====+===== Função para criar o teste de hipótese ​do ID =====
  
  
Linha 187: Linha 220:
 test.ID <- function(x, nsim=1000) test.ID <- function(x, nsim=1000)
         {          { 
- ID.curso=function(x){var(x)/​mean(x)}#​ essa função precisa das funcoes media e ID.curso + ID.curso ​<- function(x){var(x)/​mean(x)}#​ essa função precisa das funcoes media e ID.curso 
-        dados=na.omit(x) +        dados <- na.omit(x) 
- ndados=length(dados) + ndados ​<- length(dados) 
- med=mean(dados) + med <- mean(dados) 
- id=var(dados)/​med + id <- var(dados)/​med 
- simula.aleat=rpois(length(dados)*nsim,​ lambda=med) + simula.aleat ​<- rpois(length(dados)*nsim,​ lambda=med) 
- sim.dados=matrix(simula.aleat,​ncol= ndados) + sim.dados ​<- matrix(simula.aleat,​ncol= ndados) 
- sim.ID=apply(sim.dados,​1,​ID.curso) + sim.ID ​<- apply(sim.dados,​1,​ID.curso) 
- quant.ID=quantile(sim.ID,​ probs=c(0.025,​0.975)) + quant.ID ​<- quantile(sim.ID,​ probs=c(0.025,​0.975)) 
-        ​ if(id>​=quant.ID[1] & id<​=quant.ID[2])+        ​ if(id >= quant.ID[1] & id <= quant.ID[2])
  
- cat("​\n\n\n\t distribuição aleatória para alfa=0.05 \n\t ID= ",​id,"​\n\n\n"​)+ cat("​\n\n\n\t distribuição aleatória para alfa = 0.05 \n\t ID= ",​id,"​\n\n\n"​)
  }  }
  if(id < quant.ID[1]) ​  if(id < quant.ID[1]) ​
Linha 295: Linha 328:
  
 <code rsplus> <code rsplus>
-x1=rpois(20,​1) +x1 <- rpois(20, 1) 
-x2=rpois(20,​2) +x2 <- rpois(20, 2) 
-x3=rpois(20,​3) +x3 <- rpois(20, 3) 
-x4=rpois(20,​1) +x4 <- rpois(20, 1) 
-sp.oc=matrix(c(x1,​x2,​x3,​x4),​ ncol=4) +sp.oc <- matrix(c(x1,​ x2, x3, x4), ncol=4) 
-colnames(sp.oc)<​-c("​plot A", "plot B", "plot C", "plot D") +colnames(sp.oc) <- c("​plot A", "plot B", "plot C", "plot D") 
-rownames(sp.oc)<​-paste("​sp",​ c(1:20))+rownames(sp.oc) <- paste("​sp",​ c(1:20))
 str(sp.oc) str(sp.oc)
 dim(sp.oc) dim(sp.oc)
Linha 311: Linha 344:
  
 <code rsplus> <code rsplus>
-n.spp<​-function(dados)+n.spp <​-function(dados)
  {  {
- nplot=dim(dados)[2] + nplot ​<- dim(dados)[2] 
- resultados=rep(0,​nplot) + resultados ​<- rep(0,​nplot) 
- names(resultados)<​-paste("​n.spp",​ c(1:​nplot)) + names(resultados) <- paste("​n.spp",​ c(1:​nplot)) 
- dados[dados>​0]=1+ dados[dados>​0] = 1
  for(i in 1:​(dim(dados)[2]))  for(i in 1:​(dim(dados)[2]))
  {  {
- cont.sp=sum(dados[,​i]) + cont.sp ​<- sum(dados[,​i]) 
- resultados[i]=cont.sp+ resultados[i] ​<- cont.sp
  }  }
  return(resultados)  return(resultados)
Linha 333: Linha 366:
  
  
-<box red 80%>+ 
 +<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,​ porém designe antes algum valor para o contador, no nosso exemplo //i// (tente i=2). A lógica da função //for()// é que o contador (//i//) terá um valor diferente a cada ciclo, no exemplo entre 1 até o número de colunas do objeto //dados//. Além disso, o contador pode ser usado para indexar a posição onde o resultado de cada ciclo será colocado no objeto final (//​resultados//​) 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,​ porém designe antes algum valor para o contador, no nosso exemplo //i// (tente i=2). A lógica da função //for()// é que o contador (//i//) terá um valor diferente a cada ciclo, no exemplo entre 1 até o número de colunas do objeto //dados//. Além disso, o contador pode ser usado para indexar a posição onde o resultado de cada ciclo será colocado no objeto final (//​resultados//​)
-</box>+</WRAP> 
   ​   ​
  
Linha 343: Linha 378:
 sim<​-function(dados) sim<​-function(dados)
  {  {
- nplot=dim(dados)[2] + nplot ​<- dim(dados)[2] 
- similar=matrix(1,​ncol=nplot,​nrow=nplot) + similar ​<- matrix(1,​ncol=nplot,​nrow=nplot) 
- rownames(similar)<​-paste("​plot",​ c(1:​nplot)) + rownames(similar) <- paste("​plot",​ c(1:​nplot)) 
- colnames(similar)<​-paste("​plot",​ c(1:​nplot)) + colnames(similar) <- paste("​plot",​ c(1:​nplot)) 
- dados[dados>​0]=1+ dados[dados>​0] = 1
  for(i in 1:nplot-1)  for(i in 1:nplot-1)
  {  {
Linha 353: Linha 388:
  for(m in m:nplot)  for(m in m:nplot)
  {  {
- co.oc=sum(dados[,​i]>​0 & dados[,​m]>​0) + co.oc ​<- sum(dados[,​i]>​0 & dados[,​m]>​0) 
- total.sp=sum(dados[,​i])+sum(dados[,​m])-co.oc + total.sp ​<- sum(dados[,​i]) + sum(dados[,​m]) - co.oc 
- similar[i,​m]=co.oc/​total.sp  + similar[i,​m] ​<- co.oc/​total.sp  
- similar[m,​i]=co.oc/​total.sp ​+ similar[m,​i] ​<- co.oc/​total.sp ​
  }  }
   
Linha 378: Linha 413:
 **MUITO BEM VC. JÁ ESTÁ SE TRANSFORMANDO,​ NÃO PARECE MAIS UM PINK** **MUITO BEM VC. JÁ ESTÁ SE TRANSFORMANDO,​ NÃO PARECE MAIS UM PINK**
  
-{{:​cursos:​ecor:​02_tutoriais:​cerebro.jpg|}} +{{:​02_tutoriais:​cerebro.jpg|}}
- +
- +
-//Agora faça os [[cursos:​ecor:​01_curso_atual:​exercicios9|]] para podermos conquistar o MUNDO!!!// ​+
  
  
-No linque a seguir você pode baixar o arquivo com o Pink e Cerebro... +//Agora faça os [[01_curso_atual:exercicios9|]] para podermos conquistar o MUNDO!!!// ​
-{{:cursos:​ecor:​02_tutoriais:​pinkycerebro.mpg|}}+
  
  
-** The End!** 
02_tutoriais/tutorial8/start.txt · Última modificação: 2022/06/26 13:57 por adalardo