使用Minkowski方法时dist()生成距离矩阵的NA警告与名称缺失问题
R语言Minkowski层次聚类问题分析与解决
问题描述
运行代码生成data_by_country矩阵(包含国家名称和HICP均值)后,执行dist()函数生成Minkowski距离矩阵时出现以下警告:
Warning message:
In dist(data_by_country, p = 1.5, method = "minkowski") :
NAs introduced by coercion
同时生成的距离矩阵仅显示数值,无国家名称作为行列标签。
data_by_country前6行数据示例:
name HICP 1 Austria 2.102952 2 Belgium 2.232472 3 Bulgaria 4.036531 4 Croatia 2.410332 5 Cyprus 1.833579 6 Czechia 2.621033
问题原因
- 非数值列干扰:
data_by_country矩阵包含字符型的name列,dist()函数仅能处理数值型数据,尝试将字符列强制转换为数值时会生成NA,触发警告。 - 行名未设置:转换为矩阵时未将国家名称设为行名,导致距离矩阵丢失标签信息。
解决步骤
1. 修正data_by_country的生成逻辑
保留数值列的同时,将国家名称设为矩阵行名(仅使用dplyr和base R):
data_by_country <- data %>% group_by(name) %>% summarize(HICP = mean(values)) %>% ungroup() # 将name列设为行名 rownames(data_by_country) <- data_by_country$name # 移除name列,仅保留数值型的HICP列并转为矩阵 data_by_country <- data_by_country %>% select(-name) %>% as.matrix()
2. 重新生成距离矩阵
此时再执行dist()函数,不会出现警告,且距离矩阵会自带国家名称标签:
distance_matrix <- dist(data_by_country, p = 1.5, method = "minkowski")
关于聚类图的确认
当前仅基于HICP均值计算距离,若目标聚类图是基于HICP时间序列特征的层次聚类,当前做法的特征维度不足,需调整特征选择:
基于时间序列的聚类修正
将每个国家的所有时间点HICP值作为特征(仅使用dplyr和base R):
# 转换为宽格式:每行一个国家,每列一个时间点的HICP值 data_wide <- reshape(data[, c("name", "time", "values")], idvar = "name", timevar = "time", direction = "wide") # 设置行名为国家名称 rownames(data_wide) <- data_wide$name # 移除name列,保留数值列并转为矩阵 data_wide <- data_wide[, -1] %>% as.matrix() # 生成距离矩阵并聚类 distance_matrix <- dist(data_wide, p = 1.5, method = "minkowski") cluster_result <- hclust(distance_matrix) # 可根据需求选择聚类方法,如"ward.D2" # 绘制聚类树图 plot(cluster_result, main = "欧盟国家HICP时间序列层次聚类树图")
若目标图确实仅基于HICP均值聚类,那么在修正距离矩阵后,执行hclust()并绘图即可得到对应结果。
内容的提问来源于stack exchange,提问作者niksok11
相关产品推荐
相关产品推荐

