[R-br] Dúvida função no R

Fabio Mathias Corrêa fabio.ufla em yahoo.com.br
Sábado Setembro 15 21:20:40 BRT 2012


Felipe,

Creio que seu problema foi resolvido!

Porque no primeiro laço das simulações não dá problema na matriz SOR?

Bom, no primeiro laço a sua variável D = 1.

E logo abaixo ela recebe os valores  D <- c(3,8,9,10)                   #Difficult items

Quando o D passa de um vetor de tamanho 1 para um vetor de tamanho 4, o vetor p.vec é incrementado e pode ficar com tamanho de 20 ou mais.

  p = ogive(theta[subject,trait],a[item],b[item,categ],D)
  p.vec = c(p.vec,p)

Veja um exemplo do porque o vetor fica incrementado.

ogive(1,2,3,c(1:5)) # Aqui o vetor de saída tem tamanho 5.


ogive(1,2,3,5) # Aqui o vetor de saída tem tamanho 1.

Então o p.vec vai sendo incrementado de 5 em 5, da forma em que estava.

Tem um outro detalhe, se vc colocar uma matriz muito grande, as suas simulações irão demorar muito! Tem muita coisa que pode ser melhorada em termos otimização!

 Sumscale<-c(Sumscale,mean(input_matrix[i,]))  # Aqui vc pode utilizar um rowMeans()

A função ogive não precisa ser construída dentro do laço das simulações. Coloque ela fora, basta fazer chamar ela apenas uma vez fora do laço das simulações.

Tinha elementos da resp que não eram chamados na função, ficavam soltos, isso não é bom!

Alterei os elementos de chamada dela.

resp<-function(subject,item,trait,theta,a,b,D)
{
  #Calculate the probability of each category
  
  p.vec = NULL
  
  for(categ in 1:k) #For each category, calculate:
  {
    p = ogive(theta[subject,trait],a[item],b[item,categ],D)
    p.vec = c(p.vec,p)
  }
  
  #Generates a random number
  
  seed<-runif(1,0.2,0.8)
  
  #Selects an answer
  
  temp = which(p.vec>seed) #we use this temporary vector in order to avoid warnings should its length be zero
  if(length(temp)>0){resp=max(temp)}else{resp=1}
  resp
}

Valeu!
 
        Fábio Mathias Corrêa


   Universidade Estadual de Santa Cruz
Departamento de Ciências Exatas e da Terra - DCET


Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna
CEP 45662-900. Ilhéus-Bahia


Tel.: 73-3680-5076


________________________________
 De: Felipe Buchbinder <felbuch em gmail.com>
Para: r-br em listas.c3sl.ufpr.br; Fabio Mathias Corrêa <fabio.ufla em yahoo.com.br> 
Enviadas: Sábado, 15 de Setembro de 2012 15:03
Assunto: Re: [R-br] Dúvida função no R
 

O que eu preciso fazer é exatamente o que o Eduardo fez, com uma modificação:

O $p$, ao invés de ser um número gerado aleatoriamente, é o resultado de uma função logit.

Obviamente, o resultado de uma logit é um número entre 0 e 1, então a solução do Eduardo é muito próxima do que eu preciso. Mas quando eu substituo o "runif(1)" pela minha função 
logística, os resultados deixam se ser entre 1 e 5.

Por que isso pode estar ocorrendo?
Aproveito e envio o código inteiro anexo.

Mais uma vez, muito obrigado,

Felipe




2012/9/15 Fabio Mathias Corrêa <fabio.ufla em yahoo.com.br>

Felipe
>
>
>Da forma que o Eduardo fez a função está retornando valores entre  1 e 5. Não é isto o que vc quer?
>
>
>O table(s) está mostrando a frequência com que os valores apareceram na simulação que ele fez.
>
>
>Valeu!
> 
>        Fábio Mathias Corrêa
>
>
>   Universidade Estadual de Santa Cruz
>Departamento de Ciências Exatas e da Terra - DCET
>
>
>Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna
>CEP 45662-900. Ilhéus-Bahia
>
>
>
>Tel.: 73-3680-5076
>
>
>________________________________
> De: Felipe Buchbinder <felbuch em gmail.com>
>Para: r-br em listas.c3sl.ufpr.br 
>Enviadas: Sexta-feira, 14 de Setembro de 2012 23:00
>
>Assunto: Re: [R-br] Dúvida função no R
> 
>
>
>Eduardo e Fábio,
>Muito obrigado pela ajuda. Se o problema não está no which, alguma idéia de onde ele possa estar?
>A função resp já retorna resultados absurdos, então o problema tem que estar nela. Só não vejo onde....
>
>
>2012/9/14 Eduardo Leoni <e.leoni em gmail.com>
>
>E o problema não está no which...
>>
>>
>>resp <- function() {
>>  k <- 5
>>  p.vec = NULL  
>>  for(category in 1:k)  # k = 5
>>    {
>>      p = runif(1)
>>      p.vec = c(p.vec,p)
>>    }
>>  ##Generates a random number
>>  seed<-runif(1,0.2,0.8)
>>  ##Selects an answer
>>  temp = which ( p.vec>seed ) 
>>  if( length (temp) > 0 ) { resp = max (temp) } else { resp = 1 }
>>  resp
>>}
>>s <- NULL
>>for (i in 1:100) {
>>  s <- c(s, resp())
>>}
>>> table(s)
>>>s
>>> 1  2  3  4  5 
>>>15  6 10 21 48 
>>
>>
>>
>>
>>
>>2012/9/14 Eduardo Leoni <e.leoni em gmail.com>
>>
>>ifelse quando length é igual a 1 não é recomendável:
>>>
>>>
>>>> system.time(replicate(10000, if(1>0) {1} else { 0}))
>>>   user  system elapsed 
>>>  0.028   0.000   0.030 
>>>> system.time(replicate(10000, ifelse(1>0, 1, 0)))
>>>   user  system elapsed 
>>>  0.224   0.000   0.224 
>>>> 
>>>
>>>
>>>
>>>2012/9/14 Fabio Mathias Corrêa <fabio.ufla em yahoo.com.br>
>>>
>>>Felipe, 
>>>>
>>>>
>>>>Realmente, o if resolve o problema.
>>>>
>>>>
>>>>Só uma dica, troque o if por 
>>>>
>>>>
>>>>ifelse(length(temp)>0,resp=max(temp), resp=1)
>>>>
>>>>
>>>>Quanto ao which, vc precisa corrgir!
>>>>
>>>>
>>>>Valeu!
>>>>
>>>>
>>>> 
>>>>        Fábio Mathias Corrêa
>>>>
>>>>
>>>>   Universidade Estadual de Santa Cruz
>>>>Departamento de Ciências Exatas e da Terra - DCET
>>>>
>>>>
>>>>Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna
>>>>CEP 45662-900. Ilhéus-Bahia
>>>>
>>>>
>>>>
>>>>Tel.: 73-3680-5076
>>>>
>>>>
>>>>________________________________
>>>> De: Felipe Buchbinder <felbuch em gmail.com>
>>>>Para: r-br em listas.c3sl.ufpr.br 
>>>>Enviadas: Sexta-feira, 14 de Setembro de 2012 0:12
>>>>
>>>>Assunto: Re: [R-br] Dúvida função no R
>>>> 
>>>>
>>>>
>>>>Fábio,
>>>>
>>>>
>>>>Muito obrigado pela ajuda. Mas o if já não dá conta do caso em que p.vec não possui um elemento maior do que seed? E como p.vec é construido dentro de um loop que adiciona um elemento durante k iterações, como ele pode ter mais do que k elementos? Eu achava que já tinha controlado para evitar esses casos... não?
>>>>
>>>>
>>>>mais uma vez obrigado,
>>>>
>>>>
>>>>Felipe
>>>>
>>>>
>>>>2012/9/13 Fabio Mathias Corrêa <fabio.ufla em yahoo.com.br>
>>>>
>>>>O problema está nesta parte aqui!
>>>>>
>>>>>
>>>>>Nem sempre o vetor  p.vec possui um elemento maior que o seed, e quando isto ocorre retorna interger(0)
>>>>>
>>>>>
>>>>>Outro problema é que o which pega a posição do elemento, então, quando vc pega o max(temp), se o vetor tem tamanho 20, por exemplo, ele vai retornar o 20 e não o elemento.
>>>>>
>>>>>
>>>>>Precisa corrigir ai!
>>>>>
>>>>>
>>>>> temp = which(p.vec>seed) #we use this temporary vector in order to avoid warnings should its length be zero
>>>>>print(temp)
>>>>>  if(length(temp)>0){resp=max(temp)}else{resp=1}
>>>>>
>>>>>
>>>>>Valeu! 
>>>>>
>>>>>
>>>>>        Fábio Mathias Corrêa
>>>>>
>>>>>
>>>>>   Universidade Estadual de Santa Cruz
>>>>>Departamento de Ciências Exatas e da Terra - DCET
>>>>>
>>>>>
>>>>>Campus Soane Nazaré de Andrade, km 16 Rodovia Ilhéus-Itabuna
>>>>>CEP 45662-900. Ilhéus-Bahia
>>>>>
>>>>>
>>>>>
>>>>>Tel.: 73-3680-5076
>>>>>
>>>>>
>>>>>________________________________
>>>>> De: Felipe Buchbinder <felbuch em gmail.com>
>>>>>Para: r-br em listas.c3sl.ufpr.br 
>>>>>Enviadas: Quinta-feira, 13 de Setembro de 2012 15:24
>>>>>Assunto: Re: [R-br] Dúvida função no R
>>>>> 
>>>>>
>>>>>
>>>>>Obrigado pela referência,
>>>>>
>>>>>
>>>>>Preparei um CMR que envio anexo.
>>>>>
>>>>>
>>>>>Mais uma vez, obrigado 
>>>>>Felipe
>>>>>
>>>>>
>>>>>2012/9/13 FHRB Toledo <fernandohtoledo em gmail.com>
>>>>>
>>>>>Felipe,
>>>>>>
>>>>>>Para CMR, consulte: https://gist.github.com/1088208
>>>>>>
>>>>>>
>>>>>>att,
>>>>>>FH
>>>>>>
>>>>>>
>>>>>>
>>>>>>2012/9/13 Felipe Buchbinder <felbuch em gmail.com>
>>>>>>
>>>>>>O k foi definido no início do código, fora da função, como k = 5.
>>>>>>>
>>>>>>>
>>>>>>>Desculpe a ignorância, mas o que é um CMR? Como eu posso fazer um para enviar à lista?
>>>>>>>
>>>>>>>
>>>>>>>Obrigado pela disposição,
>>>>>>>
>>>>>>>Felipe
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>2012/9/13 Leonard de Assis <assis.leonard em gmail.com>
>>>>>>>
>>>>>>>Onde foi definido o k?
>>>>>>>>
>>>>>>>>[]s
Leonard de Assis
assis <dot> leonard <at> gmail <dot> com 
Em 13/09/2012 12:56, Felipe Buchbinder escreveu:
>>>>>>>>
>>>>>>>>Prezados professores, 
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Estou com um problema em uma função no R.
>>>>>>>>>A função é a seguinte:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>resp <- function(subject,item,trait)
>>>>>>>>>>>>{
>>>>>>>>>>>>  
>>>>>>>>>>>>  p.vec = NULL
>>>>>>>>>>>>  
>>>>>>>>>>>>  for(category in 1:k)  # k = 5
>>>>>>>>>>>>  {
>>>>>>>>>>>>    p = ogive ( theta[subject,trait] , a[item] ,
            b[item,category] , D )    # aqui é uma logit (D=1) ou probit
            (D=1.7)
>>>>>>>>>>>>    p.vec = c(p.vec,p)
>>>>>>>>>>>>  }
>>>>>>>>>>>>  
>>>>>>>>>>>>  #Generates a random number
>>>>>>>>>>>>  
>>>>>>>>>>>>  seed<-runif(1,0.2,0.8)
>>>>>>>>>>>>  
>>>>>>>>>>>>  #Selects an answer
>>>>>>>>>>>>  
>>>>>>>>>>>>  temp = which ( p.vec>seed ) 
>>>>>>>>>>>>  if( length (temp) > 0 ) { resp = max (temp) } else {
            resp = 1 }
>>>>>>>>>>>>  resp
>>>>>>>>>>>>}
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Esta função está inserida em um loop e deveria me retornar um número inteiro entre 1 e 5.
>>>>>>>>>Da primeira vez, isto acontece.
>>>>>>>>>Mas a partir da segunda, ela começa a me retornar valores como 20, 16,...
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Alguma idéia de porque isso acontece???
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Desde já, obrigado!
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>Felipe Buchbinder
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>_______________________________________________
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.
>>>>>>>>
>>>>>>>>_______________________________________________
>>>>>>>>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.
>>>>>>>>
>>>>>>>
>>>>>>>_______________________________________________
>>>>>>>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.
>>>>>>>
>>>>>>
>>>>>>_______________________________________________
>>>>>>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.
>>>>>>
>>>>>
>>>>>_______________________________________________
>>>>>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.
>>>>>
>>>>>
>>>>>_______________________________________________
>>>>>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.
>>>>>
>>>>
>>>>_______________________________________________
>>>>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.
>>>>
>>>>
>>>>_______________________________________________
>>>>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.
>>>>
>>>
>>
>>_______________________________________________
>>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.
>>
>
>_______________________________________________
>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.
>
>
>_______________________________________________
>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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120915/9f83cbe6/attachment.html>


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