如何迭代拟合brms回归模型并提取数据帧的均值和σ
考虑到下面的示例数据如何迭代拟合brms回归模型并提取数据帧的均值和σ,r,function,data.table,tidyr,rstan,R,Function,Data.table,Tidyr,Rstan,考虑到下面的示例数据sampleDT,我将非常感谢任何帮助,以迭代方式拟合以下n次brms模型,每次从brmsfit对象brm.fit.n中提取平均值和sigma,并将其添加到数据框sampleDT 如果n=10,则应在数据框中添加10列平均值和10列西格玛 我下面的尝试没有达到预期效果。它允许我运行brms模型n次,并生成平均值和sigman次,但不会按预期将它们添加到数据框中-每个平均值一列,每次运行的每个sigma一列 #样本数据 sampleDT<-structure(list(i
sampleDT
,我将非常感谢任何帮助,以迭代方式拟合以下n次brms模型,每次从brmsfit对象brm.fit.n
中提取平均值和sigma
,并将其添加到数据框sampleDT
如果n=10
,则应在数据框中添加10列平均值
和10列西格玛
我下面的尝试没有达到预期效果。它允许我运行brms模型n
次,并生成平均值
和sigma
n
次,但不会按预期将它们添加到数据框中-每个平均值一列,每次运行的每个sigma一列
#样本数据
sampleDT<-structure(list(id = 1:10, N = c(10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L), A = c(62L, 96L, 17L, 41L, 212L, 143L, 143L,
143L, 73L, 73L), B = c(3L, 1L, 0L, 2L, 170L, 21L, 0L, 33L, 62L,
17L), C = c(0.05, 0.01, 0, 0.05, 0.8, 0.15, 0, 0.23, 0.85, 0.23
), employer = c(1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L), F = c(0L,
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L), G = c(1.94, 1.19, 1.16,
1.16, 1.13, 1.13, 1.13, 1.13, 1.12, 1.12), H = c(0.14, 0.24,
0.28, 0.28, 0.21, 0.12, 0.17, 0.07, 0.14, 0.12), dollar.wage_1 = c(1.94,
1.19, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_2 = c(1.93,
1.18, 3.15, 3.15, 1.12, 1.12, 2.12, 1.12, 1.11, 1.11), dollar.wage_3 = c(1.95,
1.19, 3.16, 3.16, 1.14, 1.13, 2.13, 1.13, 1.13, 1.13), dollar.wage_4 = c(1.94,
1.18, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_5 = c(1.94,
1.19, 3.16, 3.16, 1.14, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_6 = c(1.94,
1.18, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_7 = c(1.94,
1.19, 3.16, 3.16, 1.14, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_8 = c(1.94,
1.19, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_9 = c(1.94,
1.19, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12), dollar.wage_10 = c(1.94,
1.19, 3.16, 3.16, 1.13, 1.13, 2.13, 1.13, 1.12, 1.12)), row.names = c(NA,
-10L), class = "data.frame")
sampleDT将现有代码改编成函数需要做的两件事是:
- 重复安装
n次
- 将输出保存在一个好的结构中
有很多方法可以同时完成这两个部分,其中一个选项是purrr::map_dfr
,它可以同时完成这两个部分,多次应用fit并创建一个数据帧
与需要一些时间拟合的brm
模型不同,我将一个简单的线性模型拟合到随机数据,您只需用拟合代码替换这些部分,并保存平均值和sd,而不是截距和斜率:
library(purrr)
# 1:10 - will repeat 10 times
map_dfr(1:10, function(i) {
random_data = data.frame(
x = rnorm(30),
y = rnorm(30)
)
fit = lm(y ~ x, data = random_data)
intercept = coef(fit)[1]
slope = coef(fit)[2]
return(data.frame(intercept, slope))
}, .id = "sim_num")
它将数据帧作为输出:
sim_num intercept slope
1 1 0.274903632 -0.03529736
2 2 -0.005134599 -0.22063748
3 3 -0.134999713 0.12090366
4 4 -0.216886033 0.21265679
5 5 0.261365432 0.02434036
6 6 0.067069791 0.23180334
7 7 -0.235138217 0.28360061
8 8 -0.117489553 0.10781101
9 9 -0.150288480 0.03086797
10 10 -0.031814194 -0.04075479
看起来你对你想做什么有一个很好的想法,你有没有试过自己编写函数?你有什么特别的麻烦?谢谢,马吕斯。刚刚编辑了这个问题,添加了我到目前为止的尝试,但没有生成所需结构的输出。提前谢谢你的帮助
sim_num intercept slope
1 1 0.274903632 -0.03529736
2 2 -0.005134599 -0.22063748
3 3 -0.134999713 0.12090366
4 4 -0.216886033 0.21265679
5 5 0.261365432 0.02434036
6 6 0.067069791 0.23180334
7 7 -0.235138217 0.28360061
8 8 -0.117489553 0.10781101
9 9 -0.150288480 0.03086797
10 10 -0.031814194 -0.04075479