data("cars")
### fit unconditional bivariate distribution of speed and distance to stop
## fit unconditional marginal transformation models
m_speed <- BoxCox(speed ~ 1, data = cars, support = ss <- c(4, 25),
add = c(-5, 5))
m_dist <- BoxCox(dist ~ 1, data = cars, support = sd <- c(0, 120),
add = c(-5, 5))
## fit multivariate unconditional transformation model
m_speed_dist <- Mmlt(m_speed, m_dist, formula = ~ 1, data = cars)
## log-likelihood
logLik(m_speed_dist)
sum(predict(m_speed_dist, newdata = cars, type = "density", log = TRUE))
## Wald test of independence of speed and dist (the "dist.speed.(Intercept)"
## coefficient)
summary(m_speed_dist)
## LR test comparing to independence model
LR <- 2 * (logLik(m_speed_dist) - logLik(m_speed) - logLik(m_dist))
pchisq(LR, df = 1, lower.tail = FALSE)
## constrain lambda to zero and fit independence model
## => log-likelihood is the sum of the marginal log-likelihoods
mI <- Mmlt(m_speed, m_dist, formula = ~1, data = cars,
fixed = c("dist.speed.(Intercept)" = 0))
logLik(m_speed) + logLik(m_dist)
logLik(mI)
## linear correlation, ie Pearson correlation of speed and dist after
## transformation to bivariate normality
(r <- coef(m_speed_dist, type = "Corr"))
## Spearman's rho (rank correlation) of speed and dist on original scale
(rs <- coef(m_speed_dist, type = "Spearman"))
## evaluate joint and marginal densities (needs to be more user-friendly)
nd <- expand.grid(c(nd_s <- mkgrid(m_speed, 100), nd_d <- mkgrid(m_dist, 100)))
nd$d <- predict(m_speed_dist, newdata = nd, type = "density")
## compute marginal densities
nd_s <- as.data.frame(nd_s)
nd_s$d <- predict(m_speed_dist, newdata = nd_s, margins = 1L,
type = "density")
nd_d <- as.data.frame(nd_d)
nd_d$d <- predict(m_speed_dist, newdata = nd_d, margins = 2L,
type = "density")
## plot bivariate and marginal distribution
col1 <- rgb(.1, .1, .1, .9)
col2 <- rgb(.1, .1, .1, .5)
w <- c(.8, .2)
layout(matrix(c(2, 1, 4, 3), nrow = 2), width = w, height = rev(w))
par(mai = c(1, 1, 0, 0) * par("mai"))
sp <- unique(nd$speed)
di <- unique(nd$dist)
d <- matrix(nd$d, nrow = length(sp))
contour(sp, di, d, xlab = "Speed (in mph)", ylab = "Distance (in ft)", xlim = ss, ylim = sd,
col = col1)
points(cars$speed, cars$dist, pch = 19, col = col2)
mai <- par("mai")
par(mai = c(0, 1, 0, 1) * mai)
plot(d ~ speed, data = nd_s, xlim = ss, type = "n", axes = FALSE,
xlab = "", ylab = "")
polygon(nd_s$speed, nd_s$d, col = col2, border = FALSE)
par(mai = c(1, 0, 1, 0) * mai)
plot(dist ~ d, data = nd_d, ylim = sd, type = "n", axes = FALSE,
xlab = "", ylab = "")
polygon(nd_d$d, nd_d$dist, col = col2, border = FALSE)
### NOTE: marginal densities are NOT normal, nor is the joint
### distribution. The non-normal shape comes from the data-driven
### transformation of both variables to joint normality in this model.
Run the code above in your browser using DataLab