R:拟合双变量混合物的每个分量的等高线图

时间:2017-08-31 20:41:12

标签: r plot

请注意:我现在只使用R两天。

我有一个如下所示的数据集data

plot(data, pch=20, xlim=c(-2,3), ylim=c(-1,2))

enter image description here

我使用mixsmsn软件包来拟合二元偏斜正态分布的混合:

sn2 <- smsn.mmix(data, nu=3, g=2, get.init=TRUE, criteria=TRUE, group=TRUE, family="Skew.normal", error=1e-08, iter.max=10000)

我可以这样绘制(为什么pch=20不起作用?):

mix.contour(data, sn2, pch=20, xlim=c(-2,3), ylim=c(-1,2), levels=c(0.1,0.25,0.5))

enter image description here

如何实现以下目标?

我想在每个组件的一半高度分别绘制一个轮廓。也就是说,它是p f_1(x,y) + (1-p) f_2(x,y)形式的混合分布(f_i是_i_th skew-normal组件的pdf);我想要(在散点图上)绘制f_1分量在其高度的一半处的轮廓,以及在其高度的一半处与f_2相关的第二轮廓;我希望结果看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:0)

使用fMultivar包,我想出了这个:

X <- data

sn2 <- smsn.mmix(X, nu=3, g=2, get.init=TRUE, criteria=TRUE, group=TRUE, family="Skew.normal", error=1e-08, iter.max=10000)

mu1 <- sn2$mu[[1]]
sigma1 <- sn2$Sigma[[1]]
alpha1 <- c(sn2$shape[[1]][1], sn2$shape[[1]][2])
p1 <- sn2$pii[[1]]

mu2 <- sn2$mu[[2]]
sigma2 <- sn2$Sigma[[2]]
alpha2 <- c(sn2$shape[[2]][1], sn2$shape[[2]][2])
p2 <- sn2$pii[[2]]

N <- 101
x <- seq(min(X[, 1]), max(X[, 1]), l=N)
y <- seq(min(X[, 2]), max(X[, 2]), l=N)
u <- grid2d(x, y)$x
v <- grid2d(x, y)$y
XY <- cbind(u, v)

Z1 <- matrix(p1*dmsn(XY, mu1, sigma1, alpha1), ncol=N)
Z2 <- matrix(p2*dmsn(XY, mu2, sigma2, alpha2), ncol=N)

c1 <- 0.5*max(Z1)
c2 <- 0.5*max(Z2)

plot(X, pch=20, xlim=c(-2,3), ylim=c(-1,2))

contour(x, y, Z1, add=TRUE, col="red",   lwd=3, levels=c(c1), labels="")
contour(x, y, Z2, add=TRUE, col="green", lwd=3, levels=c(c2), labels="")

enter image description here