首页 > 解决方案 > 使用嵌套的 for 循环填充距离矩阵

问题描述

我在使用数据(“蝴蝶”)集时遇到问题。问题是:

问题4:安装包“ade4”,后跟data(butterfly)。我们的问题是:“遗传相似性是否与蝴蝶群落之间的地理距离相关?” 使用我们称为 d1 的距离度量填充遗传距离矩阵。执行 Mantel 随机化测试并解释结果。使用距离 d2 的测量值重复测试。有什么不同吗?显示您的 for 循环代码作为答案的一部分,以及 Mantel 随机化测试中的散点图和随机化图。

这是用于计算相异性的函数。我不明白如何

dissimilarity <- function(p1, p2){
d1 <- sum( abs(p1 - p2) / 2 )
d2_num <- sum(p1*p2)
d2_denom <- sqrt( sum(p1^2) * sum(p2^2) )
d2 <- 1 - d2_num / d2_denom
return(list(d1=d1, d2=d2))
}

这是我用来设置遗传距离矩阵的代码。

library(ade4)
data("butterfly")

butterflydat<-data.frame(butterfly)
plot(butterfly$contour[,1:2], pch=16, cex=.4)
polygon(butterfly$contour[,1:2], lty=2)
points(butterfly$xy, pch=7)
nrow(butterfly$xy)
text(butterfly$xy, labels=1:16, pos=2, cex=.8)
apply(butterfly$genet,1,sum)
(Ddist <- dist(butterfly$xy))

我能够计算两个地理距离之间的差异(例如):

dissimilarity(butterfly$genet[1,],butterfly$genet[2,])$d2

但我不明白如何应用 for 循环来填充所有地理距离的矩阵。我也不了解 Mantel 随机化测试。问题是暗示我们对每个矩阵执行 Mantel 随机化测试,但该测试不比较两个矩阵(即 d1 和 d2)之间的相关性吗?

任何帮助将不胜感激,我是统计和 R 的新手。

标签: rfor-loopmatrixdistancedistance-matrix

解决方案


for您可以使用双循环或双循环计算相异矩阵apply

fun_d2 <- function(x, y) dissimilarity(x, y)$d2

apply(butterfly$genet, 1, function(x)
  apply(butterfly$genet, 1, function(y) fun_d2(x, y)))

fun_d2需要定义该函数,因为您的函数dissimilarity返回一个包含两个成员的列表。


推荐阅读