You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

问题原因

  1. 非数值列干扰:data_by_country矩阵包含字符型的name列,dist()函数仅能处理数值型数据,尝试将字符列强制转换为数值时会生成NA,触发警告。
  2. 行名未设置:转换为矩阵时未将国家名称设为行名,导致距离矩阵丢失标签信息。

解决步骤

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:35:49