使用R语言emdist包计算不同样本量分布的EMD问题
问题分析与解决方案
报错原因:对emdist包输入格式的误解
你遇到的A and B must be matrices of the same dimensions报错,核心是emd2d函数的设计目标是处理同维度的直方图数据,而非直接处理不同数量的离散观测点。它要求两个输入矩阵的行、列数完全一致,每个矩阵元素对应二维空间中一个bin的质量,而非你构造的“观测值+权重”的结构。
emdist包各函数的正确用法
emdist包的几个EMD函数适用场景不同,针对你的需求(不同数量的一维离散点),正确的函数是emdr,而非emd2d或emd:
emd:用于一维直方图,要求输入两个长度相同的向量(对应每个bin的质量)。emd2d:用于二维直方图,要求两个同维度矩阵。emdr:专门用于不同数量的离散点集的EMD计算,需要分别传入点坐标、点对应的质量(权重)。
针对你的需求的正确代码
你的核心需求是计算sample和sample2中variable列的EMD,且权重可忽略(每个点质量相同),以下是正确实现:
library(emdist) # 提取需要计算的变量列 sample_var <- sample[, "variable"] sample2_var <- sample2[, "variable"] # 构造权重:每个点质量相同,归一化到总和为1(也可以用rep(1, n),EMD会自动处理) wx <- rep(1 / length(sample_var), length(sample_var)) wy <- rep(1 / length(sample2_var), length(sample2_var)) # 用emdr计算一维离散点的EMD emd_result <- emdr(x = sample_var, wx = wx, y = sample2_var, wy = wy, dist = "manhattan") print(emd_result)
代码说明
x和y分别传入两个分布的观测点向量(一维)。wx和wy是对应点的质量权重,这里设置为均匀分布(每个点占比相同),如果不需要归一化,直接用wx = rep(1, length(sample_var))也可以,EMD会自动处理两个分布质量总和的差异。dist参数指定点之间的距离度量,这里用曼哈顿距离,你也可以根据需求改为"euclidean"等。
为什么之前用emd/emdr返回0?
你之前错误地将“观测值+权重”的矩阵直接传入emd或emdr,导致函数无法正确解析点坐标和权重,从而计算出错误的0值。只有当输入格式完全符合函数要求时,才能得到正确结果。
替代方案:使用transport包(可选)
如果你觉得emdist包的参数设计不够直观,可以尝试transport包,它的emd函数更直接支持离散点的EMD计算:
library(transport) emd_result <- emd(a = sample_var, b = sample2_var) print(emd_result)
这个函数会默认将每个点的质量设为1,自动计算两个离散分布的EMD。
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

