################################################################################## # R.code for GCI, FGCI, MOVER and highest posterior densities (HPDs) # ################################################################################## library(EnvStats) library(HDInterval) library(invgamma) library(LaplacesDemon) library(MASS) CI.ratioVarDLN = function(M=5000, m=2500, n1=50, n2=50, mu1=3, mu2=3, sigmaSq1=1, sigmaSq2=1, delta1=0.1, delta2=0.1, alpha=0.05){ # x = random samples draw from delta-lognormal distribution (DLN) # M = number of simulation runs # m = number of generalized computation # n = sample size # mu = mean of normal distribution # sigmaSq = variance of normal distribution # delta = probability of additional zero # alpha = level of significance # Ex_LN = mean of lognormal # cv_LN = coefficient of variation (CV) of lognormal # Temp.size_nonzero1 = At least the sample size of nonzero in Group1 = n1-(n1*delta1) # Temp.size_nonzero2 = At least the sample size of nonzero in Group2 = n2-(n2*delta2) # var_deltaLN = variance of DLN # ratio_VarDLN = logarithm of ratio of delta-lognormal variances # mu_GPQ = generalized pivotal quantity (GPQ) of mu # sigmaSq_GPQ = GPQ of sigmaSq # delta_GPQ = GPQ of probability of zero values # R.VST = GPQ of log-ratio of delta-lognormal variances # L.GCI = lower limit of generalized confidence interval (GCI) # U.GCI = upper limit of GCI # CP.GCI = coverage probability based on GCI # Length.GCI = length of GCI # ACP.GCI = average coverage probability of GCI # Ex.length.GCI = average length of GCI # RAL.GCI = relative average length of GCI # mu_FGPQ = fiducial generalised pivotal quantity (FGPQ) of mu # sigmaSq_FGPQ = FGPQ of sigmaSq # deltanon_FGPQ = FGPQ of probability of non-zero values # T_var = FGPQ of variance of DLN # T_ratio.FGCI = FGPQ of log-ratio of delta-lognormal variances # L.FGCI = lower limit of fiducial generalized confidence interval (FGCI) # U.FGCI = upper limit of FGCI # CP.FGCI = coverage probability of FGCI # Length.FGCI = average length of FGCI # ACP.FGCI = average coverage probability of FGCI # Ex.length.FGCI = average length of FGCI # RAL.FGCI = relative average length of FGCI # L.mover = lower limit of Method of variance estimates recovery (MOVER) # U.mover = upper limit of MOVER # CP.mover = coverage probability of MOVER # Length.mover = average length of MOVER # ACP.mover = average coverage probability of MOVER # Ex.length.mover = average length of MOVER # RAL.mover = relative average length of MOVER # HPD.Jef = highest posterior density interval based on Jeffreys' prior (HPD-Jef) # post_sigmaSq = posterior of sigmaSq based on Jeffreys' prior # post_mu = posterior of mu based on Jeffreys' prior # post_delta = posterior of delta based on Jeffreys' prior # post_varDLN = posterior of delta-lognormal variance # ratio.post.Jef = ratio of two posteriors of delta-lognormal variance based on Jeffreys' prior # L.HPD.Jef = lower limit of HPD-Jef # U.HPD.Jef = upper limit of HPD-Jef # CP.HPD.Jef = coverage probability of HPD-Jef # Length.HPD.Jef = average length of HPD-Jef # ACP.HPD.Jef = average coverage probability of HPD-Jef # Ex.length.HPD.Jef = average length of HPD-Jef # HPD.rul = highest posterior density interval based on Jeffreys' Rule prior (HPD-Rul) # post_sigmaSq.rul = posterior of sigmaSq based on Jeffreys' Rule prior # post_mu.rul = posterior of mu based on Jeffreys' Rule prior # post_delta.rul = posterior of delta based on Jeffreys' Rule prior # post_varDLN.rul = posterior of delta-lognormal variance # ratio.post.rul = ratio of two posteriors of delta-lognormal variance based on Jeffreys' Rule prior # L.HPD.rul = lower limit of HPD-Rul # U.HPD.rul = upper limit of HPD-Rul # CP.HPD.rul = coverage probability of HPD-Rul # Length.HPD.rul = average length of HPD-Rul # ACP.HPD.rul = average coverage probability of HPD-Rul # Ex.length.HPD.rul = average length of HPD-Rul # HPD.NG = highest posterior density interval based on normal-gamma prior (HPD-NG) # post_sigmaSq.NG = posterior of sigmaSq based on Jeffreys' Rule prior # post_mu.NG = posterior of mu based on Jeffreys' Rule prior # post_deltanon.NG = posterior of delta based on Jeffreys' Rule prior # post_varDLN.NG = posterior of delta-lognormal variance # ratio.post.NG = ratio of two posteriors of delta-lognormal variance # L.HPD.NG = lower limit of HPD-NG # U.HPD.NG = upper limit of HPD-NG # CP.HPD.NG = coverage probability of HPD-NG # Length.HPD.NG = average length of HPD-NG # ACP.HPD.NG = average coverage probability of HPD-NG # Ex.length.HPD.NG = average length of HPD-NG Ex_LN1 = exp(mu1+(sigmaSq1/2)) cv_LN1 = sqrt(exp(sigmaSq1)-1) var_deltaLN1 = (1-delta1)*exp((2*mu1)+sigmaSq1)*(exp(sigmaSq1)+delta1-1) Ex_LN2 = exp(mu2+(sigmaSq2/2)) cv_LN2 = sqrt(exp(sigmaSq2)-1) var_deltaLN2 = (1-delta2)*exp((2*mu2)+sigmaSq2)*(exp(sigmaSq2)+delta2-1) ratio_VarDLN = log(var_deltaLN1/var_deltaLN2) # GCI U1.VST = matrix(rep(0,m)) U2.VST = matrix(rep(0,m)) Z1.VST = matrix(rep(0,m)) Z2.VST = matrix(rep(0,m)) V1.VST = matrix(rep(0,m)) V2.VST = matrix(rep(0,m)) mu_GPQ1 = matrix(rep(0,m)) mu_GPQ2 = matrix(rep(0,m)) sigmaSq_GPQ1 = matrix(rep(0,m)) sigmaSq_GPQ2 = matrix(rep(0,m)) delta_GPQ1 = matrix(rep(0,m)) delta_GPQ2 = matrix(rep(0,m)) R.VST = matrix(rep(0,m)) L.GCI = numeric() U.GCI = numeric() CP.GCI = numeric() Length.GCI = numeric() # FGCI mu_FGPQ1 = matrix(rep(0,m)) mu_FGPQ2 = matrix(rep(0,m)) sigmaSq_FGPQ1 = matrix(rep(0,m)) sigmaSq_FGPQ2 = matrix(rep(0,m)) delta_FGPQ1 = matrix(rep(0,m)) delta_FGPQ2 = matrix(rep(0,m)) T_var1 = matrix(rep(0,m)) T_var2 = matrix(rep(0,m)) T_ratio.FGCI = matrix(rep(0,m)) L.FGCI = numeric() U.FGCI = numeric() CP.FGCI = numeric() Length.FGCI = numeric() # MOVER L.mover = numeric() U.mover = numeric() CP.mover = numeric() Length.mover = numeric() # HPD-Jef post_mu1 = rep(0,m) post_sigmaSq1= rep(0,m) post_delta1 = rep(0,m) post_varDLN1 = rep(0,m) post_mu2 = rep(0,m) post_sigmaSq2= rep(0,m) post_delta2 = rep(0,m) post_varDLN2 = rep(0,m) ratio.post.Jef = rep(0,m) L.HPD.Jef = numeric() U.HPD.Jef = numeric() CP.HPD.Jef = numeric() Length.HPD.Jef = numeric() # HPD-Rul post_mu.rul1 = rep(0,m) post_sigmaSq.rul1 = rep(0,m) post_delta.rul1 = rep(0,m) post_varDLN.rul1 = rep(0,m) post_mu.rul2 = rep(0,m) post_sigmaSq.rul2 = rep(0,m) post_delta.rul2 = rep(0,m) post_varDLN.rul2 = rep(0,m) L.HPD.rul = numeric() U.HPD.rul = numeric() CP.HPD.rul = numeric() Length.HPD.rul = numeric() # HPD-NG post_mu.NG1 = rep(0,m) post_sigmaSq.NG1 = rep(0,m) post_deltanon.NG1 = rep(0,m) post_mu.NG2 = rep(0,m) post_sigmaSq.NG2 = rep(0,m) post_deltanon.NG2 = rep(0,m) L.HPD.NG = numeric() U.HPD.NG = numeric() CP.HPD.NG = numeric() Length.HPD.NG = numeric() i = 1 while(i <= M){ #begin loop i x1 = rzmlnormAlt(n1, Ex_LN1, cv_LN1, delta1) #generate x1 from DLN in Population 1 x2 = rzmlnormAlt(n2, Ex_LN2, cv_LN1, delta2) #generate x2 from DLN in Population 2 Temp.nonzero_value1 = log(x1[which(x1!=0)]) #find values is not zero in Population 1 Temp.nonzero_value2 = log(x2[which(x2!=0)]) #find values is not zero in Population 2 Temp.size_nonzero1 = length(Temp.nonzero_value1) if(Temp.size_nonzero1 < (n1-(n1*delta1))){next} Temp.size_nonzero2 = length(Temp.nonzero_value2) if(Temp.size_nonzero2 < (n2-(n2*delta2))){next} nonzero_value1 = Temp.nonzero_value1 size_nonzero1 = Temp.size_nonzero1 size_zero1 = n1-size_nonzero1 sum_nonzero1 = sum(nonzero_value1^2) mu_hat1 = mean(nonzero_value1) sigmaSq_hat1 =var(nonzero_value1) delta_hat1 = 1-(size_nonzero1/n1) varDLN_hat1 = (1-delta_hat1)*exp(2*mu_hat1+sigmaSq_hat1)*(exp(sigmaSq_hat1)-(1-delta_hat1)) nonzero_value2 = Temp.nonzero_value2 size_nonzero2 = Temp.size_nonzero2 size_zero2 = n2-size_nonzero2 sum_nonzero2 = sum(nonzero_value2^2) mu_hat2 = mean(nonzero_value2) sigmaSq_hat2 =var(nonzero_value2) delta_hat2 = 1-(size_nonzero2/n2) varDLN_hat2 = (1-delta_hat2)*exp(2*mu_hat2+sigmaSq_hat2)*(exp(sigmaSq_hat2)-(1-delta_hat2)) ############################################################################## # Algorithm 1: GCI # ############################################################################## U1.VST = rchisq(m,(size_nonzero1-1)) #generate U1 from chi-square with n1(1)-1 df in Population 1 Z1.VST = rnorm(m,0,1) #generate Z1 from standard normal in Population 1 V1.VST = rnorm(m,0,1) #generate w3 from standard normal U2.VST = rchisq(m,(size_nonzero2-1)) #generate U2 from chi-square with n2(1)-1 df in Population 2 Z2.VST = rnorm(m,0,1) #generate Z2 from standard normal in Population 2 V2.VST = rnorm(m,0,1) #generate w3 from standard normal mu_GPQ1 = mu_hat1-(V1.VST*sqrt(((size_nonzero1-1)*sigmaSq_hat1)/(size_nonzero1*U1.VST))) sigmaSq_GPQ1 = ((size_nonzero1-1)*sigmaSq_hat1)/U1.VST delta_GPQ1 = (sin(asin(sqrt(delta_hat1))-(Z1.VST/(2*sqrt(n1)))))^2 R1.VST =(1-delta_GPQ1)*exp(2*mu_GPQ1+sigmaSq_GPQ1)*(exp(sigmaSq_GPQ1)-(1-delta_GPQ1)) mu_GPQ2 = mu_hat2-(V2.VST*sqrt(((size_nonzero2-1)*sigmaSq_hat2)/(size_nonzero2*U2.VST))) sigmaSq_GPQ2 = ((size_nonzero2-1)*sigmaSq_hat2)/U2.VST delta_GPQ2 = (sin(asin(sqrt(delta_hat2))-(Z2.VST/(2*sqrt(n2)))))^2 R2.VST =(1-delta_GPQ2)*exp(2*mu_GPQ2+sigmaSq_GPQ2)*(exp(sigmaSq_GPQ2)-(1-delta_GPQ2)) R.VST = log(R1.VST/R2.VST) L.GCI[i] =quantile(R.VST,0.025) U.GCI[i] =quantile(R.VST,0.975) CP.GCI[i] = ifelse(L.GCI[i]< ratio_VarDLN && ratio_VarDLN