贝叶斯与 OLS

Eri*_*rin 2 machine-learning bayesian linear-regression

我在网上找到了这个问题。有人可以详细解释一下,为什么使用OLS更好?仅仅是因为样本数量不够吗?另外,为什么不使用所有 1000 个样本来估计先验分布?

我们有 1000 个随机采样的数据点。目标是尝试使用来自 k 个回归变量的一个响应变量来构建回归模型。哪个更好?1.(贝叶斯回归)使用前 500 个样本估计假设先验分布的参数,然后使用最后 500 个样本更新后验分布的先验,后验估计将用于最终回归模型。2. (OLS Regression) 使用一个简单的普通最小二乘回归模型和所有 1000 个回归变量

Mat*_*ers 7

“更好”总是一个见仁见智的问题,它在很大程度上取决于上下文。

常客 OLS 方法的优点:更简单、更快、更容易被更广泛的受众访问(因此解释更少)。我的一位聪明的教授曾经说过:“当苍蝇拍可以做到这一点时,你不需要建造原子粉碎机。”

等效贝叶斯方法的优点:更灵活地进一步开发模型,可以直接对导出/计算量的后验建模(还有更多,但这些是我对给定分析进行贝叶斯分析的动机)。注意“等效”这个词——有些事情你可以在贝叶斯框架中做,而在常客方法中却做不到。

嘿,这是对 R 的探索,首先模拟数据,然后使用典型的 OLS 方法。

N <- 1000
x <- 1:N
epsilon <- rnorm(N, 0, 1)
y <- x + epsilon

summary(lm(y ~ x))
## 
## Call:
## lm(formula = y ~ x)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.9053 -0.6723  0.0116  0.6937  3.7880 
## 
## Coefficients:
##              Estimate Std. Error  t value Pr(>|t|)    
## (Intercept) 0.0573955  0.0641910    0.894    0.371    
## x           0.9999997  0.0001111 9000.996   <2e-16 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
## 
## Residual standard error: 1.014 on 998 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 8.102e+07 on 1 and 998 DF,  p-value: < 2.2e-16
Run Code Online (Sandbox Code Playgroud)

...这是一个等效的贝叶斯回归,在回归参数和所有 1000 个数据点上使用非信息先验。

library(R2jags)
cat('model {
  for (i in 1:N){
    y[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- a + b * x[i]
  }
  a ~ dnorm(0, .0001)
  b ~ dnorm(0, .0001)
  tau <- pow(sigma, -2)
  sigma ~ dunif(0, 100)
}', file="test.jags")

test.data <- list(x=x,y=y,N=1000)
test.jags.out <- jags(model.file="test.jags", data=test.data, 
                  parameters.to.save=c("a","b","tau","sigma"), n.chains=3, n.iter=10000)
test.jags.out$BUGSoutput$mean$a
## [1] 0.05842661
test.jags.out$BUGSoutput$sd$a
## [1] 0.06606705
test.jags.out$BUGSoutput$mean$b
## [1] 0.9999976
test.jags.out$BUGSoutput$sd$b
## [1] 0.0001122533
Run Code Online (Sandbox Code Playgroud)

请注意,参数估计和标准误差/标准偏差本质上是等效的!

现在这是另一个贝叶斯回归,使用前 500 个数据点来估计先验,然后使用最后 500 个数据点来估计后验。

test.data <- list(x=x[1:500],y=y[1:500],N=500)
test.jags.out <- jags(model.file="test.jags", data=test.data, 
                  parameters.to.save=c("a","b","tau","sigma"), n.chains=3, n.iter=10000)

cat('model {
  for (i in 1:N){
    y[i] ~ dnorm(y.hat[i], tau)
    y.hat[i] <- a + b * x[i]
  }
  a ~ dnorm(a_mn, a_prec)
  b ~ dnorm(b_mn, b_prec)
  a_prec <- pow(a_sd, -2)
  b_prec <- pow(b_sd, -2)
  tau <- pow(sigma, -2)
  sigma ~ dunif(0, 100)
}', file="test.jags1")

test.data1 <- list(x=x[501:1000],y=y[501:1000],N=500,
                   a_mn=test.jags.out$BUGSoutput$mean$a,a_sd=test.jags.out$BUGSoutput$sd$a,
                   b_mn=test.jags.out$BUGSoutput$mean$b,b_sd=test.jags.out$BUGSoutput$sd$b)
test.jags.out1 <- jags(model.file="test.jags1", data=test.data1, 
                  parameters.to.save=c("a","b","tau","sigma"), n.chains=3, n.iter=10000)

test.jags.out1$BUGSoutput$mean$a
## [1] 0.01491162
test.jags.out1$BUGSoutput$sd$a
## [1] 0.08513474
test.jags.out1$BUGSoutput$mean$b
## [1] 1.000054
test.jags.out1$BUGSoutput$sd$b
## [1] 0.0001201778
Run Code Online (Sandbox Code Playgroud)

有趣的是,推论与 OLS 结果相似,但几乎没有那么多。这让我怀疑用于训练先验的 500 个数据点在分析中的权重不如最后 500 个,而且先验实际上已经被淘汰了,尽管我不确定这一点。

无论如何,我想不出不使用所有 1000 个数据点(和非信息先验)的理由,特别是因为我怀疑 500+500 使用前 500 个和后 500 个不同。

所以也许,所有这一切的答案是:与 500+500 相比,我更相信 OLS 和 1000 点贝叶斯结果,并且 OLS 更简单。