Skip to content

Latest commit

 

History

History
85 lines (71 loc) · 2.17 KB

gibbsLM_Censored.md

File metadata and controls

85 lines (71 loc) · 2.17 KB

Gibbs sampler for multiple linear regression with right-censored data

library(bayesm)

gibbsLM_RC<-function(y,d,X,groups,isRandom,R20=.5,df0=1,verbose=TRUE,nIter=150){
  #renumbering groups from 1:K
  groups <- as.integer(as.factor(groups))
  nGroups <- length(unique(groups))
  
  #calculating hyper-parameter
  Se <- var(y ,na.rm=T)*(1-R20)*(df0+2)
  Sb <- var(y,na.rm=T)*R20/ncol(X)*(df0+2)
  p <- as.numeric(table(groups))
  
  #determing how many censored point
  whichCensored=which(Y$death==0) ## 
  nCensored=length(whichCensored) ##
  
  #store sample
  B <- matrix(nrow=nIter, ncol=sum(p), 0) 
  varE <- rep(NA,nIter) 
  varB <- matrix(nrow=nIter,ncol=nGroups)
  
  #computation
  postDFe <- nrow(X)+df0 
  postDFb <- p+df0 
  sumSqX=colSums(X^2)
  
  #initialization
  B[1,1]=mean(y,na.rm=TRUE) # initialize intercept to mean(y) and other effects to zero 
  varE[1]=var(y,na.rm=TRUE)*(1-R20) 
  varB[1,]=Sb/(df0+2) 
  error <- y-mean(y,na.rm=TRUE) 
  if(nCensored>0){
    error[whichCensored]=0
  }
  for(i in 1:nGroups){ 
    varB[,i]<-ifelse(isRandom[i],varB[,i],1e4) 
  }
  beta<-B[1,]
  
  # Gibbs Sampler
  for(i in 1:nIter){
    # sampling error variance (varE)
    S=sum(error^2)+Se
    varE[i]<-S/rchisq(df=postDFe,n=1)
    
    # sampling  paramters by group
    for(j in 1:nGroups){
      # sampling variances (vaeB)
      if(isRandom[j]){              
        S=sum(beta[groups==j]^2)+Sb
        varB[i,j]<-S/rchisq(df=postDFb[j],n=1)
      }
    }
    
    # sampling effects (B)
    z<-rnorm(ncol(X))
    for(j in 1:ncol(X)){
      xj=X[,j]
      error<-error+xj*beta[j]
      C=sumSqX[j]/varE[i]+1/varB[i,groups[j]]
      rhs<-sum(xj*error)/varE[i]
      sol<-rhs/C
      beta[j]<-sol+z[j]/sqrt(C)
      error<-error-xj*beta[j]
    } 
    B[i,]=beta
    
    if(nCensored>0){#*# sampling censored points from truncated normal
      Xb=X%*%beta
      lowerBound=y[whichCensored]-Xb[whichCensored]
      error[whichCensored]<-unlist(lapply(FUN=rtrun,X=lowerBound,mu=0,sigma=sqrt(varE[i]),b=Inf))
      #    Ystar[whichCensored] <- Xb[whichCensored]+error[whichCensored]
    }
    
    if(verbose){ cat(i,round(varE[i],3),'\n') }
  }
  OUT=list(varE=varE,varB=varB,B=B)
  return(OUT)
}