rstan () не должен запускаться в #’@example?

#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 .