View source: R/directional_tail.R
| directional_tail | R Documentation |
Computes the directional tail probability based on posterior draws and prior mean, using whitening transformation and projection onto the direction of disagreement. This diagnostic identifies directional disagreement between posterior and prior, and is especially useful for visualizing rejection regions in whitened space. The whitening uses Mahalanobis distance \insertCiteMahalanobis1936glmbayes in posterior-precision-scaled coordinates.
directional_tail(fit, mu0 = NULL)
## S3 method for class 'directional_tail'
print(x, ...)
fit |
A fitted model object of class 'glmb' or 'lmb' |
mu0 |
An optional argument containing a reference vector relative to which the directional tail is computed. Defaults to the prior mean. |
x |
An object of class |
... |
Additional arguments passed to or from other methods. |
Whitening is performed using the posterior precision matrix. The direction vector is computed as the mean shift in whitened space. Tail probability is the proportion of draws with negative projection onto this direction. For theory, interpretation, and relation to t/F statistics, see \insertCiteglmbayesChapterA04glmbayes.
An object of class 'directional_tail' containing:
mahalanobis_shift |
Measures the standardized Mahalanobis distance between the posterior and prior means, using posterior precision for scaling. In the Gaussian case, this directly determines the directional tail probability via Phi(-||w||). |
p_directional |
Directional tail probability (proportion of draws in the direction of disagreement) |
delta |
Mean shift in whitened space |
draws |
List containing whitened draws, raw draws, and tail flags |
summary.glmb, anova.glmb
## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
ctl <- c(4.17, 5.58, 5.18, 6.11, 4.50, 4.61, 5.17, 4.53, 5.33, 5.14)
trt <- c(4.81, 4.17, 4.41, 3.59, 5.87, 3.83, 6.03, 4.89, 4.32, 4.69)
group <- gl(2, 10, 20, labels = c("Ctl", "Trt"))
weight <- c(ctl, trt)
dat <- data.frame(weight, group)
dat2 <- rbind(dat)
lm.D9_null <- lm(weight ~ 1, data = dat2)
summary(lm.D9_null)
lm.D9_default <- lm(weight ~ group, data = dat2)
summary(lm.D9_default)
ps_null <- Prior_Setup(
weight ~ group,
family = gaussian(),
pwt = 0.01,
intercept_source = "null_model",
effects_source = "null_effects",
data = dat2
)
mu_null <- ps_null$mu
V_null <- ps_null$Sigma
disp_ML_null <- ps_null$dispersion
lmb.D9_null <- lmb(
weight ~ group,
dNormal(mu_null, V_null, dispersion = disp_ML_null),
data = dat2,
n = 10000
)
summary(lmb.D9_null)
glmb.D9_default <- glmb(
weight ~ group,
family = gaussian(),
pfamily = dNormal(mu_null, V_null, dispersion = disp_ML_null),
data = dat2
)
summary(glmb.D9_default)
colMeans(residuals(lmb.D9_null))
glm.D9_default <- glm(weight ~ group, family = gaussian(), data = dat2)
summary(glm.D9_default)
disp_D9_default <- summary(glm.D9_default)$dispersion
solve(vcov(lmb.D9_null$lm))
t(lmb.D9_null$lm$x) %*% lmb.D9_null$lm$x / disp_D9_default
t(lmb.D9_null$lm$x) %*% lmb.D9_null$lm$x * (20 / 18)
tailprobs <- directional_tail(lmb.D9_null)
tailprobs
summary(lm.D9_null)
summary(lm.D9_null)$sigma^2
tailprobs$Prec_lik * summary(lm.D9_null)$sigma^2
t(lmb.D9_null$x) %*% lmb.D9_null$x
tailprobs$p_directional
##########################################
Z <- tailprobs$draws$Z
flag <- tailprobs$draws$is_tail
delta <- tailprobs$delta
w <- tailprobs$delta
asp <- 1
## Plot posterior draws in whitened space
plot(
Z,
col = ifelse(flag, "red", "blue"),
pch = 19,
xlab = "Z1",
ylab = "Z2",
main = "Directional Tail Diagnostic"
)
abline(a = 0, b = -w[1] / w[2], col = "darkgreen", lty = 2)
## Add radius boundary centered at posterior mode (delta)
r <- sqrt(sum(delta^2))
symbols(
delta[1], delta[2],
circles = r,
inches = FALSE,
add = TRUE,
lwd = 2,
fg = "gray"
)
## Add prior mean at origin
points(0, 0, pch = 4, col = "black", lwd = 2)
## Add posterior mode at delta
points(delta[1], delta[2], pch = 3, col = "purple", lwd = 2)
## Add legend
legend(
"topright",
legend = c(
"Tail draws", "Non-tail draws", "Direction vector",
"Radius boundary", "Prior mean", "Posterior mode"
),
col = c("red", "blue", "darkgreen", "gray", "black", "purple"),
pch = c(19, 19, NA, NA, 4, 3),
lty = c(NA, NA, 1, 1, NA, NA),
lwd = c(NA, NA, 2, 2, 2, 2),
bty = "n"
)
############################ Original Scales ###################
B <- tailprobs$draws$B
flag <- tailprobs$draws$is_tail
mu0 <- as.numeric(lmb.D9_null$Prior$mean)
mu_post <- colMeans(B)
x_range <- range(B[, 1]) # Intercept values
padding <- diff(x_range) * 0.1 # 10% margin
oldpar <- par(no.readonly = TRUE)
par(mar = c(5, 6, 4, 2)) # bottom, left, top, right
plot(
B,
col = ifelse(flag, "red", "blue"),
pch = 19,
xlab = "Intercept",
ylab = "groupTrt",
xlim = c(x_range[1] - padding, x_range[2] + padding),
main = "Directional Tail Diagnostic (Raw Space)"
)
points(mu0[1], mu0[2], pch = 4, col = "black", cex = 1.5) # Prior mean
points(mu_post[1], mu_post[2], pch = 3, col = "darkgreen", cex = 1.5) # Posterior mean
legend(
"topright",
legend = c("Tail draws", "Non-tail draws", "Prior", "Posterior"),
col = c("red", "blue", "black", "darkgreen"),
pch = c(19, 19, 4, 3)
)
par(oldpar)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.