# Helper functions used by test-independent_test_pmvnorm.R
# Bivariate with small variance
pbvnorm <- function(h1, h2, ro) {
x <- c(0.04691008, 0.23076534, 0.5, 0.76923466, 0.95308992)
w <- c(0.018854042, 0.038088059, 0.0452707394, 0.038088059, 0.018854042)
h12 <- (h1 * h1 + h2 * h2) / 2
bv <- 0
if (abs(ro) < 0.7) {
h3 <- h1 * h2
ror <- ro * x
ror2 <- 1 - ror * ror
bv <- ro * w * exp((ror * h3 - h12) / ror2) / sqrt(ror2)
bvsum <- sum(bv)
bvfinal <- bvsum + pnorm(h1, lower.tail = TRUE) * pnorm(h2, lower.tail = TRUE)
} else {
r2 <- 1 - ro * ro
r3 <- sqrt(r2)
if (ro <= 0) {
h2 <- -h2
}
h3 <- h1 * h2
h7 <- exp(-h3 / 2)
if (r2 == 0) {
if (ro > 0) {
bvfinal <- pnorm(min(h1, h2)) + bv * r3 * h7
}
if (ro <= 0) {
bvfinal <- max(0, pnorm(h1) - pnorm(h2)) - bv * r3 * h7
}
} else {
h6 <- abs(h1 - h2)
h5 <- h6 * h6 / 2
h6 <- h6 / r3
aa <- 0.5 - h3 / 8
ab <- 3 - 2 * aa * h5
bv <- 0.13298076 * h6 * ab * pnorm(-h6) - exp(-h5 / r2) * (ab +
aa * r2) * 0.053051647
r1 <- r3 * x
rr <- r1 * r1
r2 <- sqrt(1 - rr)
bv1 <- w * exp(-h5 / rr) * (exp(-h3 / (1 + r2)) / r2 / h7 - 1 - aa *
rr)
bvsum1 <- sum(bv1)
bv <- bv - bvsum1
if (ro > 0) {
bvfinal <- pnorm(min(h1, h2)) + bv * r3 * h7
}
if (ro <= 0) {
bvfinal <- max(0, pnorm(h1) - pnorm(h2)) - bv * r3 * h7
}
}
}
}
# Bivariate with large variance
pbvnorm2 <- function(h1, h2, ro) {
x <- c(0.04691008, 0.23076534, 0.5, 0.76923466, 0.95308992)
w <- c(0.018854042, 0.038088059, 0.0452707394, 0.038088059, 0.018854042)
h12 <- (h1 * h1 + h2 * h2) / 2
bv <- 0
r2 <- 1 - ro * ro
r3 <- sqrt(r2)
h3 <- h1 * h2
h7 <- exp(-h3 / 2)
h6 <- abs(h1 - h2)
h5 <- h6 * h6 / 2
h6 <- h6 / r3
aa <- 0.5 - h3 / 8
ab <- 3 - 2 * aa * h5
bv <- 0.13298076 * h6 * ab * pnorm(h6) - exp(-h5 / r2) * (ab + aa * r2) *
0.053051647
r1 <- r3 * x
rr <- r1 * r1
r2 <- sqrt(1 - rr)
bv1 <- w * exp(-h5 / rr) * (exp(-h3 / (1 + r2)) / r2 / h7 - 1 - aa * rr)
bvsum1 <- sum(bv1)
bv <- bv - bvsum1
if (ro > 0) {
bvfinal <- pnorm(max(h1, h2)) + bv * r3 * h7
}
if (ro <= 0) {
bvfinal <- max(0, pnorm(h1) - pnorm(h2)) - bv * r3 * h7
}
bvfinal
}
# Trivariate
ptvnorm <- function(h, r, ro) {
x <- c(0.0491008, 0.23076534, 0.5, 0.76923466, 0.95308992)
w <- c(0.018854042, 0.038088059, 0.0452707394, 0.038088059, 0.018854042)
h1 <- h[1]
h2 <- h[2]
h3 <- h[3]
r12 <- r[1]
r13 <- r[2]
r23 <- r[3]
if ((abs(r23) < abs(r12)) || (abs(r23) < abs(r13))) {
if (abs(r12) >= abs(r13)) {
hh <- h1
h1 <- h3
h3 <- h2
h2 <- hh
rr <- r23
r23 <- r12
r12 <- r13
r13 <- rr
} else {
hh <- h1
h1 <- h2
h2 <- hh
rr <- r23
r23 <- r13
r13 <- rr
}
}
rh <- c(h1, h2, h3, r12, r13, r23)
h12 <- h1 * h2
h13 <- h1 * h3
h122 <- (h1 * h1 + h2 * h2) / 2
h132 <- (h1 * h1 + h3 * h3) / 2
del1 <- 1 - r12 * r12 - r13 * r13 - r23 * r23 + 2 * r12 * r13 * r23
rr12 <- r12 * x
rr13 <- r13 * x
del <- 1 - rr12 * rr12 - rr13 * rr13 - r23 * r23 + 2 * rr12 * rr13 *
r23
fac <- sqrt(del)
rr122 <- 1 - rr12 * rr12
rr133 <- 1 - rr13 * rr13
f1 <- rr13 - r23 * rr12
f2 <- r23 - rr12 * rr13
f3 <- rr12 - r23 * rr13
hp1 <- (h3 * rr122 - h1 * f1 - h2 * f2) / fac / sqrt(rr122)
hp2 <- (h2 * rr133 - h1 * f3 - h3 * f2) / fac / sqrt(rr133)
TV <- w * exp((rr12 * h12 - h122) / rr122) / sqrt(rr122) * pnorm(hp1) *
r12 + w * exp((rr13 * h13 - h132) / rr133) / sqrt(rr133) * pnorm(hp2) *
r13
TV <- sum(TV)
rho <- matrix(c(1, r23, r23, 1), 2, 2)
p2 <- mvtnorm::pmvnorm(-Inf, c(h2, h3), c(0, 0), rho)
TV <- (TV + pnorm(h1) * p2)
TV
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.