在三维空间中绘制两个双变量正态分布图及其轮廓。

7

我一直在使用 MASS 软件包进行操作,例如可以使用 image 和 par(new=TRUE) 绘制两个双变量正态分布图:

# lets first simulate a bivariate normal sample
library(MASS)
bivn <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1, .5, .5, 1), 2))
bivn2 <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1.5, 1.5, 1.5, 1.5), 2))

# now we do a kernel density estimate
bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 50)
bivn.kde2 <- kde2d(bivn2[,1], bivn[,2], n = 50)

# fancy perspective
persp(bivn.kde, phi = 45, theta = 30, shade = .1, border = NA)
par(new=TRUE)
persp(bivn.kde2, phi = 45, theta = 30, shade = .1, border = NA)

这样看起来并不太好,我想我只能调整坐标轴和其他内容。但是,如果我尝试使用相似的方法来处理等高线图,它们并不会重叠。它们只是被替换了:

# fancy contour with image
image(bivn.kde); contour(bivn.kde, add = T)
par(new=TRUE)
image(bivn.kde2); contour(bivn.kde, add = T)

这是我想要的最佳方法吗?还是我只是自己把事情搞得很难? 欢迎任何建议。谢谢!


1
我不太确定你想看什么?两个密度之间的差异吗?为什么不将它们并排绘制出来呢? - Seth
我正在研究杰弗里斯-马图西塔距离的行为,想要看到两个分布如何重叠以及每个“变量”的j-m距离如何移动,以及两个类别(即两个分布)的分类如何恶化。 - JEquihua
1个回答

10

也许你可以使用rgl库。它允许你创建交互式的三维图表。

require(rgl)

col1 <- rainbow(length(bivn.kde$z))[rank(bivn.kde$z)]
col2 <- heat.colors(length(bivn.kde2$z))[rank(bivn.kde2$z)]
persp3d(x=bivn.kde, col = col1)
with(bivn.kde2, surface3d(x,y,z, color = col2))

在此输入图片描述

如果您想绘制两个表面之间的差异,则可以执行以下操作:

res <- list(x = bivn.kde$x, y = bivn.kde$y, z = bivn.kde$z - bivn.kde2$z)
col3 <- heat.colors(length(res$z))[rank(res$z)]
persp3d(res, col = col3)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接