【发布时间】:2017-07-27 23:48:13
【问题描述】:
我正在寻找找到行子集的可能性(一个子集应包含 6 行),其中多列的值均值最相似。所以,我希望 R 搜索我的 data.frame 并创建每个 6 行的子集,以便最终这些子集彼此最相似。相似度可以用欧几里得距离来衡量(正如@David Robinson 所指出的那样)。
我的数据是这样的:
TID Cue1 Cue2 Cue3
1 2.06 1.90 3.82
2 5.18 4.13 5.10
3 5.09 2.85 2.80
4 1.93 4.14 4.75
... ... ... ...
我现在想知道 R 中是否有一种方法,我发现以下内容:
-给我例如4 个子集,每个子集包含 6 行,其中 4 个子集在 Cue1、Cue2 和 Cue3 均值(SD 不重要)中最可能相似,而 每个子集包含唯一的行(子集之间没有重复的行)。
一个例子是(与我的例子中的数据不匹配):
-子集 1 包含 TID 1、TID 6、TID 14、TID 28、TID 39、TID 50,并且该子集具有提示均值(Cue1 = 3,2;Cue2 = 2, 5; 提示 3 = 4)
-子集 2 包含 TID 3、TID 12、TID 20、TID 40、TID 54、TID 59,并且该子集具有提示均值(Cue1 = 3,3;Cue2 = 2, 6;Cue3 = 4,1)。
因此这两个子集在提示手段上非常(最)相似。 R 现在应该将构成子集的行号(或 TID 值)命名为我。
在 R 中是否有可能做到这一点?
以下是我的数据外观的可重现示例:
mysamp <- function(n, m, s, lwr, upr, nnorm) {
set.seed(1)
samp <- rnorm(nnorm, m, s)
samp <- samp[samp >= lwr & samp <= upr]
if (length(samp) >= n) {
return(sample(samp, n))
}
}
Cue1 <- mysamp(n=60, m=3, s=1.5, lwr=1, upr=6, nnorm=1000)
Cue2 <- mysamp(n=60, m=3, s=2.5, lwr=1, upr=6, nnorm=1000)
Cue3 <- mysamp(n=60, m=4, s=1.5, lwr=1, upr=6, nnorm=1000)
df <- data.frame(TID= 1:60, Cue1= Cue1, Cue2= Cue2, Cue3= Cue3)
【问题讨论】:
-
1.应该使用什么指标来量化行之间的相似性?例如,试图最小化成对(1-2、1-3、1-4、2-3 等)欧几里得距离(平方和的平方)是否合理? 2. 子集可以重叠吗? 3. 您需要一个可证明的全局最优解决方案,还是需要一个“相当不错”的解决方案?
-
例如下面的聚类方式:
distances <- dist(df[, -1]); h <- hclust(distances); plot(h);让您非常接近找到相似行的组。您需要更多的算法工作来提取特定大小的组 -
感谢您的第一个想法!我仍然很难将它应用于我的问题,因为每个子集有 6 个案例的特定大小。您知道如何提取特定大小的组吗?由于我需要使用更大的数据框来执行此操作,因此我希望找到一种自动计算子集的方法。我需要找到每个 6 行的 12 个子集,其中一行只能用于一个子集。我不需要最佳解决方案,一个很好的解决方案就可以完美地工作!而且欧几里得距离是完全合理的,是的!
标签: r subset cluster-analysis similarity balance