Code Monkey home page Code Monkey logo

cmvnorm's Introduction

The complex multivariate Gaussian distribution in R

To cite the cmvnorm package in publications please use Hankin (2015). Consider the (zero mean) multivariate Gaussian distribution with probability density function

f{\left({\mathbf x};\Sigma\right)} = \frac{ \exp\left(-\frac{1}{2}{\mathbf x}^T\Sigma^{-1}{\mathbf x}\right) }{ \sqrt{\left|2\pi\Sigma\right|} }, \qquad{\mathbf x}\in{\mathbb R}^n

where \Sigma is an n\times n positive-definite variance matrix. Now compare the complex version with \Gamma Hermitian positive-definite:

f{\left({\mathbf z};\Gamma\right)} = \frac{ \exp\left( -{\mathbf z}^\dag\Gamma^{-1}{\mathbf z}\right) }{ \left|\pi\Gamma\right| }, \qquad{\mathbf z}\in\mathbb{C}^n.

See how much nicer the complex version is! No awkward, unsightly factors of two and no inconvenient square roots. This is essentially due to Gauss’s integral operating more cleanly over the complex plane than the real line:

{ \int_\mathbb{C}e^{-z^\dag z}\dz= \iint_{(x,y)\in\mathbb{R}^2}\\\\\\\\\\\\\\ e^{-(x^2+y^2)}\dx\dy= \int_{\theta=0}^{2\pi}\int_{r=0}^\infty e^{-r^2}r\dr\d\theta= 2\pi\int_{r=0}^\infty e^{-r^2}r\dr=\pi. }

It can be shown that {\mathbb E}({\mathbf z}{\mathbf z}^\dag)=\Gamma, so \Gamma really is the variance of the distribution. We can also introduce a nonzero mean, {\mathbf m}\in{\mathbb C}^n in the natural way. The cmvnorm package furnishes some R functionality for dealing with the complex multivariate Gaussian distribution.

The package in use

The simplest case would be the univariate standard complex normal distribution, that is is a complex random variable z with PDF \exp(z^*z)/\pi. Random samples are given by rcnorm():

rcnorm(10)
#>  [1]  0.8930435+0.5399421i -0.2306818-0.5649849i  0.9403101-0.8115161i
#>  [4]  0.8997434-0.2046802i  0.2931958-0.2115770i -1.0889091-0.2909821i
#>  [7] -0.6565960+0.1783489i -0.2083988-0.6306835i -0.0040780+0.3080746i
#> [10]  1.7003467-0.8750718i

Observations are circularly symmetric in the sense that z has the same distribution as e^{i\theta}z for any \theta\in{\mathbb R}, as we may verify visually:

par(pty="s")
plot(rcnorm(10000),asp=1,xlim=c(-3,3),ylim=c(-3,3),pch=16,cex=0.2)

We may sample from this distribution and verify that it has zero mean and unit variance:

z <- rcnorm(1e6)
mean(z)   # zero, subject to sample error
#> [1] -7.22711e-05-1.648871e-04i
var(z)    # one, subject to sample error
#> [1] 1.000039

Note that the real and imaginary components of z have variance 0.5:

z <- rcnorm(1e6)

var(Re(z))
#> [1] 0.4990334
var(Im(z))
#> [1] 0.500692

We may sample from the multivariate case similarly. Suppose {\mathbf m}=(1,i)^T and \Gamma=\left(\begin{array}{cc}3&i\-i&2\end{array}\right):

tm <- c(1,1i)  # true mean
tS <- matrix(c(3,1i,-1i,2),2,2)  # true variance
rcmvnorm(10,mean=tm, sigma=tS)
#>                        [,1]                  [,2]
#>  [1,]  0.7686256-1.0741918i -0.7474151+2.2160427i
#>  [2,]  0.7708602+1.1108247i  0.6358600+1.6525006i
#>  [3,] -1.6582296+0.4285872i  0.5232071+0.2267081i
#>  [4,] -0.8116523+0.7761156i  0.3370565-1.1517968i
#>  [5,]  0.3813992-0.3297815i -0.7391635+1.0239374i
#>  [6,] -1.0306205+0.1980098i -0.2640635+0.0266939i
#>  [7,]  0.0626871-0.1067497i -0.0584202+1.2610072i
#>  [8,] -0.7007527+0.3104665i  0.6747789-0.3943374i
#>  [9,] -0.1592596-1.5369111i  0.9189975-1.1530648i
#> [10,]  1.6842132+0.2346989i  0.9708974+1.5574747i

We may perform elementary inference. For the mean and variance we can calculate their maximum likelihood estimates:

n <- 1e6  # sample size
z <- rcmvnorm(n,mean=tm, sigma=tS)
colMeans(z)   # should be close to tm=[1,i]
#> [1]  1.000125-0.000710i -0.000733+1.002398i
z <- scale(z,scale=FALSE) # sweep out the mean
cprod(z)/n  # should be close to tS
#>                   [,1]              [,2]
#> [1,] 3.001524+0.00000i 0.001068+1.00205i
#> [2,] 0.001068-1.00205i 2.000310+0.00000i

Further information

For further information, see the package vignette: type

vignette("cmvnorm")

at the R command line.

References

Hankin, R. K. S. 2015. “The complex multivariate Gaussian distribution”. The R Journal, 7(1):73-80

cmvnorm's People

Contributors

robinhankin avatar

Stargazers

wjchen avatar Xiangyun Huang avatar

Watchers

James Cloos avatar  avatar

Forkers

junjiewang-ai

cmvnorm's Issues

vignettebuilder issue

email from Kurt:

Dear maintainers,

This concerns the CRAN packages

[snip]
assertable brunnermunzel cmvnorm datarobot macleish
[snip]

maintained by one of you:

[snip]
Robin K. S. Hankin [email protected]: cmvnorm
[snip]

These seem to have VignetteBuilder DESCRIPTION entries which give
package not providing a vignette engine, see below.

Can you pls fix, and submit a new version to CRAN in the next 2 weeks?

Best
-k

random Hermitian matrices

A function to create random positive-definite Hermitian matrices would be very very useful:

> rherm <- function(n,m=n){cprod(matrix(rcnorm(n*m),m,n))}
> rherm(3)
                      [,1]                  [,2]                 [,3]
[1,]  0.4972461+0.0000000i -0.3132610+0.0474761i 0.1256727+0.7946277i
[2,] -0.3132610-0.0474761i  0.9738342+0.0000000i 0.7634426+0.2033439i
[3,]  0.1256727-0.7946277i  0.7634426-0.2033439i 6.2980289+0.0000000i
> eigen(rherm(3))
eigen() decomposition
$values
[1] 3.9687974 0.6429547 0.3039399

$vectors
                      [,1]                  [,2]                  [,3]
[1,] -0.6571773+0.0000000i  0.5827679+0.0000000i -0.4780163+0.0000000i
[2,]  0.6992823-0.2127543i  0.6254672-0.1587247i -0.1988432+0.0989876i
[3,]  0.0757431-0.1676926i -0.3065810+0.3872815i -0.4778963+0.7026937i

> 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.