最好的方法是在基于R中1个变量的数据集中查找相似组?

2skhul33  于 2022-12-20  发布在  其他
关注(0)|答案(3)|浏览(125)
gfg_data <- data.frame(
  year = c(2019, 2019, 2019, 2020, 2020, 2020, 2021, 2021, 2021, 2022, 2022, 2022),
  Timings = c(5, 6, 4, 2, 3, 4, 11, 13, 15, 14, 17, 12)
)

与我使用的数据集相比,这是一个简化得多的数据集。本质上,我希望找出在时间上最相似的年份。因此,我希望能够看到2019年和2020年相似,2021/2022年相似。我的原始数据集有500个变量,所以它不会像浏览数据并记下相似之处那么简单。

mf98qq94

mf98qq941#

一种方法是使用层次聚类,例如,hclust使用k=2

cbind(gfg_data, grp = cutree(hclust(dist(gfg_data$Timings)), k=2))
   year Timings grp
1  2019       5   1
2  2019       6   1
3  2019       4   1
4  2020       2   1
5  2020       3   1
6  2020       4   1
7  2021      11   2
8  2021      13   2
9  2021      15   2
10 2022      14   2
11 2022      17   2
12 2022      12   2

或者具有高度h=7,该高度可以通过检查实际的聚类而找到(红线在7处)。

plot(hclust(dist(gfg_data$Timings)))
lines(c(1,10), c(7,7), col="red", lw=3)

cbind(gfg_data, grp = cutree(hclust(dist(gfg_data$Timings)), h=7))
   year Timings grp
1  2019       5   1
2  2019       6   1
3  2019       4   1
4  2020       2   1
5  2020       3   1
6  2020       4   1
7  2021      11   2
8  2021      13   2
9  2021      15   2
10 2022      14   2
11 2022      17   2
12 2022      12   2
rmbxnbpk

rmbxnbpk2#

给定距离5(不含)作为聚类值的阈值,您可以尝试如下igraph

library(igraph)

df %>%
  mutate(group = graph_from_adjacency_matrix(as.matrix(dist(Timings)) < 5, "undirected") %>%
    components() %>%
    membership())

它给出了

year Timings group
1  2019       5     1
2  2019       6     1
3  2019       4     1
4  2020       2     1
5  2020       3     1
6  2020       4     1
7  2021      11     2
8  2021      13     2
9  2021      15     2
10 2022      14     2
11 2022      17     2
12 2022      12     2

如果您已经有了群集的数量,例如2,则可以使用kmeans,如下所示

> transform(df, group = as.integer(factor(kmeans(Timings, 2)$cluster)))
   year Timings group
1  2019       5     1
2  2019       6     1
3  2019       4     1
4  2020       2     1
5  2020       3     1
6  2020       4     1
7  2021      11     2
8  2021      13     2
9  2021      15     2
10 2022      14     2
11 2022      17     2
12 2022      12     2
cnh2zyt3

cnh2zyt33#

1)最大绝对差假设每年具有相同数量的行,且顺序一致,我们可以计算每对年份中时间之间的最大绝对差,然后对结果进行排序。m是每年具有一列的矩阵,out是每对年份的最大绝对差的向量。outDF表示out为一个数据框,从outDF和柱状图中我们可以看到,2019/2020和2021/2022比其他两个数据对距离更近。

maxabs <- function(ix, i = ix[1], j = ix[2]) max(abs(m[, i] - m[, j]))

m <- do.call("cbind", with(gfg_data, split(Timings, year)))
out <- combn(colnames(m), 2, maxabs)
names(out) <- combn(colnames(m), 2, paste, collapse = ":")
outDF <- stack(sort(out))[2:1]
outDF
##         ind values
## 1 2019:2020      3
## 2 2021:2022      4
## 3 2019:2021     11
## 4 2019:2022     11
## 5 2020:2021     11
## 6 2020:2022     14

with(outDF, barplot(values, names = ind))

2)multcomp另一种可能性是使用multcomp对组平均值执行多重比较显著性检验。带有年份和字母的数据框显示2019年和2020年没有显著差异,2021年和2022年也没有显著差异。末尾的图显示每年的箱形图,并且显著性分组字母位于顶部。

library(multcomp)

mdl <- lm(Timings ~ year, transform(gfg_data, year = factor(year)))
comp <- glht(mdl, mcp(year = "Tukey"))
CLD <- cld(comp)
stack(CLD$mcletters$monospacedLetters)[2:1]
##    ind values
## 1 2019     a 
## 2 2020     a 
## 3 2021      b
## 4 2022      b

plot(CLD)

3)emmeans使用emmeans,我们可以为每对均值差创建一个置信区间图,这样区间过零的那些对中的年份就没有显著差异。mdl来自上面。

library(emmeans)
p <- pairs(emmeans(mdl, "year"), adjust = "tukey")
plot(p)

相关问题