楼主: 15182952842
2419 11

[问答] 计算数据组之间的马氏距离 [推广有奖]

  • 1关注
  • 1粉丝

本科生

14%

还不是VIP/贵宾

-

威望
0
论坛币
20 个
通用积分
44.6334
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
429 点
帖子
29
精华
0
在线时间
88 小时
注册时间
2020-9-24
最后登录
2025-11-17

楼主
15182952842 发表于 2021-11-6 15:42:22 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
想通r计算数据组之间的马氏距离矩阵。数据结构为:数据分为7个组,每个组包含多条数据(附件上传)。想求得7个数据组之间的马氏距离矩阵。请大神们指教。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:马氏距离 距离矩阵 数据结构

回帖推荐

llb_321 发表于2楼  查看完整内容

看了下你的数据,各组的样本数不同,而且你是要计算各组之间的马氏距离,因此不能用stats包的mahalanobis()函数直接做。 针对你的示例数据写了个粗糙的代码,你可以参考下,没做注释,如果实际数据不同,你自己改一下代码中的几个数字即可。 **** 本内容被作者隐藏 ****

本帖被以下文库推荐

沙发
llb_321 在职认证  发表于 2021-11-7 00:23:54
看了下你的数据,各组的样本数不同,而且你是要计算各组之间的马氏距离,因此不能用stats包的mahalanobis()函数直接做。

针对你的示例数据写了个粗糙的代码,你可以参考下,没做注释,如果实际数据不同,你自己改一下代码中的几个数字即可。

本帖隐藏的内容

  1. library(dplyr)
  2. library(openxlsx)
  3. df <- read.xlsx("past1106.xlsx", sheet = 1, colNames = T)

  4. #计算各组间的马氏距离
  5. res <- matrix(0, 7, 7)
  6. for (i in 1:7) {
  7.   for (j in 1:7) {
  8.     if (i == j) {
  9.       res[i, j] = 0
  10.     }
  11.     else {
  12.       covi <- cov(df[which(df[, 1] == i), 2:5])
  13.       covj <- cov(df[which(df[, 1] == j), 2:5])
  14.       dimi <- dim(df[which(df[, 1] == i), 2:5])[1]
  15.       dimj <- dim(df[which(df[, 1] == j), 2:5])[1]
  16.       meani <- colMeans(df[which(df[, 1] == i), 2:5])
  17.       meanj <- colMeans(df[which(df[, 1] == j), 2:5])
  18.       pooled <-
  19.         dimi / (dimi + dimj) * covi + dimj / (dimi + dimj) * covj
  20.       res[i, j] <-
  21.         sqrt(t(matrix((meani - meanj), 4)) %*% solve(pooled) %*% matrix((meani - meanj), 4))
  22.     }
  23.   }
  24. }
复制代码

藤椅
wenwenbang 发表于 2021-11-7 09:45:38

板凳
15182952842 发表于 2021-11-7 17:47:11
llb_321 发表于 2021-11-7 00:23
看了下你的数据,各组的样本数不同,而且你是要计算各组之间的马氏距离,因此不能用stats包的mahalanobis( ...
非常感谢您的指点,我试试看。

报纸
15182952842 发表于 2021-11-7 21:04:47
llb_321 发表于 2021-11-7 00:23
看了下你的数据,各组的样本数不同,而且你是要计算各组之间的马氏距离,因此不能用stats包的mahalanobis( ...
老师,非常感谢您耐心的解答。我算组间的马氏距离是为了构建组间的NJ树。通过组间的马氏距离计算,得到一个距离矩阵。通过这个距离矩阵我构建了NJ树,但我发现构树还需要进行bootstrap检验。我用一个距离矩阵构建的树可以进行bootstrap检验吗?请您指点。

地板
s609078902 发表于 2021-11-8 08:39:04
先谢楼主分享

7
s609078902 发表于 2021-11-8 08:45:25
你是想分别求每组的t四个变量之间的马氏距离,还是想求不同组对应变量间的马氏距离

8
15182952842 发表于 2021-11-8 10:52:44
s609078902 发表于 2021-11-8 08:45
你是想分别求每组的t四个变量之间的马氏距离,还是想求不同组对应变量间的马氏距离
感谢您的回复,我本来是想求不同组对应变量之间的马氏距离,然后通过这个马氏距离构建距离矩阵,再构建组间的NJ树(数有7个分支),现在是可以构建组间对应变量之间的马氏距离。但再构建NJ树的时候没办法设置bootstrap检验。请问是不是我的距离矩阵构建错了?

9
15182952842 发表于 2021-11-8 10:56:50
s609078902 发表于 2021-11-8 08:45
你是想分别求每组的t四个变量之间的马氏距离,还是想求不同组对应变量间的马氏距离
网上又给了我一个术语,说我这个操作叫“分组聚类”,就是想通过马氏距离构树看看组间的相似关系。请您指教。

10
llb_321 在职认证  发表于 2021-11-8 11:05:09
15182952842 发表于 2021-11-7 21:04
老师,非常感谢您耐心的解答。我算组间的马氏距离是为了构建组间的NJ树。通过组间的马氏距离计算,得到一 ...
越来越专业了
请不要称呼我为老师,愧不敢当。同学而已,交流而已。
那个代码是匆忙中弄的,如果你是练习的话倒是无所谓,如果你要做研究写论文,最好手工计算一下其中两个组的马氏距离,验证一下那个代码是否准确。
我的理解啊,你用组间距离构建的NJ树,是完整的树,但这棵树不一定是实际的树,所以需要进行bootstrap检验。简单的说,就是抽样,建树,再抽样,再建树,不断验证。这个我只知其然,不知其所以然,也没有用过。还是请专业的师友为您解答才好。
但是我觉得,可能的方案是,在各组中“分层抽样”,然后用抽样数据重新计算组间距离,构建新的NJ树,检验。如果过程是这样的话,那么bootstrap检验与用组间距离构建NJ树是不矛盾的。至于有没有成型的包来做,您再查查资料,或者问下导师吧。
祝顺。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-2 20:21