Многомерный нормальный наклон в стандартном выражении

Я пытаюсь оценить байесовскую иерархическую модель в Rstan и хотел бы включить в свою модель многомерное косое нормальное распределение. Это не дистрибутив, который уже определен в Stan, но в документации, кажется, предполагается, что его можно реализовать, используя факторы Холецкого. Например, в документации Stan 2.15.0 на стр. 333–334 говорится:

«Эта повторная параметризация многомерного нормального распределения в терминах стандартных нормальных переменных может быть распространена на другие многомерные распределения, которые могут быть концептуализированы как примеси многомерного нормального, такие как многомерное t Стьюдента и косое многомерное нормальное распределение».

Кто-нибудь знает, как это сделать? Я сам рассматривал возможность реализации косой многомерной нормали в Stan, но не похоже, что есть хорошая закрытая форма для распределения, которая поддалась бы простой реализации ...


person araspion    schedule 09.05.2017    source источник
comment
У меня нет кода Stan, но это может помочь: anstuocmath.ro/mat Mathematics/pdf10 /83_96_RVernic.pdf.   -  person Bob Carpenter    schedule 09.05.2017


Ответы (1)


Итак, в пакете sn есть функция rmsn, которая ясно показывает следующий фрагмент кода:

function (n = 1, xi = rep(0, length(alpha)), Omega, alpha, tau = 0, dp = NULL) {
//....
    lot <- dp2cpMv(dp = dp0, family = "SN", aux = TRUE)
    d <- length(dp0$alpha)
    y <- matrix(rnorm(n * d), n, d) %*% chol(lot$aux$Psi)
//....
}

Это очень похоже на то, как работает mvtnorm::rmvn, только матрица в методе chol() берется из функции dp2cpMv в основной библиотеке здесь. Вы можете перенести это в свой functions{} блок. И в вашей программе stan вы идете (я предполагаю, что матрица cov в chol() является параметром)

functions {
     // Contains code for your ported cholesky factor
}
transformed parameters {
    matrix[K, J] z;
    cholesky_factor_corr[K] L_tri = dp2cvClone(...); // Cholesky factor from your function{} block..
    beta = foo + (L_tri * z)'; // Assuming foo is baseline parameter representing the mean of dimensionality J*K. 
....
}

parameters {
    matrix[K, J] beta; //# J levels/groups and K dimensional parameters 
    to_vector(z) ~ normal_pdf(0, 1); 
    .... 
}

Также вы можете захотеть перенести материал из блока преобразованных параметров в блок данных или преобразованный блок данных, если входные данные для dp2cvClone() являются данными. Но вы поняли. Этот последний раздел кода взят из стандартного руководства section 8.15 и перефразирован для краткости, и надеется зафиксировать важные части, необходимые для его работы.

person Sid    schedule 10.05.2017