【发布时间】:2014-12-29 17:54:47
【问题描述】:
我正在尝试为 R 中的贝叶斯回归模型编写 Gibbs 采样器,但在运行我的代码时遇到了问题。 sigma.update 函数中的 beta 似乎发生了一些事情。当我运行代码时,我收到一条错误消息,上面写着“x %*% beta 中的错误:不符合要求的参数”这是我的代码的样子:
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)
【问题讨论】:
-
欢迎来到简历!我在您的代码中添加了一些空格以使其更具可读性。另外,考虑使用
r标签,因为它是与 R 相关的问题。 -
您的错误表明您可能忘记转置某些内容 - 抱歉,我现在没有时间查看代码。
-
1)
beta.draws应该是一个两列矩阵,beta.update应该生成两个值,使用rnorm(2,...)。这将解决错误,但您仍应检查方程式和结果是否正确。 2) 提示:使用函数crossprod或tcrossprod获取X'X 或XX' 类型的矩阵乘积。 -
@javlacalle 我修复了你提到的内容,并且我能够修复我收到的错误,但现在除了 sigma.draws 和 beta.draws 中的第一个条目之外的所有输出都是 NaN .知道还有什么问题吗?再次感谢。
标签: r