I didn't try out your extensive code, but here's one potentially serious
problem:

You only pass two arguments to f(), alpha and h, but within f you nonetheless
use x1 and y and several other things. This is bad practice, and dangerous:
you should pass all the necessary arguments to f(), not rely on the environment
to contain them.

After you fix that, working through your function step by step at the command
line and looking at the results of each line of code can be very educational.

Sarah

On Sun, Dec 4, 2011 at 7:47 AM, napps22 <n.j.app...@gmail.com> wrote:
> Sorry that was my poor copying and pasting. Here's the correct R code. The
> problem does seem to be with the function I define as f.
>
> # Model selection example in a bayesian framework
> # two competiting non-nested models
> # M0: y_t = alpha * x1^2 + e_t
> # M1: y_t = beta * x1^4 + e_t
> # where e_t ~ iidN(0,1)
>
> #generate data
>
> x1 <- runif(100, min = -10, max = 10)
> y <- 2 * x1^2 + rnorm(100)
> n <- length(y)
> k <- 1
> v <- n - k
>
> # want the posterior probabilities of the two models
> # postprob_mj = p(y|model j true) * priorprob_mj / p(y)
> # need to calculate the integral of p(y|alpha,h)p(alpha,h)
> # and the integral of p(y|beta,h)p(beta,h)
> # recall we chose p(alpha,h) = p(beta,h) = 1/h
> # need to sample from the posterior to get an approximation of the integral
>
> # # # # # # # # Model 0 # # # # # # #
>
> z <- x1^2
> M <- sum(z^2)
> MI <- 1/M
> zy <- crossprod(z,y)
> alpha.ols <- MI * zy
> resid_m0 <- y - z * alpha.ols
> s2_m0 <- sum(resid_m0^2)/v
>
> # set up gibbs sampler
>
> nrDraws <- 10000
> h_sample_m0 <- rgamma(nrDraws, v/2, v*s2_m0/2)
> alpha_sample <- matrix(0, nrow = nrDraws, ncol = 1)
>
> for(i in 1:nrDraws) {
>
>        alpha_sample[i] <- rnorm(1,alpha.ols,(1/h_sample_m0[i]) * MI)
>
>        }
>
> # define posterior density for m0
>
> f <- function(alpha,h) {
>
>        e <- y - alpha * x1^2
>        const <- (2*pi)^(-n/2) / ( gamma(v/2) * (v*s2_m0/2)^(-v/2) )
>        kernel <- h^((v-1)/2) * exp((-(h/2) * sum(e^2)) - (v*s2_m0)*h)
>        x <- const * kernel
>        return(x)
>        }
>
> # calculate approximation of p(y|m_0)
>
> m0 <-f(alpha_sample,h_sample_m0)
> post_m0 <- sum(m0) / nrDraws
>
>
>

-- 
Sarah Goslee
http://www.functionaldiversity.org

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to