
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@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Fabio Mathias Corrêa <fabio.ufla@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@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 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.
_______________________________________________ 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.