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/10/04 09:58]
adalardo [Uma função mais elaborada]
02_tutoriais:tutorial8:start [2022/06/26 13:54]
adalardo
Linha 4: Linha 4:
   * [[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 =====
  
-{{:​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 23: Linha 32:
 {{  :​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>
Linha 34: Linha 63:
  soma <- sum(x)  soma <- sum(x)
  nobs <- length(x)  nobs <- length(x)
- media <- soma/nobs + med <- soma/nobs 
- return(media)+ return(med)
  }  }
 </​code>​  </​code>​
  
 <WRAP center round tip 60%> <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.
  
 </​WRAP>​ </​WRAP>​
Linha 69: 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**. ​
  
  
Linha 102: 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 118: 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 129: 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 148: 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 178: 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 189: 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 297: 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 313: 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 335: 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 345: 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 355: 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 386: Linha 419:
  
  
-No linque a seguir você pode baixar o arquivo com o Pink e Cerebro... 
-{{:​02_tutoriais:​pinkycerebro.mpg|}} 
- 
- 
-** The End!** 
02_tutoriais/tutorial8/start.txt · Última modificação: 2022/06/26 13:57 por adalardo