49
Integrating R and C++ exemplified by stochastic gradient MCMC sampling Panagiotis Papastamoulis Department of Statistics Athens University of Economics and Business, Greece Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 2021 1 / 33

Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Integrating R and C++ exemplified by stochasticgradient MCMC sampling

Panagiotis Papastamoulis

Department of StatisticsAthens University of Economics and Business, Greece

Post-graduate SeminarAUEB Stat Seminars

January 15, 2021

P. Papastamoulis (AUEB) R and C++ January 15, 2021 1 / 33

Page 2: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Overview

1 IntroductionThe standard way for bridging R and other languagesThe Rcpp package

2 Toy example

3 Some statistical applications (MCMC sampling)Gibbs sampling in Mixtures of Factor Analyzers

The RcppArmadillo packageStochastic gradient MCMC in Mixtures of Multinomial Logitmodels

P. Papastamoulis (AUEB) R and C++ January 15, 2021 2 / 33

Page 3: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Rcpp

R is an extensible systemR code can be augmented with compiled codeE.g. “Writing R extensions” manual

C C++ Fortran

The Rcpp package simplifies the usage of C++ in R Eddelbuettel and François (2011) Eddelbuettel, 2013 http://CRAN.R-project.org/package=Rcpp

P. Papastamoulis (AUEB) R and C++ January 15, 2021 3 / 33

Page 4: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

FAQ

Detailed documentation: Rcpp-FAQ.pdf vignette available online

What do I need a development environment with a suitable compiler, header files

and required libraries R should be built in a way that permits linking and possibly

embedding of R standard development tools such as make, etc

What compiler can I use the GNU Compiler Collection along with the corresponding g++ compiler for the C++ language

More specifically Windows: install Rtools toolchain OS X: install Apple Developer Tools (Xcode (OS X⩽10.8) or XcodeCommand Line Tools (OS X⩾10.9)

Linux: ,

P. Papastamoulis (AUEB) R and C++ January 15, 2021 4 / 33

Page 5: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

FAQ

Detailed documentation: Rcpp-FAQ.pdf vignette available onlineWhat do I need

a development environment with a suitable compiler, header filesand required libraries

R should be built in a way that permits linking and possiblyembedding of R

standard development tools such as make, etc

What compiler can I use the GNU Compiler Collection along with the corresponding g++ compiler for the C++ language

More specifically Windows: install Rtools toolchain OS X: install Apple Developer Tools (Xcode (OS X⩽10.8) or XcodeCommand Line Tools (OS X⩾10.9)

Linux: ,

P. Papastamoulis (AUEB) R and C++ January 15, 2021 4 / 33

Page 6: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

FAQ

Detailed documentation: Rcpp-FAQ.pdf vignette available onlineWhat do I need

a development environment with a suitable compiler, header filesand required libraries

R should be built in a way that permits linking and possiblyembedding of R

standard development tools such as make, etcWhat compiler can I use

the GNU Compiler Collection along with the corresponding g++ compiler for the C++ language

More specifically Windows: install Rtools toolchain OS X: install Apple Developer Tools (Xcode (OS X⩽10.8) or XcodeCommand Line Tools (OS X⩾10.9)

Linux: ,

P. Papastamoulis (AUEB) R and C++ January 15, 2021 4 / 33

Page 7: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

FAQ

Detailed documentation: Rcpp-FAQ.pdf vignette available onlineWhat do I need

a development environment with a suitable compiler, header filesand required libraries

R should be built in a way that permits linking and possiblyembedding of R

standard development tools such as make, etcWhat compiler can I use

the GNU Compiler Collection along with the corresponding g++ compiler for the C++ language

More specifically Windows: install Rtools toolchain OS X: install Apple Developer Tools (Xcode (OS X⩽10.8) or XcodeCommand Line Tools (OS X⩾10.9)

Linux: ,

P. Papastamoulis (AUEB) R and C++ January 15, 2021 4 / 33

Page 8: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The standard way (without Rcpp)

Description:Functions to make calls to compiled codethat has been loaded into R.

Usage:.C(.NAME, ...)

.Fortran(.NAME, ...)

.NAME: a character string giving the name of a C function or Fortransubroutine

P. Papastamoulis (AUEB) R and C++ January 15, 2021 5 / 33

Page 9: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The standard way (without Rcpp)1R CMD SHLIB [options] [-o dllname] files

1 Compile the given source files2 Create a dynamically loadable library (DLL)

Finally, the command dyn.load links the specified DLL to theexecuting R image

C++ code Call within R

1note to Windows useRs: Rtools is required hereP. Papastamoulis (AUEB) R and C++ January 15, 2021 6 / 33

Page 10: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The standard way (without Rcpp)1R CMD SHLIB [options] [-o dllname] files

1 Compile the given source files2 Create a dynamically loadable library (DLL)

Finally, the command dyn.load links the specified DLL to theexecuting R image

C++ code Call within R

1note to Windows useRs: Rtools is required hereP. Papastamoulis (AUEB) R and C++ January 15, 2021 6 / 33

Page 11: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The standard way (without Rcpp)1R CMD SHLIB [options] [-o dllname] files

1 Compile the given source files2 Create a dynamically loadable library (DLL)

Finally, the command dyn.load links the specified DLL to theexecuting R image

C++ code Call within R

1note to Windows useRs: Rtools is required hereP. Papastamoulis (AUEB) R and C++ January 15, 2021 6 / 33

Page 12: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The standard way (without Rcpp)1R CMD SHLIB [options] [-o dllname] files

1 Compile the given source files2 Create a dynamically loadable library (DLL)

Finally, the command dyn.load links the specified DLL to theexecuting R image

C++ code Call within R1note to Windows useRs: Rtools is required here

P. Papastamoulis (AUEB) R and C++ January 15, 2021 6 / 33

Page 13: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

3440 3460 3480 3500 3520

3440

3460

3480

3500

3520

transcript ID

tran

scrip

t ID

Cluster 3461 (12 transcripts)Cluster 3513 (3 transcripts)Cluster 3479 (6 transcripts)Cluster 3473 (1 transcript)

K × K sparse matrix, where K is measured in tens of thousandsLoop through millions/billions of dataPapastamoulis and Rattray, 2018 (JRSSC)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 7 / 33

Page 14: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Rcpp

Application Programming InterfaceDefines interactions between multiple software intermediariesIt provides a consistent C++ class hierarchy that maps varioustypes of R objects to dedicates C++ classes

vectors matrices functions environments

Rcpp substantially lowers the barrier for programmers wanting tocombine C++ code with R, e.g.

only a single header file is needed to use the Rcpp API

Articles and code examples for the Rcpp packagehttps://gallery.rcpp.org/

P. Papastamoulis (AUEB) R and C++ January 15, 2021 8 / 33

Page 15: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Toy example: Fibonacci sequence2

The Fibonacci sequence Fn is defined as a recursive sum of thetwo preceding terms in the same sequence

Fn = Fn−1 + Fn−2

with initial conditions

F0 = 0 and F1 = 1

It looks like

n 0 1 2 3 4 5 6 7 8 9 10 11 ⋯

Fn 0 1 1 2 3 5 8 13 21 34 55 89 ⋯

2Image: By Jahobr - Own work, CC0, WikipediaP. Papastamoulis (AUEB) R and C++ January 15, 2021 9 / 33

Page 16: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Toy example: Fibonacci sequence

Let’s implement this in RVia a simple recursive functionfibonacci_R <- function(n)

if (n < 2) return(n)return (fibonacci_R(n - 1) + fibonacci_R(n - 2))

It is very inefficient F5 = F4 + F3 F4 = F3 + F2 the run time is exponential in n alternative approaches do exist (e.g. memoization techniques) normally we would also return an error message in case of

non-integer input but we won’t be bothered by that

P. Papastamoulis (AUEB) R and C++ January 15, 2021 10 / 33

Page 17: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Same with Rcpp

C++ code in file src/fibonacci.cpp#include <Rcpp.h>using namespace Rcpp;// [[Rcpp::export]]int fibonacci_cpp(const int x)

if (x < 2)return x;

elsereturn (fibonacci_cpp(x - 1)) + fibonacci_cpp(x - 2);

P. Papastamoulis (AUEB) R and C++ January 15, 2021 11 / 33

Page 18: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Compile and call our C++ function inside R session

> library("Rcpp")> sourceCpp("src/fibonacci.cpp")

sourceCpp() parses the specified C++ file or source codelooks for functions marked with the Rcpp::export attributeA shared library is then built and its exported functions and Rcppmodules are made available in the specified environmentNow we are ready to call the compiled code inside R> fibonacci_cpp(10)[1] 55

P. Papastamoulis (AUEB) R and C++ January 15, 2021 12 / 33

Page 19: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Benchmarking

Let’s compare the elapsed time needed for computing F20

The results are averages across 500 replicationsThe microbenchmark package was used, which providessub-millisecond accurate timing of expression evaluation

> library("microbenchmark")> library("Rcpp")> sourceCpp("src/fibonacci.cpp")> source("src/fibonacci.R")> m <- microbenchmark(+ rCode <- fibonacci_R(20),+ cppCode <- fibonacci_cpp(20),+ unit = "ms", times = 500)> print(m, digits = 2)Unit: milliseconds

expr min lq mean median uq max nevalrCode 7.551 7.689 8.190 7.83 7.994 13.39 500

cppCode 0.018 0.018 0.023 0.02 0.023 0.93 500

P. Papastamoulis (AUEB) R and C++ January 15, 2021 13 / 33

Page 20: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Benchmarking (as a function of n)

0 5 10 15 20 25 30

010

020

030

040

050

0

n

Tim

e R/T

ime R

cpp

Relative time required to compute the first n Fibonacci numbersThe compiled version is over 500 times faster as n increases

P. Papastamoulis (AUEB) R and C++ January 15, 2021 14 / 33

Page 21: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Take-away message

There is obvious merit in replacing simple R code with simple C++code.Switching implementation languages to C++ significantly boostsrun-time performanceHowever, no matter what the chosen implementation language, anexponential algorithm will eventually be inapplicable provided theargument n is large enough

P. Papastamoulis (AUEB) R and C++ January 15, 2021 15 / 33

Page 22: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Application 1: Gibbs updateClustering multivariate data using Bayesian MFA

Papastamoulis, 2018: Overfitting Bayesian mixtures of factoranalyzers with an unknown number of components, In CSDA

Papastamoulis, 2020: Clustering multivariate data using factoranalytic Bayesian Mixtures of Factor Analyzers, In Statistics andComputing

CRAN package available online athttps://CRAN.R-project.org/package=fabMix

0 5 10 15 20 25 30

−10

0−

500

5010

0

0 5 10 15 20 25 30

−10

00

100

200

P. Papastamoulis (AUEB) R and C++ January 15, 2021 16 / 33

Page 23: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Finite Mixtures of Factor Analyzers (MFA)

(xi ∣zi = k) = µk +Λkyi + εi

independent for i = 1, . . . ,n. Assume

yi ∼ Nq(0, Iq)

εi ∣zi = k ∼ Np(0,Σk) , independent for i = 1, . . . ,n

where Σk = diag(σ2k1, . . . , σ

2kp). Then

xi ∣zi = k,yi ∼ Np(µk +Λkyi ,Σk)

P(zi = k) = wk, independent for i = 1, . . . ,n

xi ∼K

∑k=1

wkNp(µk,ΛkΛTk +Σk),

where ∑Kk=1 wk = 1 and wk ⩾ 0, k = 1, . . . ,K.

P. Papastamoulis (AUEB) R and C++ January 15, 2021 17 / 33

Page 24: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

MCMC: Prior parallel tempering + Gibbs samplerInput: nchains,x,Kmax, α, β, γ,g,h

For all model parameterizations m ∈M and number of factors q ∈ Q

1 t = 0: set initial values2 t ← t + 1: run in parallel for j = 1, . . . ,nchains:

2.1 Ω(t,j) ∼ [Ω∣Λ(t−1,j)m ]

2.2 Λ(t,j)m ∼ [Λm ∣Ω(t,j),Σ(t−1,j)

m , x, y(t−1,j), z(t−1,j)]2.3 µ(t,j) ∼ [µ∣Λ(t,j)m ,Σ

(t−1,j)m , x, y(t−1,j), z(t−1,j)]

2.4 z(t,j) ∼ [z∣w(t−1,j),µ(t,j),Λ(t,j)m ,Σ

(t−1,j)m , x]

2.5 Σ(t,j)m ∼ [Σm ∣x, z(t,j),µ(t,j)]

2.6 w(t,j) ∼ [w∣z(t,j)]2.7 y(t,j) ∼ [y∣x, z(t,j),µ(t,j),Σ(t,j)m ,Λ

(t,j)m ].

3 Propose a swap between two chains j1 and j24 Repeat 2 and 35 For chain j = 1 compute BIC conditionally on the most probable

number of alive clusters.

Select the best (m,q) model for chain j = 1 according to BIC, conditionalon K(map).

P. Papastamoulis (AUEB) R and C++ January 15, 2021 18 / 33

Page 25: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Full conditionals for Λ,µ (step 2.2 + 2.3)

For k = 1, . . . ,K and r = 1, . . . ,p

µk ∣⋯ ∼ Np (A−1k Bk,A

−1k )

Λkr ⋅∣⋯ ∼ Nνr ([Ω−1+∆kr]

−1τ kr , [Ω

−1+∆kr]

−1)

where

Ak = nkΣ−1k +Ψ−1

Bk = ξΨ−1+Σ−1

k

n

∑i=1

I(zi = k) (xi −Λkyi)

∆kr =∑

ni=1 I(zi = k)yiy

Ti

σ2kr

τ kr =∑

ni=1 I(zi = k)(xir − µkr)yT

i

σ2kr

P. Papastamoulis (AUEB) R and C++ January 15, 2021 19 / 33

Page 26: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Application 1: Gibbs update for (Λ,µ) (step 2.2 + 2.3)

0

50

100

150

2.5 5.0 7.5 10.0q

time

method

R

Rcpp

0

100

200

300

400

2.5 5.0 7.5 10.0q

time

method

R

Rcpp

p = 100 p = 200

p: number of variablesq: number of factorsn = 1000 observations, K = 10 clusters

P. Papastamoulis (AUEB) R and C++ January 15, 2021 20 / 33

Page 27: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

The RcppArmadillo package

Armadillo library for C++ is a high quality linear algebra library for the C++ language provides efficient classes for vectors, matrices and cubes; dense and

sparse matrices are supported See http://arma.sourceforge.net/speed.html for timing

comparisons against other C++ matrix libraries Documentation http://arma.sourceforge.net/docs.html

RcppArmadillo package for Rcpp it includes the header files from the templated Armadillo library users do not need to install Armadillo itself in order to useRcppArmadillo

https://CRAN.R-project.org/package=RcppArmadillo

P. Papastamoulis (AUEB) R and C++ January 15, 2021 21 / 33

Page 28: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Back to our application: Gibbs update for Λ,µ

µ ∶ K × p matrix in RcppArmadillo class arma::mat

Λ ∶ p × q × K array (three-dimensional matrix) in RcppArmadillo class arma::cube

Other useful classes arma::vec for vectors Rcpp::List for list-like objects

We are going to define a function that accepts as input fixed hyperparameters sufficient statistics

and returns a list with two arguments mu Lambdas

which correspond to the Gibbs update of Λ,µ

P. Papastamoulis (AUEB) R and C++ January 15, 2021 22 / 33

Page 29: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

rFunction <- function(SigmaINV,suff_stat,OmegaINV,K,priorConst1,T_INV,v_r)

p <- dim(suff_stat$sx)[2]q <- dim(suff_stat$sy)[2]mu <- array(data = 0,

dim = c(K,p))Lambdas <- array(data = 0,

dim = c(K,p,q))...result <- list(

"Lambdas" = Lambdas,"mu" = mu)

return(result)

#include <Rcpp.h>// [[Rcpp::depends(RcppArmadillo)]]using namespace Rcpp;// [[Rcpp::export]]List cppFunction(arma::mat SigmaINV,Rcpp::List suff_stat,arma::mat OmegaINV,int K,arma::vec priorConst1,arma::mat T_INV,arma::vec v_r)

int p = SigmaINV.n_cols;arma::mat sy = suff_stat["sy"];int q = sy.n_cols;arma::mat mu(K,p);arma::cube Lambda(K,p,q);...List result;result["Lambdas"] = Lambdas;result["mu"] = mu;return(result);

P. Papastamoulis (AUEB) R and C++ January 15, 2021 23 / 33

Page 30: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 31: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 32: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 33: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 34: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()

Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 35: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()

Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 36: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 37: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 38: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)

N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 39: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 40: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Typical Matrix/Stats operations inside cppfunctionDetailed documentation available athttp://arma.sourceforge.net/docs.html

Initialize zero matrix A = arma::zeros(p,p);

Access rows 1, . . . , i and columns 1, . . . , j of matrixA( arma::span(0, i-1), arma::span(0, j-1) )

Matrix inversion inv(A);

Transpose of matrix A.t()Convert vector to matrix repmat(muMean,1,1).t()Matrix calculus A + B * C

Cube operations Lambda[ , ,k] Lambda.slice(k)

Compute Cholesky decomposition of matrix chol(Sigma)N (0,1) pseudorandom numbers M = arma::randn(1, p);

Single draw from Np(muMean,Sigma)repmat(muMean,1,1).t() + M * chol(Sigma)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 24 / 33

Page 41: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Application 2: Mixtures of Multinomial Logit models

We consider the problem of inferring an unknown number ofclusters in replicated multinomial dataEstimation of finite mixtures of multinomial distributions with orwithout covariatesThe potentially large number of parameters and the multimodalnature of the likelihood/posterior surface of mixture modelsimpose certain inferential and computational difficulties.Under a Bayesian setup, a stochastic gradient Markov chainMonte Carlo (MCMC) algorithm embedded within a prior paralleltempering scheme is devisedPapastamoulis and Karlis, 2021 (working paper)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 25 / 33

Page 42: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Application 2: Mixtures of Multinomial Logit Models(yi ,xi); i = 1, . . . ,nyi = (yi1, . . . ,yi;J+1) multinomial response (J + 1 categories)xi = (xi1, . . . , xiP) covariatesJoint pmf conditional on K clusters

f (y∣π,β,x) =n

∏i=1

K

∑k=1

πkS!

∏J+1j=1 yij!

J+1∏j=1

ygikjij IYJ (yi).

where

gikj =

⎧⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎩

expβ⊺kjxi

1 + ∑`⩽J

expβ⊺k`xi, j ⩽ J

11 + ∑

`⩽Jexpβ⊺k`xi

, j = J + 1(1)

for i = 1, . . . ,n; k = 1, . . . ,K.Number of parameters, conditional on K clustersd = K − 1 + KJ(P + 1)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 26 / 33

Page 43: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

MALA proposalThe Metropolis Adjusted Langevin Algorithm (MALA) (Girolami andCalderhead, 2011; Roberts and Tweedie, 1996) is based on thefollowing proposal mechanism

β = β(t) + ν∇ log f (β(t)∣y,x,z,p) +√

2νε, (2)

For k = 1, . . . ,K, j = 1, . . . ,J , p = 1, . . . ,P

∂ log f (β∣y,x,z,p)

∂βkjp=

n

∑i=1

zik(yij − Sgikj)xip −βkjp

τ2 (3)

Metropolis-Hastings acceptance probability

α(β(t), β∣z(t),π(t)) = min

⎧⎪⎪⎪⎨⎪⎪⎪⎩

1,f (y∣x,z(t), β,p(t))π(β)

f (y∣x,z(t),β(t),p(t))π(β(t))

P (β → β(t))

P (β(t) → β)

⎫⎪⎪⎪⎬⎪⎪⎪⎭

,

(4)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 27 / 33

Page 44: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Metropolis Adjusted Langevin Within-Gibbs MCMC

P. Papastamoulis (AUEB) R and C++ January 15, 2021 28 / 33

Page 45: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Benchmarking

0

200

400

12.5 15.0 17.5 20.0D

time

method

R

Rcpp

0

500

1000

1500

2000

12.5 15.0 17.5 20.0D

time

method

R

Rcpp

K = 3 K = 10

D: number of categoriesK: number of clustersn = 1000 observations, p = 5 covariates

P. Papastamoulis (AUEB) R and C++ January 15, 2021 29 / 33

Page 46: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Session/System Info

> sessionInfo()R version 4.0.3 (2020-10-10)Platform: x86_64-pc-linux-gnu (64-bit)Running under: Ubuntu 20.04.1 LTS

Memory 15,5 GiBCPU Intel Core i7-4790 CPU @ 3.60GHz × 8

P. Papastamoulis (AUEB) R and C++ January 15, 2021 30 / 33

Page 47: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Further remarks

Break your R code into smaller segmentsWithin each segment put effort to optimize the R code

Do you really need a for loop? Vectorize as much as you can

Locate parts of the code which take too much timeImplement these parts into RcppEnable parallelization for additional gains

parallel package foreach package

P. Papastamoulis (AUEB) R and C++ January 15, 2021 31 / 33

Page 48: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Welcome to the future :)

P. Papastamoulis (AUEB) R and C++ January 15, 2021 32 / 33

Page 49: Integrating R and C++ exemplified by stochastic gradient ... · Post-graduate Seminar AUEB Stat Seminars January 15, 2021 P. Papastamoulis (AUEB) R and C++ January 15, 20211/33. Overview

Eddelbuettel, D. (2013). Seamless R and C++ Integration with Rcpp. ISBN978-1-4614-6867-7. New York: Springer. doi: 10.1007/978-1-4614-6868-4.

Eddelbuettel, D. and R. François (2011). “Rcpp: Seamless R and C++ Integration”. In:Journal of Statistical Software 40.8, pp. 1–18. doi: 10.18637/jss.v040.i08.url: http://www.jstatsoft.org/v40/i08/.

Girolami, M. and B. Calderhead (2011). “Riemann manifold Langevin and HamiltonianMonte Carlo methods”. In: Journal of the Royal Statistical Society: Series B(Statistical Methodology) 73.2, pp. 123–214.

Papastamoulis, P. (2018). “Overfitting Bayesian mixtures of factor analyzers with anunknown number of components.”. In: Computational Statistics and Data Analysis124, pp. 220–234. doi: 10.1016/j.csda.2018.03.007.

— (2020). “Clustering multivariate data using factor analytic Bayesian mixtures withan unknown number of components”. In: Statistics and Computing 30.3,pp. 485–506.

Papastamoulis, P. and D. Karlis (2021). “Model based clustering of replicatedmultinomial data”. In: working paper.

Papastamoulis, P. and M. Rattray (2018). “A Bayesian model selection approach foridentifying differentially expressed transcripts from RNA sequencing data”. In:Journal of the Royal Statistical Society. Series C, Applied Statistics 67.1, p. 3.

Roberts, G. O. and R. L. Tweedie (1996). “Exponential Convergence of LangevinDistributions and Their Discrete Approximations”. In: Bernoulli 2.4, pp. 341–363.issn: 13507265. url: http://www.jstor.org/stable/3318418.

P. Papastamoulis (AUEB) R and C++ January 15, 2021 33 / 33