R의 베이지안 회귀 모델 용 깁스 샘플러를 코딩하려고하는데 코드 실행에 문제가 있습니다. sigma.update 함수에서 베타 버전이 계속 진행되고있는 것 같습니다. 나는이 코드를 실행하면 나는 말한다 오류 얻을 "의 X %의 *의 %의 베타 오류 : 비 정합 인수"여기처럼 내 코드는 모습입니다 : 그것은 NaN
을 반환R 깁스 샘플러 for 베이지안 회귀
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'는 2 열의 행렬이어야하고'beta.update'는'rnorm (2, ...)'를 사용하여 두 개의 값을 생성해야합니다. 이렇게하면 오류가 해결되지만 방정식과 결과가 올바른지 계속 확인해야합니다. 2) 팁 : X'X 또는 XX '종류의 행렬 곱에 crossprod 또는 tcrossprod 함수를 사용하십시오. – javlacalle