Skip to content

Instantly share code, notes, and snippets.

@stephensrmmartin
Created January 30, 2019 21:24
Show Gist options
  • Save stephensrmmartin/afb557a82ac1ca57ef9903145029d914 to your computer and use it in GitHub Desktop.
Save stephensrmmartin/afb557a82ac1ca57ef9903145029d914 to your computer and use it in GitHub Desktop.
functions {
real matrix_f_lpdf(matrix cov, real nu, real delta){
int k = cols(cov);
return(lmgamma(k, (nu + delta + k - 1)/2) - (lmgamma(k, nu/2) + lmgamma(k, (delta + k - 1)/2) + log(1)) + log_determinant(cov)*((nu -k - 1)/2) - (nu + delta + k - 1)/2 * log_determinant(cov + diag_matrix(rep_vector(1, k))));
}
real matrix_f_fast_lpdf(matrix cov, real nu, real delta){
int k = cols(cov);
real log_det_cov = 2*sum(log(diagonal(cholesky_decompose(cov))));
real I_Sig_log_det = 2*sum(log(diagonal(cholesky_decompose(diag_matrix(rep_vector(1,k)) + cov))));
return(log_det_cov*(nu - k - 1)/2 - I_Sig_log_det*(nu + delta + k - 1)/2);
}
real matrix_f_fast_cholesky_lpdf(matrix L, real nu, real delta){
int k = cols(L);
vector[k] L_diag = diagonal(L);
real log_det_cov = 2*sum(log(L_diag));
real log_jac = k*log(2);
real I_Sig_log_det;
for(i in 1:k){
log_jac += (k - i + 1)*log(L_diag[i]);
}
I_Sig_log_det = 2*sum(log(diagonal(cholesky_decompose(diag_matrix(rep_vector(1,k)) + multiply_lower_tri_self_transpose(L)))));
return(log_jac + log_det_cov*((nu - k - 1)/2) - ((nu + delta + k - 1)/2)*I_Sig_log_det);
}
real matrix_f_B_fast_cholesky_lpdf(matrix L, real nu, real delta,real B){
int k = cols(L);
vector[k] L_diag = diagonal(L);
real log_det_cov = 2*sum(log(L_diag));
real log_jac = k*log(2);
matrix[k,k] BmatInv = diag_matrix(rep_vector(1/B,k));
real I_Sig_log_det;
for(i in 1:k){
log_jac += (k - i + 1)*log(L_diag[i]);
}
I_Sig_log_det = 2*sum(log(diagonal(cholesky_decompose(diag_matrix(rep_vector(1,k)) + multiply_lower_tri_self_transpose(L)*BmatInv))));
return(log_jac + log_det_cov*((nu - k - 1)/2) - ((nu + delta + k - 1)/2)*I_Sig_log_det);
}
matrix cov_to_cor(matrix cov){
int k = cols(cov);
vector[k] sds = 1. ./ sqrt(diagonal(cov));
return(quad_form_diag(cov,sds));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment