我正在使用 kde2d 和 persp 绘制两个变量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)
非常感谢帮助。
答案 0 :(得分: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值> 1,则小平面仅显示为红色。在整个方面范围内为0.5。
我认为你不应该按照你在第二个问题中描述的那样做。无论如何,persp
不是为此设计的。
编辑:那里发生了什么?
den3d$x
是绘图的x值。如果两端的x值> 1,我们需要检查每个方面。 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
逻辑输入值由filter
自动强制转换为0和1。得到的值0表示&gt;在任何一端没有0.5,1表示>一端为0.5,另一端为2表示>两端都是0.5。我们需要删除NA
。
然后我们也为den3d$y
执行此操作并计算外部总和,这可能导致0到4之间的值.0和4表示构面的所有四个边界都不是并且是>分别为0.5。值1至3表示1至3个边界> 0.5。我们使用TRUE
将所有值4(我们想要将颜色“红色”)设置为FALSE
,将其他值设置为==
。由于我们需要FALSE
的值为1而TRUE
的值为2才能对颜色向量进行子集化,因此我们(自动)将逻辑值强制为0和1并添加1.
就是这样。