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)
1条答案
按热度按时间gmxoilav1#
R BEST package是two-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检验可能如下所示:此代码创建了一个贝叶斯线性回归模型,其中两组的均值被建模为截距,并为每组设置不同的先验。
这只是一个示例,您需要为您的特定案例选择适当的先验。
您可以在
brms
中设置优先级。例如:这里,我们为系数
x1
设置均值为0、标准差为5的正态先验,为x2
设置10个自由度的Student t先验。此代码需要与brm
函数调用结合使用,以运行模型。需要注意的一点是,
set_prior
中的coef
参数对应的是数据中的变量名,而不是组名。如果要对特定于组的效应进行建模,则可能需要考虑在模型中使用组水平或随机效应。要将其与模型代码集成,您可以执行以下操作:
(Do将
x1
和x2
替换为数据集中希望设置先验的变量的实际名称。此代码为
x1
和x2
设置指定的先验,并在模型中使用它们。然后,它使用指定的先验,在 Dataframe
d
中的不同Group
之间执行贝叶斯t检验比较IQ
。然后使用
summary(mod_eqvar)
查看模型的结果。为了比较组,上面的初始代码将变为:
在这段代码中,模型
IQ ~ Group
正在比较 Dataframed
中不同Group
之间的变量IQ
。在模型公式中,IQ
是结果变量,Group
是预测变量。预测变量Group
是分类变量,它代表数据中的不同组。(See也称为“How to Compare Two Groups with Robust Bayesian Estimation in R”)
在模型公式
IQ ~ Group
中,IQ
是结果变量,Group
是预测变量。预测变量Group
is categorical,它表示数据中的不同组。当在R中的回归模型中使用因子变量时,因子的第一个水平作为参考组,其他水平的估计值表示结果变量(在本例中为
IQ
)相对于参考组的差异。模型中“Group2
”的估计值表示Group2
与参考组(组1)之间的平均值差异。所以,如果你在模型中为“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(在本例中,
Group
对IQ
的影响)和95%的credible interval,而不是p值。如果可信区间不包括零,则表明该效应在0.05水平上具有统计学显著性。关于错误:
错误消息指示指定的先验与任何模型参数都不匹配。这可能是因为组名与数据中的组名不匹配。
在brms模型语法中,截距项表示参考组的总体平均值,
coef
项表示与其他组的此参考组平均值的差异。coef
项应与因子变量中的组水平的确切名称匹配,在您的示例中显示为Group1
和Group2
。让我们更正
set_prior
函数中的coef
项,以匹配数据中的组名称。您可以尝试在set_prior
函数中将Intercept_groupy1
和Intercept_groupy2
替换为Intercept_Group1
和Intercept_Group2
(或因子变量水平的确切名称),如下所示:注意:这可能仍然不起作用,因为brms可能不允许同一模型中因子变量的不同水平具有不同的先验。在这种情况下,您可能需要为每个组拟合单独的模型,然后手动比较结果。