我正在运行混合数据的模拟。我的功能比高斯分布更难。因此,在这里,我将我的问题简化为高斯形式。也就是说,如果我模拟这样的混合数据:
N=2000
U=runif(N, min=0,max=1)
X = matrix(NA, nrow=N, ncol=2)
for (i in 1:N){
if(U[i] < 0.7){
X[i,] <- rnorm(1,0.5,1)
} else {
X[i,] <- rnorm(1,3,5)
}
}
如何为每个群集或分布创建具有不同颜色和形状(绘图点类型)的散点图?我想手动操作,因为我的功能很复杂。我试过plot(X[,1],X[,2],col=c("red","blue"))
,但它不起作用。
答案 0 :(得分:1)
这是我得到的,但我不确定你是否正在寻找 - 这两个集群的观察位置完全相同。
library(tidyverse)
df <- data.frame(X = X, U = U)
df <- gather(df, key = cluster, value = X, -U)
ggplot(df, aes(x = X, y = U, colour = cluster)) + geom_point() + facet_wrap(~cluster)
编辑:我似乎并没有理解您要映射到散点图上的内容,因此我将指出您需要如何对数据进行整形,以便使用正确的X创建如上图所示的图表。 Y坐标:
head(df)
U cluster X
1 0.98345408 X.1 2.3296047
2 0.33939935 X.1 -0.6042917
3 0.66715421 X.1 -2.2673422
4 0.06093674 X.1 2.4007376
5 0.48162959 X.1 -2.3118850
6 0.50780007 X.1 -0.7307929
所以你想要一个变量用于Y坐标(我在这里使用变量U
),一个变量用于X坐标(在这里使用X
),第三个变量指示是否观察属于集群1或集群2(此处为变量cluster
)。
答案 1 :(得分:1)
我认为这就是你想要的。请注意,我必须在这里做一些猜测来弄清楚发生了什么,因为你的示例代码似乎有错误,你没有在每一行中生成不同的x1和x2值:
N=2000
U=runif(N, min=0,max=1)
X = matrix(NA, nrow = N, ncol=2)
for (i in 1:N){
if(U[i] < 0.7){
# You had rnorm(n=1, ...) which gives 2 identical values in each row
# Change that to 2 and you get different X1 and X2 values
X[i,] <- rnorm(2, 0.5, 1)
} else {
X[i,] <- rnorm(2, 3, 5)
}
}
df = data.frame(
source = ifelse(U < 0.7, "dist1", "dist2"),
x = X[, 1],
y = X[, 2]
)
library(ggplot2)
ggplot(df, aes(x = x, y = y, colour = source, shape = source)) +
geom_point()
结果: