Exercicio 03, Aula 09

classic Clássica list Lista threaded Em Árvore
17 mensagens Opções
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Exercicio 03, Aula 09

cecilimendes
Oi Gente,

estou tentando fazer o exercicio 3, mas tinha feito a função shannon utilizando dois argumentos (o vetor de abundancia e o na.omit), porém o NotaR só deixa rodar com um. Modifiquei o script pra incluir o na.omit dentro da função, mas o NotaR agora diz que meu valor do índice está errado. Alguém pode me ajudar a descobrir o porquê?
Ainda estou na primeira parte do exercício, então o código ainda está incompleto, mas queria descobrir esse erro primeiro pra só depois passar pra segunda parte.

Abaixo meu script parcial

## Shannon = -sum(ni/n*log(ni/n))
## Simpson = sum((ni/n)^2)

# shannon

shannon <- function(abundancia)

{
     
     
      if(any(abundancia == 0))
      {
            stop("vetor possui zeros, revise")
      }
           
       
              abundancia <- na.omit(abundancia)
       
           
          dados <- rep(NA, length(abundancia))

for (i in 1:length(abundancia))
{
     dados[i] <- abundancia[i]/length(abundancia)*log(abundancia[i]/length(abundancia))
}
result <- sum(dados)*-1
 return(result)

}




# simpson
simpson <- function(abundancia)
{
     

     
     
            abundancia <- na.omit(abundancia)
     
     
       dados <- rep(NA, length(abundancia))
     
      for (i in 1:length(abundancia))
      {
            dados[i] <- (abundancia[i]/length(abundancia))^2
      }
      result <- sum(dados)
      return(result)
           
}



Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Seu calculo da probabilidade tá errado, lembra que são abundancias e não observações.
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Felipe
Em resposta à esta mensagem postada por cecilimendes
Oi,

To pelo celular então não consegui rodar pra ter certeza, mas acho que o problema é quando vc divide por length(abundancia). Isso te dá o número de espécies, mas não é isso que entra na fórmula.
FE
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Felipe
Acho que demorei demais pra escrever
FE
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

isabela.gyuricza
Em resposta à esta mensagem postada por cecilimendes
Gente, o meu está dando o seguinte erro: Erro na função diversidade! Você tem certeza que calculou o índice de Shannon para cada uma das amostras?

Não consigo encontrar o erro..

Meu script:

shannon=function(x){
  x=na.omit(x)
 
  if(sum(x==0)>0){
    stop("Não existe log de 0")}
 
  else {
  px=x/sum(x)
     H=-sum(px*log(px))}

  return(H)
}
shannon(x)


simpson=function(x){
  x=na.omit(x)
  px=x/sum(x)
  D=sum(px^2)
 
  return(D)
}  
 
simpson(x)  


diversidade=function(x,y){
 
  x=na.omit(x)
 
   if (y=="shannon") {
      apply(x,2,shannon)}
     
     if(y=="simpson"){
        apply(x,2,simpson)}

       if(y==!"shannon" & "simpson"){
       stop("índice escolhido está incorreto")}
}
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Seu metodo de remover os NA na função diversidade tá errado. Tente criar um objeto com alguns NA distribuidos em mais de uma amostra e veja oq esse na.omit ai faz.
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

isabela.gyuricza
Mas por que funcionou para o cálculo de Shannon e Simpson?

Eu tentei trocar ali nos apply colocando na.rm=TRUE depois dos índices mas está retornando o mesmo erro.. =/
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Pq mesmo né.... Vamos ver:

Dentro das funções shannon e simpson vc tá calculando num vetor só, então é:

> x = c(1, 2, NA, 4)
> y = c(NA, 4, 5, 7)
> na.omit(x)
[1] 1 2 4
> na.omit(y)
[1] 4 5 7

Todos os valores, certinhos.

Agora, dentro da diversidade, vc tá aplicando a na.omit numa matriz. Vamos ver oq acontece:

> xy = data.frame(x, y)
> xy
   x  y
  1 NA
  2  4
 NA  5
4  4  7
> na.omit(xy)
  x y
 2 4
 4 7

Vc quer mesmo remover a primeira posição do vetor x e a terceira posição do y?

Tudo que vc coloca depois da função no apply é argumento da função, e suas funções shannon e simpson não tem o argumento na.rm, então colocar esse argumento ai não faz nada.

Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

isabela.gyuricza
Ahhh sim! Faz sentido!! Obrigadaaa!

Eu tentei fazer assim:

diversidade=function(x,y){
  x=as.matrix(x[!is.na(x)])
   y=list("shannon","simpson")
   
   if (any(y=="shannon")) {
      apply(x,2,shannon)}
   
     if(any(y=="simpson")){
        apply(x,2,simpson)}
   
       if(any(y!=c("shannon","simpson"))){
       stop("índice escolhido está incorreto")}
}

A funcao roda, mas toda matriz que eu testo da NULL :(
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Piorou um pouco. Olha o que vc está fazendo:

> mat = matrix(c(1, 2, 3, NA, 5, NA,7,8), 4)
> mat
     [,1] [,2]
[1,]    1    5
[2,]    2   NA
[3,]    3    7
[4,]   NA    8
> as.matrix(mat[!is.na(mat)])
     [,1]
[1,]    1
[2,]    2
[3,]    3
[4,]    5
[5,]    7
[6,]    8

De novo, sua estratégia de remover NA não funciona.

Pensa no que tem que acontecer, olha pra suas funções originais de shannon e simpson, e imagina passo a passo qual o problema que vc quer resolver.
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

cecilimendes
Em resposta à esta mensagem postada por Diogro.
Oi Ogro,

então percebi o erro, concertei, mas continua dizendo que o valor está errado.
Já olhei online exemplos desse cálculo e os valores me parecem certos.

# shannon

shannon <- function(abundancia)

{
     
     
      if(any(abundancia == 0))
      {
            stop("vetor possui zeros, revise")
      }
           
        else
        {
           x <- na.omit(abundancia)
           dados <- rep(NA, length(x))
        }

for (i in 1:length(x))
{
     dados[i] <- x[i]/sum(x)*log(x[i]/sum(x))
}
result <- -sum(dados)
 return(result)

}

#function(x) -sum((x/sum(x,na.rm=TRUE))*log(x/ sum(x,na.rm=TRUE)),na.rm=TRUE)



# simpson
simpson <- function(abundancia)
{
     

     
     
            x <- na.omit(abundancia)
     
     
       dados <- rep(NA, length(x))
     
      for (i in 1:length(x))
      {
            dados[i] <- (x[i]/sum(x))^2
      }
      result <- sum(dados)
      return(result)
           
}
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Acho que o exercicio espera que sua função consiga fazer a conta mesmo quando o vetor de entrada tenha zeros. Tenta excluir eles.
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

cecilimendes
Fiz isso, mas também não deu certo. O notaR continua dizendo que a função retorna o valor errado =(
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Manda seu codigo completo e o erro que o notaR está dando.
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

cecilimendes
ATENÇÃO!

A funcao shannon nao executa ou esta retornando um valor errado. Você removeu as células contendo NA para o cálculo do índice de Shannon?
Corrija essa condição para continuar a correção.

Seu aproveitamento: 10%.

Você não está logado. A nota não foi gravada.

Seu código:

################################# Exercicio 02, Aula 09 ###################################################
#1. Construa uma fun??o chamada "shannon" para computar o ?ndice de diversidade de Shannon e outra fun??o chamada "simpson" para o ?ndice de diversidade de Simpson de uma amostra. Considere que:
# o objeto de entrada ser? um vetor contendo a abund?ncia de cada esp?cie na amostra
# existe a possibilidade de haver dados faltantes nesse vetor ("NA"), os quais ser?o removidos para o c?lculo dos ?ndices.

## Shannon = -sum(ni/n*log(ni/n))
## Simpson = sum((ni/n)^2)

# shannon

shannon <- function(abundancia)

{


if(any(abundancia == 0))
{
x <- subset(abundancia, abundancia !=0)
}


{
x <- na.omit(x)
dados <- rep(NA, length(x))
}

for (i in 1:length(x))
{
dados[i] <- x[i]/sum(x)*log(x[i]/sum(x))
}
result <- sum(dados)*-1
return(result)

}

#function(x) -sum((x/sum(x,na.rm=TRUE))*log(x/ sum(x,na.rm=TRUE)),na.rm=TRUE)



# simpson
simpson <- function(abundancia)
{
if(any(abundancia == 0))
{
x <- subset(abundancia, abundancia !=0)
}


{
x <- na.omit(x)
dados <- rep(NA, length(x))
}


for (i in 1:length(x))
{
dados[i] <- (x[i]/sum(x))^2
}
result <- sum(dados)
return(result)

}
Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

Diogro.
Rodando a sua função num vetor com NA resulta:

> shannon2(x)
Error in if (any(abundancia == 0)) { : 
  missing value where TRUE/FALSE needed

Ou seja, a conferencia dos NA tem que acontecer antes da conferencia dos zeros.


2018-04-30 16:40 GMT-03:00 cecilimendes [via BIE5782] <[hidden email]>:
ATENÇÃO!

A funcao shannon nao executa ou esta retornando um valor errado. Você removeu as células contendo NA para o cálculo do índice de Shannon?
Corrija essa condição para continuar a correção.

Seu aproveitamento: 10%.

Você não está logado. A nota não foi gravada.

Seu código:

################################# Exercicio 02, Aula 09 ###################################################
#1. Construa uma fun??o chamada "shannon" para computar o ?ndice de diversidade de Shannon e outra fun??o chamada "simpson" para o ?ndice de diversidade de Simpson de uma amostra. Considere que:
# o objeto de entrada ser? um vetor contendo a abund?ncia de cada esp?cie na amostra
# existe a possibilidade de haver dados faltantes nesse vetor ("NA"), os quais ser?o removidos para o c?lculo dos ?ndices.

## Shannon = -sum(ni/n*log(ni/n))
## Simpson = sum((ni/n)^2)

# shannon

shannon <- function(abundancia)

{


if(any(abundancia == 0))
{
x <- subset(abundancia, abundancia !=0)
}


{
x <- na.omit(x)
dados <- rep(NA, length(x))
}

for (i in 1:length(x))
{
dados[i] <- x[i]/sum(x)*log(x[i]/sum(x))
}
result <- sum(dados)*-1
return(result)

}

#function(x) -sum((x/sum(x,na.rm=TRUE))*log(x/ sum(x,na.rm=TRUE)),na.rm=TRUE)



# simpson
simpson <- function(abundancia)
{
if(any(abundancia == 0))
{
x <- subset(abundancia, abundancia !=0)
}


{
x <- na.omit(x)
dados <- rep(NA, length(x))
}


for (i in 1:length(x))
{
dados[i] <- (x[i]/sum(x))^2
}
result <- sum(dados)
return(result)

}


Se você responder a este email, a sua mensagem será adicionada à discussão abaixo:
http://bie5782.138098.n3.nabble.com/Exercicio-03-Aula-09-tp4029350p4029367.html
Para criar um novo tópico em BIE5782, mande um email para [hidden email]
Para remover sua inscrição de BIE5782, clique aqui.
NAML

Responder | Em Árvore
Abra essa mensagem na visão em árvore
|

Re: Exercicio 03, Aula 09

cecilimendes
Mesmo tirando os NAs antes esse condicionante ainda tava me dando problema, mas consegui resolver tirando ele e removendo os zeros e NAs direto =)