R BEST包如何按组设置贝叶斯先验

4dc9hkyq  于 2023-06-03  发布在  其他
关注(0)|答案(1)|浏览(615)

bounty还有4天到期。回答此问题可获得+100声望奖励。user1491868正在寻找一个来自一个有信誉的来源的答案:我愿意学习其他可以做同样测试的R包。

我使用R BEST包来测试两组之间的均值差异,并且我想按组设置先验信念。
在下面的R代码中,我可以按组设置先验均值(参见priors2),但不能按组设置先验标准差(参见priors3)。
我做错什么了吗?

library(BEST)

y1 <- c(5.77, 5.33, 4.59, 4.33, 3.66, 4.48)    
y2 <- c(3.88, 3.55, 3.29, 2.59, 2.33, 3.59)

priors1 <- list(muM = 6, muSD = 2)
BESTout1 <- BESTmcmc(y1, y2, priors=priors1, parallel=FALSE)

priors2 <- list(muM = c(6, 4), muSD = 2)
BESTout2 <- BESTmcmc(y1, y2, priors=priors2, parallel=FALSE)

priors3 <- list(muM = c(6, 4), muSD = c(2, 2))
BESTout3 <- BESTmcmc(y1, y2, priors=priors3, parallel=FALSE)
gmxoilav

gmxoilav1#

R BEST packagetwo-sample t-test (John K. Kruschke)的贝叶斯版本。
从您提供的示例代码来看,似乎您正在尝试为正在比较的两个组使用不同的先验(在考虑数据之前合并有关参数的现有知识或信念的方法)。
然而,在BEST包中实现贝叶斯t检验的方式是,它使用 * 单个 * 共享先验来计算组的标准差。这是因为它假设被比较的两个组可能具有相似的方差。
在您发布的代码中,muM参数指的是组均值的先验均值,muSD参数指的是组均值的先验标准差。虽然可以为每个组设置不同的先验均值(如在priors2中所做的那样),但muSD参数在组之间共享。
不幸的是,BEST包不支持为每个组设置不同的先验标准差。
您可以在mikemeredith/BEST issue 6中查看详细信息
如果您有兴趣为每个组的标准差设置不同的先验,则需要使用不同的软件包或手动执行分析。
一种替代方法是使用paul-buerkner/brms package(在this paper中提供),这是一个用于R中贝叶斯分析的通用包。它使用Stan(贝叶斯统计平台)进行计算,并支持各种模型和先验。但是,请注意,直接使用brms或Stan可能比使用BEST包更复杂,因为它们需要您更详细地指定模型和先验。
brms中的贝叶斯t检验可能如下所示:

library(brms)

# create a data frame
dat <- data.frame(
  y = c(y1, y2),
  group = factor(rep(c("y1", "y2"), each = 6))
)

# fit the model
fit <- brm(
  y ~ group,
  prior = c(
    set_prior("normal(6, 2)", class = "Intercept", coef = "groupy1"),
    set_prior("normal(4, 2)", class = "Intercept", coef = "groupy2")
  ),
  data = dat,
  family = gaussian()
)

此代码创建了一个贝叶斯线性回归模型,其中两组的均值被建模为截距,并为每组设置不同的先验。
这只是一个示例,您需要为您的特定案例选择适当的先验。
您可以在brms中设置优先级。例如:

set_prior("normal(0,5)", class = "b", coef = "x1") 
set_prior("student_t(10, 0, 1)", class = "b", coef = "x2")

这里,我们为系数x1设置均值为0、标准差为5的正态先验,为x2设置10个自由度的Student t先验。此代码需要与brm函数调用结合使用,以运行模型。
需要注意的一点是,set_prior中的coef参数对应的是数据中的变量名,而不是组名。如果要对特定于组的效应进行建模,则可能需要考虑在模型中使用组水平或随机效应。
要将其与模型代码集成,您可以执行以下操作:

library(brms)
prior1 <- set_prior("normal(0,5)", class = "b", coef = "x1") 
prior2 <- set_prior("student_t(10, 0, 1)", class = "b", coef = "x2")
priors <- c(prior1, prior2)
mod_eqvar <- brm(
  IQ ~ Group,
  data = d,
  cores = 4,  # Use 4 cores for parallel processing
  prior = priors
)
summary(mod_eqvar)

(Do将x1x2替换为数据集中希望设置先验的变量的实际名称。
此代码为x1x2设置指定的先验,并在模型中使用它们。
然后,它使用指定的先验,在 Dataframe d中的不同Group之间执行贝叶斯t检验比较IQ
然后使用summary(mod_eqvar)查看模型的结果。
为了比较组,上面的初始代码将变为:

# Load the library
library(brms)

# Set a seed for reproducibility
set.seed(42)

# Generate some data
group1 <- rnorm(50, mean = 5, sd = 1)
group2 <- rnorm(50, mean = 6, sd = 1)

# Combine into a data frame
d <- data.frame(
  IQ = c(group1, group2),
  Group = factor(rep(c("Group1", "Group2"), each = 50))
)

# Set priors for the model. This prior represents a prior belief about the difference in means between Group2 and Group1
priors <- set_prior("normal(0, 5)", class = "b", coef = "Group2")

# Fit the model
mod_eqvar <- brm(
  IQ ~ Group,
  data = d,
  prior = priors,
  cores = 4,  # Use 4 cores for parallel processing
  file = "iqgroup"  # Save results into a file
)

# View the results
summary(mod_eqvar)

在这段代码中,模型IQ ~ Group正在比较 Dataframe d中不同Group之间的变量IQ。在模型公式中,IQ是结果变量,Group是预测变量。预测变量Group是分类变量,它代表数据中的不同组。
(See也称为“How to Compare Two Groups with Robust Bayesian Estimation in R”)
在模型公式IQ ~ Group中,IQ是结果变量,Group是预测变量。预测变量Groupis categorical,它表示数据中的不同组。
当在R中的回归模型中使用因子变量时,因子的第一个水平作为参考组,其他水平的估计值表示结果变量(在本例中为IQ)相对于参考组的差异。模型中“Group2”的估计值表示Group2与参考组(组1)之间的平均值差异。
所以,如果你在模型中为“Group2”的系数设置先验,就像这行代码:

priors <- set_prior("normal(0, 5)", class = "b", coef = "Group2")

您设置的先验信念是关于Group2和参考组之间的均值差异,而不是关于Group2的总体均值。然后在拟合模型时根据数据更新此先验分布,从而生成两组间均值差异的后验分布。
summary(mod_eqvar)函数将为您提供模型的摘要,包括Group2和Group1之间的估计均值差异。该差异由输出中的“组2”估计值表示。在贝叶斯上下文中,我们通常查看感兴趣参数的后验分布(在这种情况下,组间均值的差异)和95%可信区间。如果平均值差异的95%可信区间不包括0,则表明组间平均值存在统计学显著差异。

set_prior函数用于设置模型中各组之间均值差异的先验分布。set_prior中的coef参数对应于数据中的变量名,而不是组名。因此,当我们在set_prior中使用coef = "Group2"时,我们实际上是为Group2和参考组(Group1)之间的均值差设置先验,而不是为Group2的总体均值设置先验。
(See也称为“Prior Definitions for brms Models”)
在贝叶斯上下文中,我们通常查看posterior distribution of the parameter of interest(在本例中,GroupIQ的影响)和95%的credible interval,而不是p值。如果可信区间不包括零,则表明该效应在0.05水平上具有统计学显著性。
关于错误:

Error: The following priors do not correspond to any model parameter: 
  Intercept_groupy1 ~ normal(6, 2) 
  Intercept_groupy2 ~ normal(4, 2) 
Function 'get_prior' might be helpful to you.

错误消息指示指定的先验与任何模型参数都不匹配。这可能是因为组名与数据中的组名不匹配。
在brms模型语法中,截距项表示参考组的总体平均值,coef项表示与其他组的此参考组平均值的差异。coef项应与因子变量中的组水平的确切名称匹配,在您的示例中显示为Group1Group2
让我们更正set_prior函数中的coef项,以匹配数据中的组名称。您可以尝试在set_prior函数中将Intercept_groupy1Intercept_groupy2替换为Intercept_Group1Intercept_Group2(或因子变量水平的确切名称),如下所示:

# Set priors for the model
priors <- c(
  set_prior("normal(6, 2)", class = "Intercept", coef = "Group1"),
  set_prior("normal(4, 2)", class = "Intercept", coef = "Group2")
)

# Fit the model
mod_eqvar <- brm(
  IQ ~ Group,
  data = d,
  prior = priors,
  cores = 4,  # Use 4 cores for parallel processing
  file = "iqgroup"  # Save results into a file
)

注意:这可能仍然不起作用,因为brms可能不允许同一模型中因子变量的不同水平具有不同的先验。在这种情况下,您可能需要为每个组拟合单独的模型,然后手动比较结果。

相关问题