Is there a difference between skew_normal & brms::rskew_normal?

When trying to find the suitable priors for my models, I’d like to quickly check how the prior would look like by plotting it e.g. hist(rskew_normal(n = n, mu = 4, sigma = 0.5, alpha = -10)) but I found that the distribution that I create like this and the distribution that I get when running a brms model with sample_prior = "only" are not the same when I want a skew normal distribution. Am I setting the paramters wrong? Are they different? Do they priors influence each other some how?

Here is an example:

and the reproducible code:

# Library
library(brms)
library(ggplot2)

# Seed
set.seed(20230307)

# Generate data with rskew_normal
n     <- 4000
dists <- data.frame(Value = rskew_normal(n = n, mu = 4, sigma =  0.5, alpha = -10), 
                    Method = rep("rskew_normal", n))

# Create a random data set to fit a model
fake_data <- data.frame(x = rnorm(100), y = rnorm(100))

# Set brms priors
test_prior  <- c(prior(skew_normal(4, 0.5, -10), class = "b"))

# Fit brms model
currentModel <- brm(y ~ x, 
                    data = fake_data, 
                    prior = test_prior, 
                    sample_prior = "only", 
                    seed = 1234,
                    backend = "cmdstanr",
                    silent = 2,
                    refresh = 0)

# Extract the prior from the fit
dists <- rbind(dists, data.frame(Value = as_draws_df(currentModel)$b_x, Method = rep('brms_fit', ndraws(currentModel))))

# Visualise the difference
ggplot(dists, aes(x = Value, fill = Method)) + 
  geom_density(alpha = 0.5) +
  labs(title = "Difference between rskew_normal & skew_normal")

For comparison, I also did the same for the normal distribution, which looks like expected.

Okay, I found out myself that stan uses SkewNormal(y \mid \xi, \omega, \alpha) whileI used \mu, \sigma, \alpha in rskew_normal after using \xi, \omega, \alpha instead it works as intended.

1 Like