# Question 1b # Function draws a pair of N(0,1) random numbers using the Polar Marsaglia method polarMarsaglia <- function() { repeat { # Keep sampling until inside unit circle u <- -1 + 2*runif(2) # Draw U_1,U_2 ~ U[-1,1] r2 <- sum(u**2) if (r2<=1) # If radius is less than one, we are done break } factor <- sqrt(-2*log(r2)/r2) u * factor } x <- numeric(100) # Create vector to store result for (i in 1:50) x[2*i+c(-1,0)] <- polarMarsaglia() # Fill with pairs of values #################################################### impsamp.var <- function(sigma2) { sigma2 / sqrt(2*sigma2-1) * exp(1/(2*sigma2-1)) - 1 } optimize(impsamp.var, c(0.5,5)) #################################################### # Question 5a rejection.example <- function(n, sigma2) { x <- numeric(n) # Create vector to store result sigma2 <- (sqrt(5)+3)/2 # Optimal variance M <- sqrt(sigma2) * exp(1/(2*(sigma2-1))) # Optimal M for (i in 1:n) { repeat { # Keep proposing ... x.new <- rnorm(1,1,sqrt(sigma2)) # Generate x.new ~ N(1,sigma2) accept <- dnorm(x.new,0,1) / (M*dnorm(x.new,1,sqrt(sigma2))) # Compute probability of acceptance if (runif(1)tau) # ... until x_new > tau (accepted) break } x[i] <- x.new } cat("Proportion of accepted values\n") # Print proportion of accepted values print(n/num.proposed) x } #################################################### # Question 7b x <- sample.truncated.normal.a(10, 0, 1, 4) #################################################### # Question 7c sample.truncated.normal.c <- function(n, tau) { M <- 1 / ( 2 * (1-pnorm(tau) )) * exp(-tau^2/2) # Compute M x <- numeric(n) # Create vector to store result num.proposed <- 0 # Set counter of proposed values for (i in 1:n) { repeat { # Keep proposing ... x.new <- tau + abs(rnorm(1)) # Draw new value from instrumental dist'n num.proposed <- num.proposed + 1 # Increment counter f <- dnorm(x.new) / (1-pnorm(tau)) # Evaluate target density} g <- 2 * dnorm(x.new,mean=tau) # Evaluate instrumental density accept <- f / ( M * g ) # Probability of accepting if (runif(1)