Issues with mixtures of multivariate normal

The greta documentation provides this example for mixtures of univariate normals

weights can also be an array, giving different mixing weights

for each observation (first dimension must be number of components)

dim <- c(5, 4)
weights <- uniform(0, 1, dim = c(2, dim))
b <- mixture(normal(1, 1, dim = dim),
normal(-1, 1, dim = dim),
weights = weights)

While this code works for univariate normal, I failed to do so for two multivariate normal mixture. Here is a toy code

weights <- uniform(0,1,dim= c(2,10))
bb <- mixture(multivariate_normal(t(c(3,-3)), diag(1,2),n_realisations = 10),
multivariate_normal(t(c(-3,3)), diag(1,2),n_realisations = 10),
weights = weights)

produces the error
Error in initialize():
! The dimension of weights must be either “2x1” or “2x”
but was “”
Run rlang::last_trace() to see where the error occurred.

However, the code works if the same mixing weights are used for all realisations

weights <- uniform(0,1,dim= 2)
bb <- mixture(multivariate_normal(t(c(3,-3)), diag(1,2),n_realisations = 10),
multivariate_normal(t(c(-3,3)), diag(1,2),n_realisations = 10),
weights = weights)

I have tried various way to specify the weights and its dimensions but was not able to specify a model with different mixing weights for each observation.

I will very much appreciate suggestions on how to address this issue.

Thank you.

Sanjib Basu

1 Like

Hi @sanjib!

Thanks for posting - just to confirm I got the same error:

# weights can also be an array, giving different mixing weights
# for each observation (first dimension must be number of components)
library(greta)
#> 
#> Attaching package: 'greta'
#> The following objects are masked from 'package:stats':
#> 
#>     binomial, cov2cor, poisson
#> The following objects are masked from 'package:base':
#> 
#>     %*%, apply, backsolve, beta, chol2inv, colMeans, colSums, diag,
#>     eigen, forwardsolve, gamma, identity, rowMeans, rowSums, sweep,
#>     tapply
dim <- c(5, 4)
weights <- uniform(0, 1, dim = c(2, dim))
#> ℹ Initialising python and checking dependencies, this may take a moment.
#> ✔ Initialising python and checking dependencies ... done!
#> 
b <- mixture(normal(1, 1, dim = dim),
             normal(-1, 1, dim = dim),
             weights = weights)

# While this code works for univariate normal, I failed to do so for two multivariate normal mixture. Here is a toy code

weights <- uniform(0,1,dim= c(2,10))
bb <- mixture(multivariate_normal(t(c(3,-3)), diag(1,2),n_realisations = 10),
              multivariate_normal(t(c(-3,3)), diag(1,2),n_realisations = 10),
              weights = weights)
#> Error in `initialize()`:
#> ! The dimension of weights must be either "2x1" or "2x"
#> but was ""

# produces the error
# Error in initialize():
#   ! The dimension of weights must be either “2x1” or “2x”
# but was “”
# Run rlang::last_trace() to see where the error occurred.

# However, the code works if the same mixing weights are used for all realisations

weights <- uniform(0,1,dim= 2)
bb <- mixture(multivariate_normal(t(c(3,-3)), diag(1,2),n_realisations = 10),
              multivariate_normal(t(c(-3,3)), diag(1,2),n_realisations = 10),
              weights = weights)
bb
#> greta array <variable following a mixture distribution>
#>       [,1] [,2]
#>  [1,]  ?    ?  
#>  [2,]  ?    ?  
#>  [3,]  ?    ?  
#>  [4,]  ?    ?  
#>  [5,]  ?    ?  
#>  [6,]  ?    ?  
#>  [7,]  ?    ?  
#>  [8,]  ?    ?  
#>  [9,]  ?    ?  
#> [10,]  ?    ?
#> 
#> ℹ 10 more values
#> Use `print(n = ...)` to see more values

# I have tried various way to specify the weights and its dimensions but was not able to specify a model with different mixing weights for each observation.

Created on 2025-01-10 with reprex v2.1.1

Session info

sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.4.2 (2024-10-31)
#>  os       macOS Sequoia 15.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Australia/Hobart
#>  date     2025-01-10
#>  pandoc   3.2.1 @ /opt/homebrew/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version  date (UTC) lib source
#>  base64enc     0.1-3    2015-07-28 [1] CRAN (R 4.4.0)
#>  callr         3.7.6    2024-03-25 [1] CRAN (R 4.4.0)
#>  cli           3.6.3    2024-06-21 [1] CRAN (R 4.4.0)
#>  coda          0.19-4.1 2024-01-31 [1] CRAN (R 4.4.0)
#>  codetools     0.2-20   2024-03-31 [2] CRAN (R 4.4.2)
#>  crayon        1.5.3    2024-06-20 [1] CRAN (R 4.4.0)
#>  digest        0.6.37   2024-08-19 [1] CRAN (R 4.4.1)
#>  evaluate      1.0.1    2024-10-10 [1] CRAN (R 4.4.1)
#>  fansi         1.0.6    2023-12-08 [1] CRAN (R 4.4.0)
#>  fastmap       1.2.0    2024-05-15 [1] CRAN (R 4.4.0)
#>  fs            1.6.5    2024-10-30 [1] CRAN (R 4.4.1)
#>  future        1.34.0   2024-07-29 [1] CRAN (R 4.4.0)
#>  globals       0.16.3   2024-03-08 [1] CRAN (R 4.4.0)
#>  glue          1.8.0    2024-09-30 [1] CRAN (R 4.4.1)
#>  greta       * 0.5.0    2024-11-06 [1] local
#>  hms           1.1.3    2023-03-21 [1] CRAN (R 4.4.0)
#>  htmltools     0.5.8.1  2024-04-04 [1] CRAN (R 4.4.0)
#>  jsonlite      1.8.9    2024-09-20 [1] CRAN (R 4.4.1)
#>  knitr         1.49     2024-11-08 [1] CRAN (R 4.4.1)
#>  lattice       0.22-6   2024-03-20 [2] CRAN (R 4.4.2)
#>  lifecycle     1.0.4    2023-11-07 [1] CRAN (R 4.4.0)
#>  listenv       0.9.1    2024-01-29 [1] CRAN (R 4.4.0)
#>  magrittr      2.0.3    2022-03-30 [1] CRAN (R 4.4.0)
#>  Matrix        1.7-1    2024-10-18 [2] CRAN (R 4.4.2)
#>  parallelly    1.39.0   2024-11-07 [1] CRAN (R 4.4.1)
#>  pillar        1.9.0    2023-03-22 [1] CRAN (R 4.4.0)
#>  pkgconfig     2.0.3    2019-09-22 [1] CRAN (R 4.4.0)
#>  png           0.1-8    2022-11-29 [1] CRAN (R 4.4.0)
#>  prettyunits   1.2.0    2023-09-24 [1] CRAN (R 4.4.0)
#>  processx      3.8.4    2024-03-16 [1] CRAN (R 4.4.0)
#>  progress      1.2.3    2023-12-06 [1] CRAN (R 4.4.0)
#>  ps            1.8.1    2024-10-28 [1] CRAN (R 4.4.1)
#>  R6            2.5.1    2021-08-19 [1] CRAN (R 4.4.0)
#>  Rcpp          1.0.13-1 2024-11-02 [1] CRAN (R 4.4.1)
#>  reprex        2.1.1    2024-07-06 [1] CRAN (R 4.4.0)
#>  reticulate    1.40.0   2024-11-15 [1] CRAN (R 4.4.1)
#>  rlang         1.1.4    2024-06-04 [1] CRAN (R 4.4.0)
#>  rmarkdown     2.29     2024-11-04 [1] CRAN (R 4.4.1)
#>  rstudioapi    0.17.1   2024-10-22 [1] CRAN (R 4.4.1)
#>  sessioninfo   1.2.2    2021-12-06 [1] CRAN (R 4.4.0)
#>  tensorflow    2.16.0   2024-04-15 [1] CRAN (R 4.4.0)
#>  tfruns        1.5.3    2024-04-19 [1] CRAN (R 4.4.0)
#>  utf8          1.2.4    2023-10-22 [1] CRAN (R 4.4.0)
#>  vctrs         0.6.5    2023-12-01 [1] CRAN (R 4.4.0)
#>  whisker       0.4.1    2022-12-05 [1] CRAN (R 4.4.0)
#>  withr         3.0.2    2024-10-28 [1] CRAN (R 4.4.1)
#>  xfun          0.49     2024-10-31 [1] CRAN (R 4.4.1)
#>  yaml          2.3.10   2024-07-26 [1] CRAN (R 4.4.0)
#> 
#>  [1] /Users/nick/Library/R/arm64/4.4/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/library
#> 
#> ─ Python configuration ───────────────────────────────────────────────────────
#>  python:         /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/bin/python
#>  libpython:      /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/libpython3.10.dylib
#>  pythonhome:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2:/Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2
#>  version:        3.10.14 | packaged by conda-forge | (main, Mar 20 2024, 12:51:49) [Clang 16.0.6 ]
#>  numpy:          /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.10/site-packages/numpy
#>  numpy_version:  1.26.4
#>  tensorflow:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.10/site-packages/tensorflow
#>  
#>  NOTE: Python version was forced by use_python() function
#> 
#> ──────────────────────────────────────────────────────────────────────────────

This error message wasn’t quite complete, there was actually a bug in the code so I’ve fixed that up - see https://github.com/greta-dev/greta/issues/757

But essentially the weights needs to be 2x10x2 not 2x10:

library(greta)
weights <- uniform(0,1,dim= c(2,10, 2))
bb <- mixture(multivariate_normal(t(c(3,-3)), diag(1,2),n_realisations = 10),
              multivariate_normal(t(c(-3,3)), diag(1,2),n_realisations = 10),
              weights = weights)

Let me know if that helps?