0

我正在使用kde2dpersp绘制两个变量 x 和 y 的联合密度。

我该如何执行以下操作:

1) 根据 x 和 y 的值,我想给图上色。即对于值 x>.5 和 y>.5,颜色应该是蓝色,对于 x<=.5 和 y<=.5,颜色应该是红色。目前整个图表都是蓝色的(见下面的代码)。

2)如何给表面以下的区域着色(即概率质量)?我也想分别用蓝色和红色给它上色。

library(MASS)
    i<-1
    x<-NULL 
    y<-NULL 
    while (i<=30) {
      x1 <- rnorm(1, 0, 1)
      x2 <- rnorm(1, 0, 1)
      x <- c(x, x1)
      y<-c(y,x2)
      i<-i+1 
    }
    den3d <- kde2d(x, y)
    persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", shade = 0.1, col = "blue", box=TRUE)

帮助表示赞赏。

4

1 回答 1

1

这回答了第一个问题:

x <- rnorm(30)
y <- rnorm(30)

library(MASS)
den3d <- kde2d(x, y)

cols <- c("blue", "red")[(outer(na.omit(filter(den3d$x>0.5,c(1,1), sides=1)),
                                na.omit(filter(den3d$y>0.5,c(1,1), sides=1)),
                                "+")==4) + 1]

persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", 
        shade = 0.1, col = cols, box=TRUE, phi=90)

在此处输入图像描述

请注意,只有当其 x 和 y 值在整个 facet 范围内 > 0.5 时,facet 才会显示为红色。

我认为你不应该做你在第二个问题中描述的事情。无论如何,persp不​​是为此而设计的。

编辑:那里发生了什么?

den3d$x是绘图的 x 值。如果两端的 x 值 > 0.5,我们需要检查每个方面。我们可以通过计算这些值的总和来做到这一点。这可以使用filter(参见help("filter")文档)来完成:

filter(den3d$x>0.5,c(1,1), sides=1)
#[1] NA  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  2  2  2  2  2  2

逻辑输入值被自动强制为 0 和 1 filter。结果值 0 表示没有任何一端 > 0.5,1 表示一端 > 0.5,2 表示两端 > 0.5。我们NA需要删除。

然后我们也这样做den3d$y并计算外部总和,这可能会导致值介于 0 和 4 之间。0 和 4 分别表示构面的所有四个边界都不是并且 > 0.5。值 1 到 3 表示 1 到 3 个边界 > 0.5。然后,我们将所有值 4(我们希望将其涂成“红色”的值)设置为TRUE,而将其他值设置FALSE==. 由于我们需要 1FALSE和 2 的值TRUE来对颜色向量进行子集化,因此我们(自动)将逻辑值强制为 0 和 1 并加 1。

就是这样。

于 2013-11-22T12:21:51.980 回答