Как итеративно подогнать регрессионную модель brms и извлечь средние значения и сигма на фрейм данных - PullRequest
0 голосов
/ 12 февраля 2019

Учитывая пример данных sampleDT ниже, я был бы признателен за любую помощь, чтобы итеративно подогнать модель brms ниже n раз, и каждый раз извлекать means и sigma из объекта brmsfit brm.fit.n и добавлять их вфрейм данных sampleDT.

Если n=10, то к фрейму данных должно быть добавлено 10 столбцов means и 10 столбцов sigma.

Моя попытка нижене работает как задумано.Это позволяет мне запускать модель brms n раз и генерировать means и sigma n раз, но не добавляет их в кадр данных - один столбец для каждого средства и один столбец для каждой сигмы от каждоговыполнить - как и предполагалось.

# пример данных

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")

# моя попытка

map_dfc(1:10, function(i) {
        brm.fit.n <-brm(dollar.wage_1 ~ A + B + C + employer + F + G + H,
                data=sampleDT, iter = 200, family = gaussian())
        sampleDT$mean.n<-fitted(brm.fit.n)[, 1]
        sampleDT$sd.n<-summary(brm.fit.n)$spec_pars[1]
        return(sampleDT)
    })

Этот вопрос имееттакже было размещено здесь .Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 12 февраля 2019

Две вещи, которые вам нужно сделать, чтобы адаптировать существующий код в функцию:

  • Повторите подбор n раз
  • Сохраните вывод в хорошей структуре

Существует множество способов выполнить обе части, один из которых - purrr::map_dfr, который может выполнять обе функции, применяя подгонку несколько раз и создавая фрейм данных.

Вместо 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...