Я пытаюсь закодировать пробоотборник Gibbs для байесовской модели регрессии в R, и у меня возникают проблемы с запуском моего кода. Кажется, что что-то происходит с бета-версией в функции sigma.update. Когда я запускаю код я получаю сообщение об ошибке «Ошибка при й% *% бете: без облегать аргументы» Вот то, что мой код выглядит следующим образом:R Gibbs Sampler for Bayesian Regression
x0 <- rep(1, 1000)
x1 <- rnorm(1000, 5, 7)
x <- cbind(x0, x1)
true_error <- rnorm(1000, 0, 2)
true_beta <- c(1.1, -8.2)
y <- x %*% true_beta + true_error
beta0 <- c(1, 1)
sigma0 <- 1
a <- b <- 1
burnin <- 0
thin <- 1
n <- 100
gibbs <- function(n.sims, beta.start, a, b,
y, x, burnin, thin) {
beta.draws <- matrix(NA, nrow=n.sims, ncol=1)
sigma.draws<- c()
beta.cur <- beta.start
sigma.update <- function(a,b, beta, y, x) {
1/rgamma(1, a + ((length(x))/2),
b + (1/2) %*% (t(y - x %*% beta) %*% (y - x %*% beta)))
}
beta.update <- function(x, y, sigma) {
rnorm(1, (solve(t(x) %*% x) %*% t(x) %*% y),
sigma^2 * (solve(t(x) %*%x)))
}
for (i in 1:n.sims) {
sigma.cur <- sigma.update(a, b, beta.cur, y, x)
beta.cur <- beta.update(x, y, sigma.cur)
if (i > burnin & (i - burnin) %% thin == 0) {
sigma.draws[(i - burnin)/thin ] <- sigma.cur
beta.draws[(i - burnin)/thin,] <- beta.cur
}
}
return (list(sigma.draws, beta.draws))
}
gibbs(n, beta0, a, b, y, x, burnin, thin)
Добро пожаловать CV! Я добавил несколько пробелов в свой код, чтобы сделать его более читаемым. Кроме того, рассмотрите использование тега 'r', так как это вопрос, связанный с R. – Tim
И ваша ошибка говорит о том, что вы, вероятно, забыли переставить что-то - извините, у меня нет времени на просмотр кода. – Tim
1) 'beta.draws' должен быть двухколоночной матрицей, а' beta.update' должен генерировать два значения, использовать 'rnorm (2, ...)'. Это решит ошибку, но вы все равно должны проверить правильность уравнений и результатов. 2) Совет. Используйте функции 'crossprod' или' tcrossprod' для матричных произведений вида X'X или XX '. – javlacalle