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.
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 Σ in the linear utility equation
Un=Xnβ+ϵn,
where Un is the (latent, but here assumed to be known) utility vector of decider n=1,…,N, Xn
is the design matrix build from the choice characteristics faced by n, β is the coefficient vector, and ϵn is the error term assumed to be normally distributed with mean 0 and unknown covariance matrix Σ. A priori we assume the (conjugate) Inverse Wishart distribution
Σ∼W(κ,E)
with κ degrees of freedom and scale matrix E. The posterior for Σ is the Inverted Wishart distribution with κ+N degrees of freedom and scale matrix E−1+S, where S=∑n=1Nϵnϵn′ is the sum over the outer products of the residuals (ϵn=Un−Xnβ)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 vectorbeta <- matrix(c(-1,1), ncol=1)### draw dataN <-100X <- 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 matrixkappa <-4E <- diag(3)### draw from posterior of coefficient vectorouter_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)