update_Sigma function

Update error term covariance matrix of multiple linear regression

Update error term covariance matrix of multiple linear regression

This function updates the error term covariance matrix of a multiple linear regression.

update_Sigma(kappa, E, N, S)

Arguments

  • kappa: The degrees of freedom (a natural number greater than J-1) of the Inverse Wishart prior for Sigma. Per default, kappa = J + 1.
  • E: The scale matrix of dimension J-1 x J-1 of the Inverse Wishart prior for Sigma. Per default, E = diag(J - 1).
  • N: The draw size.
  • S: A matrix, the sum over the outer products of the residuals (ϵn)n=1,,N(\epsilon_n)_{n=1,\dots,N}.

Returns

A matrix, a draw from the Inverse Wishart posterior distribution of the error term covariance matrix in a multiple linear regression.

Details

This function draws from the posterior distribution of the covariance matrix Σ\Sigma in the linear utility equation

Un=Xnβ+ϵn, U_n = X_n\beta + \epsilon_n,

where UnU_n is the (latent, but here assumed to be known) utility vector of decider n=1,,Nn = 1,\dots,N, XnX_n

is the design matrix build from the choice characteristics faced by nn, β\beta is the coefficient vector, and ϵn\epsilon_n is the error term assumed to be normally distributed with mean 00 and unknown covariance matrix Σ\Sigma. A priori we assume the (conjugate) Inverse Wishart distribution

ΣW(κ,E) \Sigma \sim W(\kappa,E)

with κ\kappa degrees of freedom and scale matrix EE. The posterior for Σ\Sigma is the Inverted Wishart distribution with κ+N\kappa + N degrees of freedom and scale matrix E1+SE^{-1}+S, where S=n=1NϵnϵnS = \sum_{n=1}^{N} \epsilon_n \epsilon_n' is the sum over the outer products of the residuals (ϵn=UnXnβ)n(\epsilon_n = U_n - X_n\beta)_n.

Examples

### true error term covariance matrix (Sigma_true <- matrix(c(1,0.5,0.2,0.5,1,0.2,0.2,0.2,2), ncol=3)) ### coefficient vector beta <- matrix(c(-1,1), ncol=1) ### draw data N <- 100 X <- replicate(N, matrix(rnorm(6), ncol=2), simplify = FALSE) eps <- replicate(N, rmvnorm(mu = c(0,0,0), Sigma = Sigma_true), simplify = FALSE) U <- mapply(function(X, eps) X %*% beta + eps, X, eps, SIMPLIFY = FALSE) ### prior parameters for covariance matrix kappa <- 4 E <- diag(3) ### draw from posterior of coefficient vector outer_prod <- function(X, U) (U - X %*% beta) %*% t(U - X %*% beta) S <- Reduce(`+`, mapply(outer_prod, X, U, SIMPLIFY = FALSE)) Sigma_draws <- replicate(100, update_Sigma(kappa, E, N, S)) apply(Sigma_draws, 1:2, mean) apply(Sigma_draws, 1:2, stats::sd)