我正在使用贝叶斯推理做类作业。为此,我使用了 MCMCregress 中的 MCMCpack 函数。当我想获得残差时,问题就出现了,因为函数没有提供残差,所以我必须“手动”计算它们(在 R 中)。

我的模型是:

Model <- MCMCregress(Y~X1+X2+X3+X4+X5, data=DATA)

其中 X1X5 是连续的,而 X2X3X4 是二分的。模型输出为我提供了每个变量的估计值:
(Intercept) = 1.90,
X1 = -0.02,
X2 = -0.05,
X3 = 0.32,
X4 = 0.61,
X5 = -0.003,
sigma2 = 0.54

我想我必须这样:
1.90 - 0.02*X1 - 0.05*X2 + 0.32*X3 ...

但我知道我在 R 代码中遗漏了一些重要的东西,所以我想知道哪个是正确的 R 代码以获得残差。

这是一个可重现的示例(尽管它与原始数据不对应):
Y  <- c(0.2,0.8,1,4.3,5,3.5,3.2,1,3.3,1,2,4,3.6,3,5,4.3,3.2,4,1,2)
X1 <- c(17,13,15,NA,12,24,15,NA,12,22,14,12,18,NA,10,13,12,11,26,10)
X2 <- c(0,0,0,1,0,0,1,1,1,1,0,1,0,0,0,0,0,1,NA,NA)
X3 <- c(0,0,1,1,1,0,1,0,0,0,0,1,0,NA,0,NA,NA,0,1,0)
X4 <- c(1,0,1,0,0,1,0,0,NA,0,NA,NA,0,0,1,0,1,1,0,1)
X5 <- c(2.46,4.56,32.1,NA,NA,NA,NA,NA,NA,3.76,5.67,4.56,NA,
        17.32,12.2,4.56,7.2,1.2,NA,9.2)

X2 <- ifelse(X2 > 0, c("Yes"), c("No"))
X3 <- ifelse(X3 > 0, c("Yes"), c("No"))
X4 <- ifelse(X4 > 0, c("Yes"), c("No"))

DATA <- data.frame(Y,X1,X2,X3,X4,X5)


library(MCMCpack)
MCMC <- MCMCregress(Y~X1+X2+X3+X4+X5, data=DATA)
summary(MCMC)

我怎样才能得到残差?

最佳答案

我发现 MCMC 链在接近尾声时发生了一些可怕的事情
运行 - 检查 xyplot(MCMC,layout=c(2,4)) 。我不知道什么
问题是,你必须解决这个问题,但与此同时,我
将使用中位数而不是平均值作为系数估计值。

coefs <- apply(MCMC,2,median)[1:6]
X <- model.matrix(~X1+X2+X3+X4+X5, data=DATA)
pred0 <- X %*% coefs

最复杂的部分是处理 NA 值:这是内置的
大多数现有的残差()方法......
pred <- napredict(attr(na.exclude(DATA),"na.action"),pred0)
resids <- pred-DATA$Y

请注意,在这种情况下,删除 NA 值后,您将 5 参数回归模型拟合到 6 个完整观测值。您可能必须通过估算做一些明智的事情才能获得任何合理的答案......

关于r - 如何从 MCMCregress 计算模型残差,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24983533/

10-12 17:34