
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@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@gmail.com> *Para:* r-br@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@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@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@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@gmail.com> *Para:* r-br@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@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@gmail.com> *Para:* r-br@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@gmail.com>
Felipe,
Para CMR, consulte: https://gist.github.com/1088208
att, FH
2012/9/13 Felipe Buchbinder <felbuch@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@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 listR-br@listas.c3sl.ufpr.brhttps://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@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@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@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@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@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@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@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@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@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@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.