R语言计算我的妻子是否怀孕的贝叶斯模型(3)

故上述即为对数似然函数中19%的怀孕概率值的由来,19%亦作为is_pregnant的先验值。现在我有了所有参数的先验,可以建立一个由先验函数的抽样函数了。

sample_from_prior <- function(n) {
  prior <- data.frame(mean_period = rnorm(n, 27.7, 2.4),
                      sd_period  = abs(rnorm(n, 0, 2.05)),
                      is_fertile  = rbinom(n, 1, 0.95))
  prior$is_pregnant <- rbinom(n, 1, 0.19 * prior$is_fertile)
  prior$next_period <- rnorm(n, prior$mean_period, prior$sd_period)
  prior$next_period[prior$is_pregnant == 1] <- NA
  prior
}

这里使用了一个参数(n),它输出了一个n行的数据框,每一行是基于先验数值得出的样本数据。输出结果如下:

sample_from_prior(n = 4)

##  mean_period sd_period is_fertile is_pregnant next_period
## 1          29      1.24          1          0          30
## 2          29      3.73          1          0          28
## 3          27      1.29          1          1          NA
## 4          27      0.57          0          0          27

使用重要性抽样来拟合模型

现在,我已经收集了贝叶斯统计分析的三大要素:先验信息,似然函数以及数据。为了拟合模型我有很多方法,但是这里有一个非常方便的方法——重要性抽样。我之前曾写文提及过重要性抽样法,这里我们来回顾一下:重要性抽样法是一种蒙特卡洛实验法,它建立起来非常简单并且适用于以下情况:(1)参数空间非常小(2)先验分布与后验分布的形式区别不大。因为我的参数空间比较小,加之我使用了信息量包含得比较丰富的先验数据。因此,认为重点抽样法在此例中是可用的。在重要性抽样法中三个基本的步骤为:

1. 由先验分布产生大样本(这里可以通过sample_from_prior得到)

2. 给定了参数时,对每一个与似然值成比例的先验数据进行赋权。(这里可以通过 calc_log_like 得到)

3. 将权重归一化,从而在先验分布的情况下形成了新的概率分布。最终,根据此概率分布对先验分布的样本进行重新抽样。(这里可以用R函数抽样)

( 注意存在与该过程不同的多种方法,但是在用来拟合贝叶斯模型时,这是重要性抽样法的常用版本)

因为我已经定义过 sample_from_prior 和 calc_log_like,因此需要定义一个新的方程来做后验抽样:

sample_from_posterior <- function(days_since_last_period, days_between_periods, n_samples) {
  prior <- sample_from_prior(n_samples)
  log_like <- sapply(1:n_samples, function(i) {
    calc_log_like(days_since_last_period, days_between_periods,
prior$mean_period[i], prior$sd_period[i], prior$next_period[i],
                  prior$is_fertile[i], prior$is_pregnant[i])
  })
  posterior <- prior[ sample(n_samples, replace = TRUE, prob = exp(log_like)), ]
  posterior
}

结果:怀孕的可能性

因此,在2月21日,2015,我的妻子已经没有来月经33天了。这是一个好休息吗?让我们运行这个模型看看结果吧!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8f33d7f26b0c20cd2564c41be2044754.html