Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
rstanarm用于二项实验的贝叶斯层次建模_R_Logistic Regression_Bayesian_Rstan_Rstanarm - Fatal编程技术网

rstanarm用于二项实验的贝叶斯层次建模

rstanarm用于二项实验的贝叶斯层次建模,r,logistic-regression,bayesian,rstan,rstanarm,R,Logistic Regression,Bayesian,Rstan,Rstanarm,假设有三个按时间顺序进行的二项式实验。对于每个实验,我都知道试验的,以及成功的。为了在第三个实验中使用前两个旧实验,我想“在两个旧实验中拟合贝叶斯层次模型,并在第三个实验中使用后验形式” 考虑到我的可用数据(如下),我的问题是:下面我的rstanarm代码是否捕获了我上面描述的内容 Study1_trial = 70 Study1_succs = 27 #================== Study2_trial = 84 Study2_succs = 31 #===============

假设有三个按时间顺序进行的二项式实验。对于每个实验,我都知道试验的,以及成功的。为了在第三个实验中使用前两个旧实验,我想“在两个旧实验中拟合贝叶斯层次模型,并在第三个实验中使用后验形式”

考虑到我的可用数据(如下),我的问题是:下面我的
rstanarm
代码是否捕获了我上面描述的内容

Study1_trial = 70
Study1_succs = 27
#==================
Study2_trial = 84
Study2_succs = 31
#==================
Study3_trial = 100
Study3_succs = 55
我在package
rstanarm
中尝试的内容:

library("rstanarm")

data <- data.frame(n = c(70, 84, 100), y = c(27, 31, 55));
mod <- stan_glm(cbind(y, n - y) ~ 1, prior = NULL, data = data, family = binomial(link = 'logit'))   

## can I use a beta(1.2, 1.2) as prior for the first experiment?
库(“rstanarm”)

数据TL;DR:如果你直接预测成功概率,那么模型将是一个贝努利似然模型,参数θ(成功概率)的值可能在0到1之间。在这种情况下,可以对θ使用Beta-prior。但是,使用逻辑回归模型,您实际上是在模拟成功的对数概率,它可以采用从-Inf到Inf的任何值,因此具有正态分布的先验(或者可以采用由可用先验信息确定的某个范围内的任何实值的其他先验)更合适


对于唯一参数为截距的模型,先验是成功概率的对数分布。数学上,该模型为:

log(p/(1-p)) =  a
其中,
p
是成功的概率,
a
是您估计的参数,是截距,可以是任何实数。如果成功的几率为1:1(即p=0.5),则
a=0
。如果几率大于1:1,则
a
为正。如果几率小于1:1,则
a
为负

因为我们需要一个先验的
a
,所以我们需要一个概率分布,它可以接受任何实际值。如果我们对成功几率一无所知,我们可能会使用一个信息量非常弱的先验值,比如说,均值=0,标准差=10(这是
rstanarm
默认值),这意味着一个标准差将包含大约22000:1到1:22000的成功几率!所以这个先验基本上是平的

如果我们采用您的前两项研究来构建先验,我们可以使用基于这些研究的概率密度,然后将其转换为对数优势标度:

# Possible outcomes (that is, the possible number of successes)
s = 0:(70+84)

# Probability density over all possible outcomes
dens = dbinom(s, 70+84, (27+31)/(70+84))
假设我们将使用先验的正态分布,我们需要最可能的成功概率(这将是先验的平均值)和平均值的标准偏差

# Prior parameters
pp = s[which.max(dens)]/(70+84)  # most likely probability
psd = sum(dens * (s/max(s) - pp)^2)^0.5  # standard deviation

# Convert prior to log odds scale
pp_logodds = log(pp/(1-pp))
psd_logodds = log(pp/(1-pp)) - log((pp-psd)/(1 - (pp-psd)))

c(pp_logodds, psd_logodds)
您可以通过在前两项研究中运行
stan_glm
生成基本相同的先验知识,并使用默认(平面)先验知识:

现在让我们使用研究3中的数据拟合模型,使用默认先验和我们刚刚生成的先验。我已经切换到标准数据帧,因为当数据帧只有一行时,
stan\u glm
似乎会失败(如
data=data[3,]

现在让我们比较三种模型:

library(tidyverse)

list(`Study 3, Flat Prior`=mod1, 
     `Study 3, Prior from Studies 1 & 2`=mod2, 
     `All Studies, Flat Prior`=mod3) %>% 
  map_df(~data.frame(log_odds=coef(.x),
                     p_success=predict(.x, type="response")[1]), 
         .id="Model")
对于研究3(第1行),预测成功的概率为0.55,正如预期的那样,因为这是数据所说的,并且先前没有提供额外的信息

对于基于研究1和2的研究3,其成功概率为0.45。较低的成功概率是由于在研究1和2中添加额外信息的成功概率较低。事实上,
mod2
的成功概率正是直接从数据中计算出来的:
使用(数据,总和(y)/总和(n))
mod3
将所有信息放入似然中,而不是将其在先验和似然之间分割,但在其他方面与
mod2
基本相同


对(现已删除)评论的回答:如果您只知道试验和成功的次数,并且您认为二项式概率是数据生成方式的合理模型,那么您如何将数据分为“先前”和“可能性”,或者您是否改变数据顺序都无关紧要。生成的模型拟合将是相同的。

不确定您为什么删除了此问题的早期版本,并在此处将我的答案添加到新版本中,但不客气。@ssp3nc3r,您好ssp3nc3r,非常感谢您在此处提供的有用意见!既然你在评论中提到了这一点,我想补充一些关于先前的问题。再次感谢您的帮助,祝您新年快乐:-)我想我最终需要的是一个支持贝叶斯元分析的
R
软件包。
prior = stan_glm(cbind(y, n-y) ~ 1, 
                 data = data[1:2,], 
                 family = binomial(link = 'logit'))   

c(coef(prior), se(prior))
[1] -0.5090579   0.1664091
# Default weakly informative prior
mod1 <- stan_glm(y ~ 1, 
                 data = data.frame(y=rep(0:1, c(45,55))), 
                 family = binomial(link = 'logit'))   

# Prior based on studies 1 & 2
mod2 <- stan_glm(y ~ 1, 
                 data = data.frame(y=rep(0:1, c(45,55))), 
                 prior_intercept = normal(location=pp_logodds, scale=psd_logodds), 
                 family = binomial(link = 'logit'))  
mod3 <- stan_glm(cbind(y, n - y) ~ 1, 
                 data = data, 
                 family = binomial(link = 'logit'))  
library(tidyverse)

list(`Study 3, Flat Prior`=mod1, 
     `Study 3, Prior from Studies 1 & 2`=mod2, 
     `All Studies, Flat Prior`=mod3) %>% 
  map_df(~data.frame(log_odds=coef(.x),
                     p_success=predict(.x, type="response")[1]), 
         .id="Model")
                              Model   log_odds p_success
1               Study 3, Flat Prior  0.2008133 0.5500353
2 Study 3, Prior from Studies 1 & 2 -0.2115362 0.4473123
3           All Studies, Flat Prior -0.2206890 0.4450506