as.commensurateEB=function(prior){
if (ncol(prior)!=1) stop("mixture object may only have one component")
# if (inherits(prior,"betaMix")) attr(prior,"p.prior")=c(p.prior.a,p.prior.b)
class(prior)=c("commensurateEB",class(prior))
prior
}
################
# postmix
postmix.commensurateEB=function(priormix, data, n, r, m, se, l.eb=0,u.eb=Inf, ...){
if (inherits(priormix,"normMix")){
if (!missing(data)) {
m <- mean(data)
n <- length(data)
se <- sd(data)/sqrt(n)
}
else {
if (missing(m) & (missing(n) | missing(se)))
stop("Either raw data or summary data (m and se) must be given.")
if (!missing(se) & !missing(n)) {
sigma(priormix) <- se * sqrt(n)
message(paste0("Updating reference scale to ", sigma(priormix),
".\nIt is recommended to use the sigma command instead.\nSee ?sigma or ?mixnorm."))
}
if (missing(se) & !missing(n)) {
message("Using default prior reference scale ", sigma(priormix))
se <- sigma(priormix)/sqrt(n)
}
if (!missing(se) & missing(n)) {
message("Using default prior reference scale ", sigma(priormix))
n<- (sigma(priormix)/se)^2
}
}
Delta.hat <- m - priormix["m",]
## MMLE of tau, Hobbs et al 2012 (5) ##
# v0=priormix["s",]^2
# tau.EB <- 1/max( min( (Delta.hat^2)-se^2-v0, u.eb ), l.eb )
# s.post= sqrt( 1/( 1/se^2 + 1/(v0+(1/tau.EB)) ) )
tau.EB.inv <- max( min( (Delta.hat^2)-se^2-priormix["s",]^2, u.eb ), l.eb )
s.post= sqrt( 1/( 1/se^2 + 1/(priormix["s",]^2+tau.EB.inv) ) )
# m.post=( m/se^2 + priormix["m",]/(v0+(1/tau.EB)) )/
# ( 1/se + (1/(v0+(1/tau.EB))) )
m.post=( m/se^2 + priormix["m",]/(priormix["s",]^2+tau.EB.inv) )*s.post^2
return(mixnorm(c(1,m.post,s.post), sigma=se * sqrt(n)))
}
if (inherits(priormix,"betaMix")){
if (!missing(data)) {
assert_that(all(data %in% c(0, 1)))
r <- sum(data)
n <- length(data)
}
# if (missing(p.prior.a)| missing(p.prior.b)){
# if (!is.null(attr(priormix,"p.prior"))){
# p.prior.a=attr(priormix,"p.prior")[1]
# p.prior.b=attr(priormix,"p.prior")[2]
# } else{
# p.prior.a=p.prior.b=1
# }
# }
#
n0=priormix["a",]+priormix["b",]
y0=priormix["a",]
# k1=seq(0,1000,by=1)
k1=seq(0,500,by=.1)
marg=rep(NA,length(k1))
for (i in 1:length(k1)) {
integrandU.V=Vectorize(function(th0C){
integrand=function(th,th0=th0C,k=k1[i]) dbinom(r,n,th)*dbinom(y0,n0,th0)*dbeta(th,k*th0,k*(1-th0))
as.numeric(integrate(integrand,0.001,0.999)[1])
})
marg[i]=as.numeric(integrate(integrandU.V,0.001,0.999)[1])
}
k_emp=k1[which.max(marg)]
marg_e=marg[which.max(marg)]
integrandU.V=Vectorize(function(thN){
integrand=function(th0,th=thN,k=k_emp) dbinom(r,n,th)*dbinom(y0,n0,th0)*dbeta(th,k*th0,k*(1-th0))
as.numeric(integrate(integrand,0,1)[1])/marg_e
})
xg=seq(0.001,0.999,by=0.001)
iU=integrandU.V(xg)
mean.thC=sum(xg*iU/sum(iU))
var.thC=sum(xg^2*iU/sum(iU))-mean.thC^2
# appoximates distribution by beta distribution, seems to work well, but needs to be further checked
estBetaParams <- function(mu, var) {
alpha <- ((1 - mu) / var - 1 / mu) * mu ^ 2
beta <- alpha * (1 / mu - 1)
return(params = list(alpha = alpha, beta = beta))
}
ab=estBetaParams(mean.thC,var.thC)
mixbeta(c(1,ab$alpha,ab$beta))
}
}
# nu <- function(M0,a,b.tau,Bd){
# return( max( min( ( (M0/a)^2 ) - b.tau, 1/Bd[1] ), 1/Bd[2] ) )
# }
#
# ## Posterior mean for lambda|tau ## (10)
# M <- function(tau,A,B,n,n1,sig2,v0){ return( ( A/( (n/n1)*((sig2/n)+v0+(1/tau)) ) + ( B/(sig2/n1)) ) /
# ( 1/V(tau,n,n1,sig2,v0) )
# ) }
# ## Posterior Variance of lambda|tau ## (9)
# V <- function(tau,n,n1,sig2,v0){ return( 1/( 1/(((n/n1)^2)*((sig2/n)+v0+(1/tau))) + ( ( n1*(1-(n1/n)) )/sig2 ) ) ) }
#
#
# gen.Data <- function(pars){
# data. <- list(A=rnorm(1, pars$Ex.A, sqrt(pars$V.A)),
# B=rnorm(1, pars$Ex.B, sqrt(pars$V.B)) )
# data.$M0 <- data.$A*pars$a - data.$B/( 1-(1/pars$a) )
# return(data.)
# }
#
# eb <- function(pars,Bd){
# data. <- gen.Data(pars)
# tau <- 1/nu(data.$M0,pars$a,pars$b.tau,Bd)
# EHSS <- pars$sig2/(pars$v0+(1/tau))
# return( c(M(tau,data.$A,data.$B,pars$n,pars$n1,pars$sig2,pars$v0), ## Post Mean lambda
# V(tau,pars$n,pars$n1,pars$sig2,pars$v0), ## Post var lambda
# EHSS ## EHSS
# ) )
# }
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.