2017-06-04 113 views
0

我在網上發現這個問題。有人可以詳細解釋一下,爲什麼使用OLS更好?僅僅是因爲樣本數量不夠?另外,爲什麼不使用全部1000個樣本來估計先前的分佈?貝葉斯vs OLS

我們有1000個隨機抽樣的數據點。目標是嘗試構建一個迴歸模型,其中包含來自k個迴歸因子 變量的一個響應變量。哪個更好? 1.(貝葉斯迴歸)使用第一個 500個樣本來估計假設的先驗分佈的參數,然後使用最後的500個樣本更新 之前的後驗分佈,後驗分佈用於 最終迴歸模型。 2.(OLS迴歸)使用一個簡單的普通 最小二乘迴歸模型與所有1000個迴歸變量

回答

3

「更好」永遠是見仁見智,這在很大程度上取決於上下文。

對於頻率主義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 

...這裏是一個等效的貝葉斯迴歸,在迴歸參數和所有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 

請注意,參數估計值和標準誤差/標準偏差基本相等!

現在這裏是另一個貝葉斯迴歸,它使用前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 

有趣的是,推論與OLS結果相似,但差不多如此。這導致我懷疑用於訓練先前的500個數據點在分析中沒有像過去的500個那樣重要,並且先前實際上已經被淘汰,儘管我不確定這一點。無論如何,我想不出所有1000個數據點(以及無法提供信息的先驗)的原因,特別是因爲我懷疑500 + 500會使用前500和後500的不同方法。

或許,所有這一切的答案是:我相信OLS和1000點貝葉斯結果超過500 + 500,而OLS更簡單。

+0

非常感謝馬特! – Erin