Advertisement
Guest User

Untitled

a guest
Mar 19th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. # -----------------------------------------------------------------------------------
  2. # SSVS Setup
  3. # -----------------------------------------------------------------------------------
  4. ss0 <- 0.01
  5. ss1 <- 100
  6.  
  7. # coef_store resulting from estimation without shrinkage
  8. s0 <- as.numeric(ss0*apply(coef_store,2,sd))
  9. s1 <- as.numeric(ss1*apply(coef_store,2,sd))
  10.  
  11. # initial values
  12. delta_draw <- matrix(1,K,1)
  13. V_pr <- diag(as.numeric(delta_draw*s1 + (1-delta_draw)*s0))
  14. V_pr.inv <- solve(V_pr)
  15.  
  16. sigma2_draw <- 10
  17.  
  18. # store parameters
  19. coef_store <- matrix(NA, nrow = nsave, ncol = K)
  20. sigma2_store <- matrix(NA, nrow = nsave, ncol = 1)
  21. delta_store <- matrix(NA,nsave,K)
  22.  
  23. # start Gibbs sampling
  24. t.start <- Sys.time()
  25.  
  26. # -----------------------------------------------------------------------------------
  27. # SSVS MCMC
  28. # -----------------------------------------------------------------------------------
  29.  
  30. for(irep in 1:ntot){
  31. # --------------------------------------------------------------------------------
  32. # draw p(theta | .)
  33. V_po <- try(solve(XpX / sigma2_draw + V_pr.inv), silent=TRUE)
  34. if (is(V_po,"try-error")) V_po <- ginv(XpX / sigma2_draw + V_pr.inv)
  35. theta_po <- matprod(V_po, (crossprod(X, y) / sigma2_draw))
  36.  
  37. theta_draw <- try(theta_po + t(chol(V_po)) %*% rnorm(K,0,1), silent=T)
  38. if (is(theta_draw, "try-error")) theta_draw <- mvrnorm(1, theta_po, V_po)
  39. Xtheta <- matprod(X,theta_draw)
  40.  
  41. # --------------------------------------------------------------------------------
  42. # draw p(sigma2 | .)
  43. a_po <- a_pr + N/2
  44. b_po <- b_pr + crossprod(y - Xtheta)/2
  45. sigma2_draw <- 1/rgamma(1, a_po, b_po)
  46.  
  47. # --------------------------------------------------------------------------------
  48. # X: SSVS prior
  49. for(j in 1:K){
  50. #Xa: check if low or high s fits better to theta_draw
  51. p0 <- dnorm(theta_draw[j], 0, sqrt(s0[j])) * 0.5
  52. p1 <- dnorm(theta_draw[j], 0, sqrt(s1[j])) * 0.5
  53. prob.delta <- p1/(p0+p1)
  54. if(is.nan(prob.delta)){prob.delta <- 0}
  55.  
  56. #Xb: assign value to delta
  57. if(prob.delta > runif(1)) delta_draw[j] <- 1 else delta_draw[j] <- 0
  58. # delta_draw[j] <- sample(0:1,1,prob=c(1-prob.delta,prob.delta))
  59. }
  60.  
  61. #Xc: re-estimate VCV with new deltas
  62. V_pr <- diag(as.numeric(delta_draw*s1 + (1-delta_draw)*s0))
  63. V_pr.inv <- solve(V_pr)
  64.  
  65. # --------------------------------------------------------------------------------
  66. # store draws
  67. if(irep > nburn){
  68. coef_store[irep-nburn,] <- theta_draw
  69. sigma2_store[irep-nburn] <- sigma2_draw
  70. delta_store[irep-nburn,] <- delta_draw
  71. }
  72. pb$tick()
  73. }
  74.  
  75. storage_ssvs <- list("coef_store"=coef_store,"sigma2_store"=sigma2_store,"time"=as.numeric(difftime(Sys.time(),t.start,units = "secs")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement