Rstan和cmdstanr的安装及比较

文摘   2024-11-03 12:03   北京  


Vol.1

前言


Stan 是一种编程语言,用于统计建模和数据分析。它使用贝叶斯方法,提供灵活的模型定义和高效的推断算法,适合复杂的统计模型等。Stan语言支持多种编程接口,其中RStan 是 Stan 的 R 语言接口,允许用户在 R 中编写、编译和运行 Stan 模型,并对结果进行分析和可视化。



Vol.2

Stan 的特点和优势


1

贝叶斯推断

Stan是一个全新的贝叶斯软件,是对汉密尔顿蒙特卡罗算法( Hamiltonian Monte Carlo, HMC)的扩展应用,能够高效估计复杂模型的后验分布。

2

灵活的建模语言

Stan 提供简洁且通用的建模语法,用户可以自定义复杂的统计模型,包括层级模型等。

3

高效的采样算法

Stan的 HMC 算法通常比传统的MCMC方法更高效,尤其在高维模型中表现良好。


Vol.3

Stan 的基本用法


Stan 的运行可分为以下 6 个步骤:

1、使用 Stan 概率模型语言,建立贝叶斯统计模型

2、通过 Stanc 函数将 Stan 模型语言编译为 C + + 代码

3、将 C + + 代码编译为可以被 R 载入的动态链接库

4、运行动态链接库的程序从后验分布中抽样

5、对后验分布样本进行收敛诊断

6、基于后验分布进行统计推断。

通常2-4步可从 R 中调用函数来实现,使用者不需要了解其中具体过程,但是如需对程序进行调试,也可以逐步执行2-4步。


Vol.4

RStan 的安装


1.rstan (stan and the rstan R package);https://mc-stan.org/users/interfaces/rstan.html

2.cmdstanr;https://mc-stan.org/cmdstanr/

rstan的安装

stan的安装具有其自身的特点且较为复杂,本次推文将只介绍在windows平台下,基于R的stan的安装和使用。首先需要安装好R软件。


检查 C + + 工具链安装情况,运行以下命令:

pkgbuild::has_build_tools( debug = TRUE)


如果输出的是FALSE,说明包含 C++工具链的Rtools软件尚未安装,可以从 http://cran.r-project.org/bin/windows/Rtools/   下载并安装。在安装过程中,需要勾选“add rtools to system Path”选项。

pkgbuild::has_build_tools(debug = TRUE)


另外,RStan 安装前,为确保 R 中没有 RStan,在 R 中运行以下命令以清除原有 RStan:

remove.packages("rstan")if (file.exists(".RData")) file.remove(".RData")


重启 R,安装 rstan 包。运行以下命令:

install.packages("rstan", repos = "https://cloud.r-project.org/", dependencies = TRUE)


验证安装:要验证是否安装成功,可以运行 RStan 示例/测试模型:

example(stan_model, package = "rstan", run.dontrun = TRUE)


载入 rstan 包,运行命令:

library (rstan)



cmdstanr的安装

install.packages("cmdstanr", repos = c('https://stan-dev.r-universe.dev', getOption("repos")))

安装好后直接加载以下这些包,方便后面调用


library(cmdstanr)library(posterior)library(bayesplot)color_scheme_set("brightblue")

CmdStanR 需要先安装好CmdStan(Stan 的 shell 接口)。在安装之前也是需要有 C++ 工具链。


首先检查工具链是否设置在正确,使用以下函数:

check_cmdstan_toolchain()


如果配置正确,就会如下所示:


当配置正确时,就可以调用 install_cmdstan()函数来安装 CmdStan:

install_cmdstan(cores = 2)


如果顺利的话,一般就是安装好了,但是往往很多时候,都是不顺的...比如,可能安装了半天,最后出来的结果是这样的


在使用 CmdStanR 之前,它需要知道 CmdStan 安装的位置。检查 CmdStan 安装的路径和 CmdStan 版本号,可以使用:

cmdstan_path()cmdstan_version()

但由于上一步出bug了,所以这两行也不会出结果,所以这时,我们还是需要解决上一步的问题。

首先我们的cmdstanr应该是装好了,不出所料,可以运行一下library(cmdstanr)会发现是能加载出来的,但是大多数情况都是这一行代码install_cmdstan(cores = 2)会报错,根据报错的原因可以发现应该是解压错误。

这时候我们可以直接手动去C盘解压一下,找到C:\Users\Administrator\.cmdstan,可以发现解压出来也是有问题的,进展到30%可能就断了,所以这时候我们可以自己手动去下载。下载的网址如下:https://github.com/stan-dev/cmdstan/releases 

下完手动解压之后一切都好使了,cmdstan_path(),cmdstan_version()这两行代码也能运行成功,但是可能会发现模型可能无法编译。最后又得把这个文件给手动删掉,然后尝试了好几次,通过install_cmdstan(cores = 1)也不行,最后通过install_cmdstan(cores = )成功了。如果小伙伴们在安装的时候出现了这些情况,可以按照我的步骤挨个试一下,也许就装成了。


示例

编译模型

cmdstan_model()是 cmdstanr 中的函数,用于编译 Stan 模型。它接受一个 Stan 文件路径作为输入,并将其编译为一个可执行模型。在这里,我们使用cmdstan安装附带的示例stan程序

file <- file.path(cmdstan_path(), "examples", "bernoulli", "bernoulli.stan")mod <- cmdstan_model(file)mod$print()



这个 Stan 模型编码了一个简单的伯努利模型,这个模型通过给定的数据 y 来估计 theta。其中theta 的先验分布是均匀分布。

data:定义数据

intN:定义一个非负整数 N,表示观测数据 y 的样本量。

array[N] inty:定义一个长度为 N 的整数数组 y,其中每个元素的取值在 0 和 1 之间。y 是观测数据,表示 N 次伯努利试验的结果(1 表示成功,0 表示失败)。

parameters:定义参数

realtheta:定义参数 theta,表示伯努利试验的成功概率。该参数的取值在 [0, 1] 区间。

model:定义模型

theta ~ beta(1, 1):给 theta 赋予一个 Beta(1, 1) 分布作为先验分布。在 Beta(1, 1) 下,theta 的分布是均匀分布,即在 [0, 1] 区间内,每个值的概率相等。

y ~ bernoulli(theta):定义观测数据 y 的似然函数,假设 y 服从伯努利分布,成功概率为 theta。这表示在 N 次伯努利试验中,每个试验的成功概率为 theta。


这个模型是一种简单的贝叶斯估计方法,用于估计伯努利试验的成功概率 theta。模型给 theta 一个先验(均匀分布),然后通过观测数据更新对 theta 的认识,即计算其后验分布。


运行 MCMC



Vol.5

计算方法


RStan 和 cmdstanr 都是用于在 R 中运行 Stan 模型的接口。

1

实现方式和依赖

RStan:是 Stan 的内存接口,依赖于 Rcpp 和 inline 等 R 包从 R 调用 C++ 代码。

cmdstanr:并不直接从 R 中调用任何 C++ 代码,而是基于 CmdStan,它是 Stan 的命令行接口。cmdstanr依靠幕后的 CmdStan 接口进行编译、运行算法以及将结果写入输出文件。


2

安装与兼容性

RStan:对于 RStan 来说,跟上 Stan 版本是很复杂的,通常需要对 rstan 包以及 rstan 和 StanHeaders 的新 CRAN 版本进行重要的更改。

cmdstanr:使用 CmdStanR,在使用cmdstanr::install_cmdstan()更新 CmdStan 后,R 将立即提供 Stan 中的最新改进。安装过程中,cmdstanr 自动下载并配置 CmdStan,减少了依赖冲突的可能性。


3

编译速度和性能

编译速度:cmdstanr 利用命令行编译器,编译速度通常比 RStan 更快,特别是对于较复杂的 Stan 模型来说更为明显。

内存和计算效率:cmdstanr 的内存管理通常更高效,占用内存更少,在大型数据和高维模型上表现更好。此外,cmdstanr 支持并行化运行多个链,大大提高了运行效率。

4

数据传输和结果处理

RStan:直接将数据和结果存储在 R 内存中,适合小规模数据分析。但当数据较大时,R 的内存管理会不足。

cmdstanr:数据传递和结果存储更灵活,结果可以保存为 .csv 文件,适合大型数据集分析。且 .csv 文件便于外部存储和其他工具进一步分析。


5

并行和采样速度

RStan:支持并行,但设置较为复杂,且在大型模型上可能性能有限。

cmdstanr:并行化配置简单,用户可以轻松指定 parallel_chains 参数来运行多个链,在多核 CPU 上运行更高效。


6

使用体验

RStan:适合小规模、简单的模型以及快速原型开发,在 R 环境内即可轻松完成所有任务。

cmdstanr:适合复杂模型和大数据分析,运行速度快,资源管理更高效,且与外部数据管道的集成更方便。


如果希望直接在 R 中构建并快速测试小型 Stan 模型,RStan 是一个便捷的选择。如果对模型规模、性能和系统兼容性有更高要求,尤其是大型数据或复杂模型分析,cmdstanr 更具优势。



PSYCH统计实验室

通知公告

网络分析课程目前开放视频课啦!


单次课200元/讲(学生),250元/讲(非学生)
共有四讲内容
①横断面网络分析简介与基础
②网络分析与因子分析
③交叉滞后网络分析
④时间序列网络分析


购买后开放视频权限14天,可多次申请。
并赠送所有课程相关资料(无PPT)
如果想申请购买,请联系M18812507626



更多资讯

关注我们


文稿:Traveler

排版:Peruere
责编:Wink
审核:摘星

本文由“Psych统计自习室”课题组原创,欢迎转发至朋友圈。如需转载请联系后台,征得作者同意后方可转载。



Psych统计自习室
大家好,我们是由来自北京师范大学,西南大学,天津医科大学等高校在读硕士、博士研究生组成的一个科研团队——Psych统计自习室。Psych统计自习室旨在关注心理学、精神病学领域的最前沿的系列研究,并做前沿统计知识的分享。
 最新文章