Reputation: 53
I am trying to get some nice contour plots of various Copulas with Gaussian marginals, but somehow I do not at all get what I would expect - what am I doing wrong ?
My R code:
library(copula)
library(mvtnorm)
#Gaussian Density & distribution
G_copula = norm.cop <- normalCopula(0.70)
cp <- contour(G_copula, dCopula, n=200, nlevels=20, delta=0.01)
persp(G_copula, dCopula)
contour(cp$x,cp$y,cp$z)
contour(qnorm(cp$x),qnorm(cp$y),cp$z)
What I would like to get is something like this
Upvotes: 1
Views: 347
Reputation: 84659
If you want the contours plot of the copula with margins N(0,1) and N(0,1), one option is to "manually" define its density:
library(copula)
cop <- normalCopula(0.7)
# density of the bivariate distribution with copula 'cop' and margins N(0,1), N(0,1)
f <- function(x, y) {
dCopula(c(pnorm(x), pnorm(y)), cop) * dnorm(x) * dnorm(y)
}
Then you can use the usual contour
function.
But it's easier to create this distribution with mvdc
:
library(copula)
mv <- mvdc(
normalCopula(0.7), margins = c("norm", "norm"),
paramMargins = list(list(mean = 0, sd = 1), list(mean = 0, sd = 1))
)
Then you can directly call contour
on this multivariate distribution:
contour(mv, dMvdc, xlim = c(-3, 3), ylim = c(-3, 3), asp = 1)
Upvotes: 2
Reputation: 859
Based on the example you've provided, this plot you are trying to recreate just looks like the bivariate normal distribution, which is used to create your copula. You can create a contour plot of the bivariate normal distribution, matching the parameters you used for your copula, as follows:
library(ggplot2)
mu <- c(0, 0)
sigma <- matrix(c(1, 0.7, 0.7, 1), 2, 2) # Use a correlation of 0.7, matching your copula
bivariate_normal <- rmvnorm(100000, mean = mu, sigma = sigma)
colnames(bivariate_normal) <- c("x", "y")
df <- tibble::as_tibble(bivariate_normal)
df |>
ggplot(aes(x = x, y = y)) +
geom_density_2d() +
labs(title = "Bivariate Normal Distribution (Correlation = 0.7)",
x = "X", y = "Y")
Upvotes: 0