答案 0 :(得分:0)
以下方法怎么样:由于您的变量处于相似的度量范围(例如Likert规模),因此您可以显示每个变量在每个群集中的分布(例如箱形图),并通过使用相同的轴限制直观地比较它们的分布在每个群集上。
这可以通过将数据放入适当的格式并使用ggplot2
包来生成图来完成。如下所示。
生成的数据包含四个非负整数变量和一个具有3个簇的簇变量。
library(ggplot2)
set.seed(1717) # make the simulated data repeatable
N = 100
nclusters = 3
cluster = as.numeric( cut(rnorm(N), breaks=nclusters, label=seq_len(nclusters)) )
df = data.frame(cluster=cluster,
x1=floor(cluster + runif(N)*5),
x2=floor(runif(N)*5),
x3=floor((nclusters-cluster) + runif(N)*5),
x4=floor(cluster + runif(N)*5))
df$cluster = factor(df$cluster) # define cluster as factor to ease plotting code below
tail(df)
table(df$cluster)
其输出是:
cluster x1 x2 x3 x4
95 2 5 2 5 2
96 3 5 4 0 3
97 3 3 3 1 7
98 2 5 4 3 3
99 3 6 1 1 7
100 3 5 1 2 5
1 2 3
15 64 21
即,在100个模拟案例中,数据包含聚类1中的15个案例,聚类2中的64个案例,聚类3中的21个案例。
这里,我们使用reshape()
包中的stats
将数据集从宽到长转置,以便四个数值变量(x1
,x2
,{{1} },x3
)放在一列中,适用于为四个变量中的每一个生成一个箱形图,然后将其按聚类变量分组。
x4
其输出是:
vars2transpose = c("x1", "x2","x3", "x4")
df.long = reshape(df, direction="long", idvar="id",
varying=list(vars2transpose),
timevar="var", times=vars2transpose, v.names="value")
head(df.long)
table(df.long$cluster)
请注意,由于数据现在采用转置的长格式,因此每个聚类中的案例数增加了4倍(即数字变量的数量)。
我们为每个变量 cluster var value id
1.x1 1 x1 5 1
2.x1 1 x1 3 2
3.x1 3 x1 5 3
4.x1 1 x1 1 4
5.x1 2 x1 3 5
6.x1 1 x1 2 6
1 2 3
60 256 84
,x1
,x2
,x3
绘制水平箱线图,以显示它们在每个群集中的分布,并用连接的红叉标记平均值(您所追求的轨迹)。
x4
图形可能会挤满您拥有的许多变量,因此您可能需要:
gg <- ggplot(df.long, aes(x=var, y=value))
gg + facet_grid(cluster ~ ., labeller=label_both) +
geom_boxplot(aes(fill=cluster)) +
stat_summary(fun.y="mean", geom="point", color="red", pch="x", size=3) +
stat_summary(fun.y="mean", geom="line", color="red", aes(group=1)) +
coord_flip() # swap the x and y axis to make boxplots horizontal instead of vertical
行来显示垂直框图coord_flip()
行来显示连接的红叉。如果要在不同聚类中并排比较每个变量,则可以按以下方式交换分组和x轴变量:
geom_boxplot()