[R-br] Como escrever o modelode Michaelis-Menten na linguagem BUGS - R2WinBUGS

Augusto Ribas ribas.aca em gmail.com
Quarta Julho 11 13:03:16 BRT 2012


Opa.
Alguem usa o winbugs com o R?
Eu estava tentando ajustar um Modelo de michelis-menten e não consegui.
Se alguem puder dar uma olhadinha e ver onde estou errado.
Segue um exemplo do que estou fazendo:

library(R2WinBUGS)
#################################################################
#Relação Riqueza~estudos
#################################################################


#Modelo do que eu acho que acontece
#riqueza~(c*estudos)/(d+estudos)

#Fazendo um levantamento do numero de especies de parasitas que
parasitam algumas especies de sapos, eu supuz que qd uma especie tinha
poucos estudos
#tava sempre bem subestimado a riqueza de parasitas associadas aquela especie.
#dai como a unica informação que fico é com o número de estudos,
pensei que deveria ter uma relação onde qt mais estudos, mais especies
eu devo encontrar
#até um limite, o limite é o parametro c nesse caso, e d representa
como os estudos vão contribuindo pra eu chegar ao valor limite de
especies.
#existem alguns problemas acredito, como especies podem ser mais
faceis ou mais dificies de estudar, e o limite pra cada especie
depende de mais coisas e tipos de estudos.
#mas ficando so nesse caso, eu fiz esse exemplo

set.seed(13)
#gerando dados exemplo
estudos<- rpois(48,5)
#parametros originais
#então o limite de especies de parasitos seria 10
c<-10
#e eu preciso de mais ou menos 5 estudos pra ver legal a riqueza de especies,
d<-2.5
#resposta
riqueza<-round(((c*estudos)/(d+estudos))+rnorm(length(estudos),0,1),0)

plot(riqueza~estudos,xlim=c(0,15),ylim=c(0,15),xlab="Riqueza de
espécies",ylab="Número de estudos")
curve(c*x/(d+x),0,15,add=T,col="black")

#ajustando com modelo não linear
modelo.estudos<-nls(riqueza~((a*estudos)/(b+estudos)),start=list(a=8,b=1.5))
summary(modelo.estudos)

points(predict(modelo.estudos)[order(predict(modelo.estudos))]~estudos[order(estudos)],type="l",col="red",lty=2)

#eu li que é possivel lineariza essa função e ajusta com glm da seguinte forma:
#ajustando com glm
modelo.menten<- glm(riqueza~c(1/estudos),family=gaussian(link = "inverse"))
summary(modelo.menten)
a1<-1/modelo.menten$coef[1]
b1<-a1*modelo.menten$coef[2]
a1
b1
curve(a1*x/(b1+x),0,15,add=T,col="blue",lty=2)

### Ajuste com winbugs
# Definir modelo
sink("michaelis.menten.test.txt")
cat("
model {

# Priors
alpha ~ dnorm(0,0.001)
beta ~ dnorm(0,0.001)
sigma ~ dunif(0, 100)

# Likelihood
 for (i in 1:n) {
    riqueza[i] ~ dnorm(mu[i], tau)
    mu[i] <- alpha + beta * estudos[i]
}
# Derived quantities
 tau <- 1/ (sigma * sigma)
}
",fill=TRUE)
sink()

# Juntar os dados - Note que eu não entendi como fazer a função de
ligação dentro do modelo winbugs
#dai eu registrei os dados como 1/riqueza e 1/estudos aqui, acho que
isso que o pepino deve ta nisso
win.data <- list(riqueza=c(1/riqueza),estudos=c(1/estudos),n=length(estudos))

# Valores iniciais
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1),sigma = rlnorm(1))}

# Paramstros a estimar
params <- c("alpha","beta","tau")

# MCMC settings
nc <- 3
ni <- 3000
nb <- 1000
nt <- 2

# Começa o winbugs
out <- bugs(data=win.data, inits=inits, parameters.to.save=params,
model.file="michaelis.menten.test.txt", n.thin=nt, n.chains=nc, n.burnin=nb,
n.iter=ni, debug = TRUE)


###Olhar o modelo
print(out, dig = 3)

#retornoar os parametros como no glm acima
a2<-1/out$summary[1,1]
b2<-a*out$summary[2,1]
a2
b2

curve(a2*x/(b2+x),0,15,add=T,col="green",lty=2)

legend("topright",legend=c("Original","Ajustado com nls","Ajustado com
glm","Ajustado com WinBUGS"),
lty=c(1,2,2,2),col=c("black","red","blue","green"))


#Minhas duvidas são:

#01. como montar o modelo na linguagem bugs pra fazer esse tipo de analise?
#procurando pela internet eu não achei nenhum exemplo pra esse caso especifico.

#02. como eu colocaria dentro do modelo esse função de ligação inversa.
#eu tentei usar a função pow(mu[i],-1) mas não rolou,

#03. e o que estou fazendo no modelo winBUGS tem muito problemas?
entrar com os dados daquele jeito, ao invez de especificar no modelo?
#não consigo imaginar a implicação de não definir no modelo a função de ligação.

Bom se alguem tiver esperiencia com winbugs e puder dar uma olhadinha
no que estou fazendo errado
Ou alguma dica se o que estou fazendo tem algum problema critico

-- 
Grato
Augusto C. A. Ribas

Site Pessoal: http://augustoribas.heliohost.org
Lattes: http://lattes.cnpq.br/7355685961127056


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