[R-br] função, if dentro fo loop

Daniela Recchia daniela_recchia em yahoo.com.br
Terça Novembro 18 15:56:12 BRST 2014


Tava vendo agora que ainda tem alguma coisa que devo ter especificado errado, pois agora apenas o valor para i=0 e i=1 estão corretos, após isso os valores estão em 1 passo adiantados, exemplo:
> conv3(10) [1] 0.5273934138 0.4374971494 0.3996213000 0.3239581987 0.2247104996 0.1297119898 0.0613151283 0.0235521138 0.0073294684 0.0018468713 0.0003769962
comparando:
F_0<-pnorm(0,m,dp)F_.1<- pnorm(0.1,m,dp)F_.2<- pnorm(0.2,m,dp)P_G0<-F_0P_G1<-F_.1-F_0P_G2<-F_.2-F_.1 
> -P_G0*log2(P_G0)[1] 0.5273934> -P_G1*log2(P_G1)[1] 0.4374971> -P_G2*log2(P_G2)[1] 0.4374971> -P_G3*log2(P_G3)[1] 0.3996213
O terceiro valor de conv3 deveria ser ainda 0.437 e só a partir do quarto (i=3) que deveria ser o 0.3996

-- 
Daniela Rodrigues RecchiaM.Sc. in Statistics

Tel. (Mobil): +49 01578 7588382Germany
“The standard of success in life is absolutely the amount of joy you feel”
Esther & Jerry Hick
  

     Em Terça-feira, 18 de Novembro de 2014 18:48, Manoel Galdino <mcz.fea em gmail.com> escreveu:
   

 Mais uma correção e simplificando: 
conv3 <- function(n, m=0.1, dp=sqrt(0.05)) {  u <- numeric(n+1)  f <- function(x) {pnorm(x,m,dp)}  p <- function(x) {f(x)}  I <-  function (x) {-p(x)*log2(p(x)) }  u[1]<- I(0)  for (i in 2:(n+1)) {     f  <-  function(i) {pnorm(i*1/n,m,dp)}    p <-  function(i) {f(i)-f(i-1)}    u[i]<- I(i)  } return(u)
}
2014-11-18 15:44 GMT-02:00 Manoel Galdino <mcz.fea em gmail.com>:

Não há de que.
Ah, corrige só uma linha do código que ainda está errado (embora não afete o resultado, aparentemente). No final, troca por:y <- u[1:n,]

2014-11-18 15:41 GMT-02:00 Daniela Recchia <daniela_recchia em yahoo.com.br>:

Muito obrigada Manoel!
Apesar se usar o R acabo não programando muita coisa sózinha, por isso quando tenho que fazer algo mesmo que simples as vezes me confundo. Por bug tinha entendido que eu deveria receber algum warning ou error do R, e como isso não ocorreu achei que estava tudo ok.
Muito obrigada e boa semana!
Abraços, -- 
Daniela Rodrigues RecchiaM.Sc. in Statistics

Tel. (Mobil): +49 01578 7588382Germany
“The standard of success in life is absolutely the amount of joy you feel”
Esther & Jerry Hick
  

     Em Terça-feira, 18 de Novembro de 2014 18:37, Manoel Galdino <mcz.fea em gmail.com> escreveu:
   

 Se a sua função não faz o que deveria fazer, bem, então acho que ela tem um bug! =)
Eu reescrevi sua função, eacho que agora funciona. Seu problema era de índice. Não existe índice 0 no R (diferentemente de C, por exemplo). Matriz, vetor etc. começa sempre em 1.
conv2 <- function(n, m=0.1, dp=sqrt(0.05)) {  u <- matrix(nrow=n+1,ncol=1)  f <- function(x) {pnorm(x,m,dp)}  p <- function(x) {f(x)}  I <-  function (x) {-p(x)*log2(p(x)) }  u[1,]<- I(0)  for (i in 2:n) {     f  <-  function(i) {pnorm(i*1/n,m,dp)}    p <-  function(i) {f(i)-f(i-1)}    u[i,]<- I(i)  }  y <-u[0:n,]  y}




2014-11-18 15:12 GMT-02:00 Daniela Recchia <daniela_recchia em yahoo.com.br>:

Olá Manoel,
obrigada pelo retorno. Não conhecia o GitHub obrigada pela indicação.
A princípio os valores de m e dp são fixos, não são importantes nesse exemplo, e não tenho nenhum Bug pra solucionar, a função funciona perfeitamente, com a única exceção de que o valor para i=0 não é calculado corretamente.
É isso mesmo que eu quero, ter os valores de f e p para então realizar a multiplicação que será retornada na matriz. Aqui um exemplo: (usei m=0.1; dp=sqrt(0.05))
> conv(10) [1] 0.437497149 0.437497149 0.399621300 0.323958199 0.224710500 0.129711990 [7] 0.061315128 0.023552114 0.007329468 0.001846871
Veja que o primeiro e o segundo valores sãi iguais (o que na verdade corresponde a i=1) e é isso que quero resolver.
Abraços,
Daniela -- 
Daniela Rodrigues RecchiaM.Sc. in Statistics

Tel. (Mobil): +49 01578 7588382Germany
“The standard of success in life is absolutely the amount of joy you feel”
Esther & Jerry Hick
  

     Em Terça-feira, 18 de Novembro de 2014 18:01, Manoel Galdino <mcz.fea em gmail.com> escreveu:
   

 Seu código tá bem ruim de ler...Recomendo que você utilize o GitHub para postar seus códigos. Além disso, ajudaria se você dissesse o que pretende com a função. Do jeito que está é bem difícil ajudar.
Mas voltando a sua pergunta. Fiz algumas alterações no código (só reorganizei). Veja se está funcionando...


conv<- function(n) {                   u <- matrix(nrow=n+1,ncol=1)                        for (i in 0:n) {                                 if (i==0) {                                      f <- function(i) {pnorm(i,m,dp)}                                      p<- function(i) {f(i)}                                } else  {                                      f  <-  function(i) {pnorm(i*1/n,m,dp)}                                      p <-  function(i) {f(i)-f(i-1)}
                               }                     I <-  function (i) {-p(i)*log2(p(i))}                     u[i,]<- I(i)}                   y <-u[0:n,]                   y }

Use o browser pra você debugar seu código. No livro do Hadley tem mais explicações sobre como debugar um código.
abçsM
ps.: Onde que os argumentos 'm' e 'dp' entram na função? Eles são valores globais? Não é a prática mais recomendada...ps.2: a cada iteração do loop, as funções f e p são subscritas, de forma que ao final você terá uma f e uma p, dada por i igual a n. É isso mesmo que você quer?
On Tue, Nov 18, 2014 at 2:00 PM, Daniela Recchia <daniela_recchia em yahoo.com.br> wrote:

Boa tarde pessoal,
tenho certeza que meu problema é bem simples mas não estou conseguindo visualizar a solução, criei a função:
conv<- function(n){u<-matrix(nrow=n+1,ncol=1)                   for (i in 0:n) {                      if(i==0) f<-function(i) {pnorm(i,m,dp)}                     else     f<- function(i) {pnorm(i*1/n,m,dp)}                     if(i==0) p<- function(i) {f(i)}                     else     p<- function(i) {f(i)-f(i-1)}                     I<- function (i) {-p(i)*log2(p(i))}                     u[i,]<- I(i)}                   y<-u[0:n,]; y}
Mas para o caso onde i==0 não está sendo feito corretamente, e preciso idendificar se não tenho problemas na condição f(i)-f(i-1), o que ele retorna no lugar do i=0 é o valor do i=1.
Alguém saberia me dar uma dica?
Abraços,
Daniela -- 
Daniela Rodrigues Recchia

“The standard of success in life is absolutely the amount of joy you feel”
Esther & Jerry Hick
 
_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.




-- 
Manoel Galdino
https://sites.google.com/site/galdinomcz/


    



-- 
Manoel Galdino
https://sites.google.com/site/galdinomcz/


    



-- 
Manoel Galdino
https://sites.google.com/site/galdinomcz/




-- 
Manoel Galdino
https://sites.google.com/site/galdinomcz/


   
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20141118/9bc2463d/attachment.html>


Mais detalhes sobre a lista de discussão R-br