
Já resolvi o "out of bounds". Mais uma vez, muito obrigado a todos!!! Felipe 2012/9/16 Felipe Buchbinder <felbuch@gmail.com>
Isto realmente resolve boa parte do problema. Muito obrigado, especialmente ao Eduardo, ao Fabio e ao Leandro!!!
Porém, a função grm continua dando "out of bounds" às vezes, mas o SOR já está resolvido.
Alguém tiver alguma idéia do que pode estar dando este problema?
Mais uma vez obrigado!!!
Felipe
2012/9/15 Fabio Mathias Corrêa <fabio.ufla@yahoo.com.br>
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 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.
_______________________________________________ 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.