在R中基于重复观测距离矩阵还原类别变量交叉维度距离矩阵的方法问询
在R中基于重复观测距离矩阵还原类别变量交叉维度距离矩阵的方法问询
嘿,我完全理解你的需求了——你手上只有基于重复个体的距离矩阵dist2,想要还原出对应类别变量交叉组合的距离矩阵dist对吧?其实这个问题的核心是把个体层面的距离聚合到类别组合层面,而且因为你的原始数据是类别变量,同一组合内的个体距离都是0,不同组合的个体距离完全一致,所以解决起来挺直接的。
核心思路
- 识别分组:因为同一类别组合下的所有个体两两之间的Gower距离都是0,所以我们可以通过
dist2找出所有距离为0的个体集群,每个集群对应一个类别交叉组合。 - 聚合距离:对每一对不同的集群,取任意一个集群内个体和另一个集群内个体的距离,作为这两个类别组合之间的距离(因为同一对集群的所有个体对距离都相同)。
具体实现代码
第一步:从dist2中识别类别组合分组
首先把距离矩阵转成普通矩阵,然后通过聚类或者连通分量分析找出分组:
library(cluster) # 把dist2转换成矩阵 mat_dist2 <- as.matrix(dist2) # 方法1:用层次聚类找分组(距离为0的聚为一类) hc <- hclust(dist2, method = "single") groups <- cutree(hc, h = 0) # 阈值设为0,把距离为0的观测归为一组 # 方法2:用igraph找连通分量(如果安装了igraph包) # library(igraph) # sim_mat <- 1 - (mat_dist2 > 0) # 距离0对应相似性1,其他为0 # groups <- components(graph_from_adjacency_matrix(sim_mat, mode = "undirected"))$membership
第二步:构建类别组合层面的距离矩阵
接下来我们基于分组结果,生成目标距离矩阵:
# 获取唯一的分组(对应不同的类别交叉组合) unique_groups <- unique(groups) n_groups <- length(unique_groups) # 初始化结果矩阵 dist_result <- matrix(0, nrow = n_groups, ncol = n_groups) # 如果后续有对应类别组合的名称,可以替换这里的行/列名 rownames(dist_result) <- unique_groups colnames(dist_result) <- unique_groups # 填充矩阵:取每组的第一个观测来计算组间距离 for (i in seq_along(unique_groups)) { for (j in seq_along(unique_groups)) { # 找到第i组和第j组的第一个观测索引 obs_i <- which(groups == unique_groups[i])[1] obs_j <- which(groups == unique_groups[j])[1] dist_result[i, j] <- mat_dist2[obs_i, obs_j] } } # 转换成dist对象(和你例子中的dist格式一致) dist_final <- as.dist(dist_result)
验证(用你的例子测试)
把这段代码放到你提供的示例代码后面,你会发现dist_final和dist完全一致——因为groups会自动识别出9个类别组合,每个组合的大小对应y的取值,组间距离就是原始的Gower距离。
额外说明
如果你提前知道每个观测对应的类别组合(比如有一个分组变量标记每个个体属于哪个(a,b)组合),那可以直接用这个变量代替通过dist2识别的groups,这样结果会更准确,也省去了聚类的步骤。
备注:内容来源于stack exchange,提问作者Bibi
相关产品推荐
相关产品推荐

