#rstan
#rstan
Вопрос:
При разработке пакета для каждого примера требуется <5 секунд. Однако выполнение пары stan_model()
и rstan::sampling()
занимает много времени, более 5 секунд, следующим образом:
Examples with CPU or elapsed time > 5s
user system elapsed
fit 1.25 0.11 32.47
Поэтому я помещаю donttest{}
для каждого rstan::sampling()
в комментарии roxygen #'@examples
В примерах #'@examples
мы не должны запускаться sampling()
или есть какое-либо лечение?
Я пытался создать свой пакет на основе кода rstan_package_skeleton(path = 'BayesianAAA')
, когда меня учили у вас (спасибо !!) но я многого в этом не понимаю.
Ранее rstan_package_skeleton(path = 'BayesianAAA')
запускал ошибки на моем компьютере (но теперь ошибка не возникает). Итак, я создал свой пакет без rstan_package_skeleton()
, скажем BayesianAAA
, Model_A.stan
, и в моем первоначальном варианте я поместил Model_B.stan
, Model_C.stan
, inst/extdata
,…. в ,,, и я ссылаюсь на свои файлы stan следующим образом;
scr <- system.file("extdata", "Model_A.stan", package="BayesianAAA")
scr <- rstan::stan_model(scr)
У меня много вопросов о коде rstan_package_skeleton(path = 'BayesianAAA')
.
1) Первый вопрос заключается в том, как включить мои существующие файлы stan и как ссылаться на мои .stan
файлы для rstan::stan_model()
? Согласно следующей странице, в нем говорится, что
Если бы у нас были существующие файлы .stan для включения в пакет, мы могли бы использовать необязательный stan_files
аргумент rstan_package_skeleton, чтобы включить их.
Итак, я думаю, что мне следует выполнить, я не уверен, но требуется следующий подобный способ;
`rstan_package_skeleton(path = 'BayesianAAA', stan_files = "Model_A.stan" )`.
Но я не знаю, как написать код для нескольких файлов stan, скажем, Model_A.stan
, Model_B.stan
Model_C.stan
в моем существующем пакете, созданном без rstan_package_skeleton()
. Я не понимаю, но следующий код правильный? Поскольку я не знаю, где файлы, описанные в переменной, stan_files
отражены в новом проекте, созданном rstan_package_skeleton()
.
`rstan_package_skeleton(path = 'BayesianAAA', stan_files = c("Model_A.stan",`Model_B.stan`,`Model_C.stan` )`.
Здесь возникает другой вопрос, то есть,
2) Второй вопрос: где я выполняю код rstan_package_skeleton(path = 'BayesianAAA', stan_files = "Model_A.stan" )
? Я выполняю его из консоли R studio в моем существующем проекте пакета. Это правильно? И затем возникает новый проект, который содержит старый существующий проект. Что мне делать?
https://cran.r-project.org/web/packages/rstantools/vignettes/minimal-rstan-package.html
3) Я не совсем разбираюсь в пакетах «rstanarm«, но я пытаюсь имитировать это для своего пакета, но я не могу оштрафовать ни один .stan
файл в нем, я ошибаюсь?
Прошу прощения за мой плохой английский и недостаточное изучение этих вещей. Я был бы признателен, если бы вы могли мне сказать.
Ответ №1:
Обычно вам не следует писать пакет, который вызывается stan_model
во время выполнения, если, подобно brms или tmbstan, вы не генерируете программу Stan во время выполнения, а не пишете ее статически. В CRAN есть десятки пакетов, которые предоставляют скомпилированные программы Stan, в основном следуя процессу сборки, разработанному для rstanarm, которому способствуют rstantools::rstan_package.skeleton
функция, пошаговое руководство и рекомендации разработчика, которые непосредственно касаются вашего вопроса
Политика CRAN допускает длительное время установки, но накладывает ограничения на время, затрачиваемое на примеры и модульные тесты, которые намного короче времени, необходимого для компиляции даже простой программы Stan. Таким образом, адекватное тестирование вашего пакета возможно только в том случае, если в нем есть предварительно скомпилированные программы Stan.
Даже в этом случае может быть сложно выполнить выборку из последующего распределения (адекватно) за пять секунд, поэтому часто приходится использовать небольшие наборы данных, одну цепочку, небольшое количество итераций и т.д.
Лучше всего передавать имена ваших программ Stan (которые должны заканчиваться расширением .stan, в противном случае не использовать точку и содержать только буквы ASCII, цифры и подчеркивание в их именах) в rstantools::rstan_package_skeleton()
. Если это делается из RStudio, я бы вызвал его, не находясь в существующем проекте. Тогда
Во время установки все программы Stan будут скомпилированы и сохранены в списке
stanmodels
, который затем может быть использован функцией R в пакете. Правило заключается в том, что программа Stan, скомпилированная из кода модели вsrc/stan_files/foo.stan
, сохраняется как элемент спискаstanmodels$foo
.
Существуют десятки пакетов R, в src/stan_files
каталоге которых есть программы Stan (хотя расположение программ Stan будет перенесено в inst/stan
следующий выпуск rstantools), которые по большей части просто следовали инструкциям и не должны были выполнять никаких дополнительных шагов, за исключением написания дополнительных функций R.
Комментарии:
1. Спасибо за ответ. У меня много вопросов, и я пишу их в приведенном выше. Я был бы признателен, если бы вы ответили на мои вопросы.
2. Спасибо за ваш второй ответ!! Ваш ответ всегда повышает мою мотивацию. (Я не заметил вашего второго ответа.) Я понимаю, что файл с именем
xxx.stan
скомпилирован, и на него можно ссылаться как на объект R из списка с именемstanmodel
.