贝叶斯先验在现实生活中是如何确定的?

机器算法验证 r 回归 分布 贝叶斯 事先的
2022-01-18 20:57:58

我总是有以下问题:贝叶斯先验在现实生活中是如何决定的?

我创建了以下场景来提出我的问题:假设您是研究人员,并且您有兴趣研究是否可以通过长颈鹿的体重和身高来预测长颈鹿的年龄(例如线性回归模型:age = b_o + b_1 height + b_2重量)。你到达一个国家公园来记录长颈鹿的测量值 - 但在只测量了几只长颈鹿之后,一场可怕的风暴发生了,你不得不停止你的研究。您只有时间测量 15 只长颈鹿:

     weight   height age
1  2998.958 15.26611  53
2  3002.208 18.08711  52
3  3008.171 16.70896  49
4  3002.374 17.37032  55
5  3000.658 18.04860  50
6  3002.688 17.24797  45
7  3004.923 16.45360  47
8  2987.264 16.71712  47
9  3011.332 17.76626  50
10 2983.783 18.10337  42
11 3007.167 18.18355  50
12 3007.049 18.11375  53
13 3002.656 15.49990  42
14 2986.710 16.73089  47
15 2998.286 17.12075  52

不幸的是,这些信息不足以完成您的学习。但是,您进行了一些研究,发现过去一直在对长颈鹿进行此类测量。例如:

研究 1:在 1800 年代进行了一项研究,测量了 1000 头长颈鹿,发现这些长颈鹿的平均身高为 17 英尺,平均体重为 2800 磅,平均年龄为 35 岁。但是这是在 1800 年代完成的,您对此表示怀疑那时的测量可能不那么准确,环境问题(例如偷猎)可能会导致长颈鹿的体型发生变化。

研究 2:2010 年对世界各地动物园的 50 只长颈鹿进行了一项研究,它们的身高为 16 英尺,体重为 300 磅,年龄为 50 岁。这项研究是较新的,但您怀疑动物园中的长颈鹿可能与野外的长颈鹿不同。

研究3:一位长颈鹿专家坚信长颈鹿的年龄、身高和体重呈钟形分布。专家还认为,长颈鹿一生都在不断增长,即随着年龄的增长,体重和身高也在增长。他没有任何具体数字,但他被认为是领先的专家。

等等

问题:在这个问题中,是否有可能补充您有限的测量值以及关于长颈鹿的先验知识(同时考虑到它们的可靠性)?这个问题是如何在现实生活中使用贝叶斯模型(例如贝叶斯回归)的一个例子 - 还是这个问题从根本上缺乏足够的数据来处理?

假设您查阅了几项记录了身高的研究并手动评估了这些研究的可信度(将“低权重”分配给被认为不可信的研究,例如adjusted_height =credit_score * average_recorded_height_in_study):

head(my_data)

 average_recorded_height_in_study credibility_score study_number adjusted_height
1                         13.74253         1.0000000            1       13.742525
2                         20.08053         0.3222523            2        6.470999
3                         13.25037         0.5132335            3        6.800532
4                         15.74946         0.2625349            4        4.134783
5                         11.68657         0.5966327            5        6.972592
6                         17.27276         1.0000000            6       17.272759

有许多工具/包(例如使用 R 编程语言)可以尝试探索这种“先验信息”并适合分布

library(fitdistrplus)
library(patchwork)
library(ggplot2)

 fg <- fitdist(my_data$adjusted_height, "gamma")
 fln <- fitdist(my_data$adjusted_height, "lnorm")
fg <- fitdist(my_data$adjusted_height, "gamma")
 fw <- fitdist(my_data$adjusted_height, "weibull")

 par(mfrow = c(2, 2))
 plot.legend <- c("Weibull", "lognormal", "gamma")

a <- denscomp(list(fw, fln, fg), legendtext = plot.legend, plotstyle = "ggplot")
b <- qqcomp(list(fw, fln, fg), legendtext = plot.legend, plotstyle = "ggplot")
c <- cdfcomp(list(fw, fln, fg), legendtext = plot.legend, plotstyle = "ggplot")
d <- ppcomp(list(fw, fln, fg), legendtext = plot.legend, plotstyle = "ggplot")

a+b+c+d

在此处输入图像描述

对于研究中的其他变量,可以重复上述分析。在这里,我们可以看到哪个分布最适合数据(例如使用-似然),并记录这个分布的参数估计。

这是在现实世界中如何将先验纳入贝叶斯模型的正确想法吗?在我创建的这个示例中,是否可以分析来自先前研究的信息并将其用于创建贝叶斯线性回归的先验?

谢谢

注意:假设您测量的 15 只长颈鹿恰好是患病的长颈鹿,并且它们的身高/体重测量值不能代表一般的长颈鹿种群 - 但也许先验中编码的信息代表了广泛的长颈鹿。因此,将您的测量结果与先验信息相结合可能会产生一个更现实的模型,该模型可以推广到更大的长颈鹿种群(此时您不知道这一事实)。

2个回答

有两种方法可以解决这个问题。首先,使用相关的过去数据以某种方式“自动”创建先验(或以某种方式将这些相关数据包含到我们的新数据的单个模型中)。这个选项通常被认为是有吸引力的,因为它“对它有一定的客观性”。其次,询问专家(在向他们展示他们可能需要记住的任何相关数据之后)。最后,但可能不太相关,可以选择使用弱信息先验(或试图不提供信息的先验)。

在第一类方法中,Schmidli 等人的(稳健的)元分析预测(MAP)先验。已经被提及并且经常使用 - 特别是在添加了额外弱/无信息混合组件的稳健版本中 - 但有各种变体,替代方案,如自适应功率先验,将单个模型拟合到旧模型和新模型的想法以一种对先前数据冲突和其他类似想法具有鲁棒性的方式获取数据。

在第二类方法中,有很多方法可以从专家那里获得先前的意见,以最大限度地减少人们(包括专家)受到的偏见(= “专家启发”)。一个这样的框架是SHELF,你可以在他们的网页上找到整个课程,并且还有一个R 包我特别提到了一个,因为我在实践中使用它,但还有其他具有不同风格/哲学的。

这里有一些在实践中设置的先验示例,主要用于临床试验/药物开发(仅仅是因为我在那里最熟悉它——更多示例请参见本书):对于COPD 中的概念验证研究,用于类风湿性关节炎的概念证明另一个也用于 RA),用于历史数据中的指数风险,用于临床试验中的治疗效果以及用于预测事件发生率和计数结果的离散参数. 在制药行业,使用先验信息和专家知识在临床开发早期分析研究(例如概念验证研究分析和决定是否继续进行)或后期决策时尤其常见,而验证性研究则很少见这旨在支持监管部门的批准(部分原因是,在进行内部决策时,过度乐观的先验对公司来说更成问题,而监管机构则对选择用于验证性研究的先验进行更严格的审查)。

在这里,只是想添加一些补充材料并演示以下内容:使用 R的频率回归贝叶斯回归之间的比较

#cool trick to directly bring this data into R

my_data <- data.frame(read.table(header=TRUE,
row.names = 1,
text="
                         weight   height age
                      1  2998.958 15.26611  53
                      2  3002.208 18.08711  52
                      3  3008.171 16.70896  49
                      4  3002.374 17.37032  55
                      5  3000.658 18.04860  50
                      6  3002.688 17.24797  45
                      7  3004.923 16.45360  47
                      8  2987.264 16.71712  47
                      9  3011.332 17.76626  50
                      10 2983.783 18.10337  42
                      11 3007.167 18.18355  50
                      12 3007.049 18.11375  53
                      13 3002.656 15.49990  42
                      14 2986.710 16.73089  47
                      15 2998.286 17.12075  52
"))
  1. 频率回归:这就是频率回归模型(即使用普通最小二乘法 (OLS) 估计参数的回归模型——我们在学校都学过的)。

首先,拟合回归模型:

#fit regression model

model_1 <- lm(age ~ weight + height, data = my_data)

接下来,查看结果:

#view results

 summary(model_1)

Call:
lm(formula = age ~ weight + height, data = my_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.2369 -1.8688  0.3864  2.1065  5.6170 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept) -525.2843   369.9144  -1.420    0.181
weight         0.1875     0.1238   1.515    0.156
height         0.6871     1.0859   0.633    0.539

Residual standard error: 3.796 on 12 degrees of freedom
Multiple R-squared:  0.1954,    Adjusted R-squared:  0.06135 
F-statistic: 1.457 on 2 and 12 DF,  p-value: 0.2712

可选:可视化结果

library(scatterplot3d)

s3d <- scatterplot3d(my_data$weight, my_data$height,my_data$age, pch = 19, type = c("p"), color = "darkgrey",
                     main = "Regression Plane", grid = TRUE, box = FALSE,  
                     mar = c(2.5, 2.5, 2, 1.5), angle = 55)



# regression plane
s3d$plane3d(model_1, draw_polygon = TRUE, draw_lines = TRUE, 
            polygon_args = list(col = rgb(.1, .2, .7, .5)))

# overlay positive residuals
wh <- resid(model_1) > 0
s3d$points3d(my_data$height, my_data$weight, my_data$age, pch = 19)

在此处输入图像描述

2)贝叶斯回归:现在,我们尝试将贝叶斯回归模型拟合到相同的数据:

#load library

library(rstanarm)
library(see)
library(bayestestR)
library(performance)

首先,我们指定身高和体重变量的先验(我为它们选择了一个正态分布 - 在我最初的问题中,我们会通过使用其他生物学家对长颈鹿所做的研究来决定这些先验):

#specify priors
my_prior <- normal(location = c(3000, 17), scale = c(1, 2))

接下来,我们运行贝叶斯回归模型

#run bayesian regression model
model_2 <- stan_glm(age~., data=my_data, prior = my_prior,    seed=111)

现在,我们可以查看结果:

 summary(model_2)

Model Info:
 function:     stan_glm
 family:       gaussian [identity]
 formula:      age ~ .
 algorithm:    sampling
 sample:       4000 (posterior sample size)
 priors:       see help('prior_summary')
 observations: 15
 predictors:   3

Estimates:
              mean       sd         10%        50%        90%     
(Intercept) -9000290.7     3116.3 -9004290.9 -9000230.6 -8996293.9
weight          2999.7        1.0     2998.4     2999.7     3001.1
height            17.0        2.0       14.4       17.0       19.6
sigma           3207.5       65.0     3124.2     3207.2     3291.0

Fit Diagnostics:
           mean    sd      10%     50%     90%  
mean_PPD    55.5   824.4 -1002.3    66.1  1107.1

看模型表现:

#model performance 

 performance(model_2)

# Indices of model performance

ELPD     | ELPD_SE |    LOOIC | LOOIC_SE |     WAIC |    R2 | R2 (adj.) |      RMSE |    Sigma
----------------------------------------------------------------------------------------------
-574.459 | 154.366 | 1148.918 |  308.733 | 1160.324 | 0.983 |    -1.000 | 23876.735 | 3207.163
> se <- sqrt(diag(vcov(model_2)))
> se
    (Intercept)      weight      height 
3116.342642    1.038384    2.040471 

可选:可视化结果

#MCMC Trace

x <- as.array(model_2, pars = c("(Intercept)", "height", "weight"))
bayesplot::mcmc_trace(x, facet_args = list(nrow = 2))

在此处输入图像描述

#Posterior Distributions

plot_title <- ggplot2::ggtitle("Posterior Distributions")
plot(model_2, "hist", "weight", "height") + plot_title

在此处输入图像描述

#confidence ellipse
bayesplot::color_scheme_set("green")
plot(model_2, "scatter", pars = c("height", "weight"),
     size = 3, alpha = 0.5) +
    ggplot2::stat_ellipse(level = 0.9) 

在此处输入图像描述

参考资料

注意:我仍在学习贝叶斯回归——请纠正我可能犯的任何错误(例如,由于我选择先验,贝叶斯回归模型的性能似乎比线性回归模型差得多?当我运行具有默认先验(“弱信息先验”)的贝叶斯回归模型,例如model_2 <- stan_glm(age~., data=my_data, seed=111)- 贝叶斯线性回归的结果与线性回归模型相当。我一定做错了什么?)。

谢谢!